Конкретизирую:
Andrey 08.11.2014 19:53
Не хватает возможности, уметь прятать переменные/(а хорошо бы еще и методы) от прямого доступа через объект.
Но(!) чтобы при этом эти переменные и методы были доступны другим методам внутри этого объекта.
Абстрактный пример:
[code]
@CLASS
myclass
@OPTIONS
# гипотетический режим, при котором например всё, что через $self.var
# открытая переменная/поле, остальные видны всем методам объекта,
# но неснаружи через обращение к объекту.
# Если при этом нужны строго локальные в рамках метода,
# то просто добавим отдельно у такого метода @method[][locals]
class_locals
hidden_methods
@create[]
$workdir[system]
$sysfile[^file::load[sysfile.dat]]
$self.user[root]
@GET_sysmode[]
^if($workdir eq 'system' && def $sysfile){
$result[admin]
}{
$result[normal]
}
@change_mode[mode]
^switch[mode]{
^case[admin]{$workdir[system] ^_sysquirk[system] }
^case[normal{$workdir[home/$self.user] ^_sysquirk[normal] }
}
# фишка №2 - гипотетически скрытый метод, к
# доступный только методам внутри класса, но не обращением из внешнего контекста
@_sysquirk[mode]
^if($mode eq 'system'){
^do_something_stricted[$vars]
}{
^do_else_stricted[$vars2]
}
#--------- MAIN -------------
@main[]
$myobj[^myclass::create[]]
# далее, такое обращение в нашей хотелке либо ничего не вернет,
# либо ошибку если $STRICT-VARS(true),
# т.к. она изолирована режимом class_locals
$myobj.workdir
# таким образом, напрямую записать и что-то испортить/сломать, не зная архитектуру класса - не выйдет
$myobj.workdir[bootdir]
# однако вы можете попросить у безопасного метода
$myobj.changemode[admin]
# или можете прочитать безопасное свойство
$myobj.usermode
# такое обращение к полю, вернёт - root, т.к. она явна "расшарена" инициализацией $self.user
$myobj.user
# этот метод нельзя вызвать напрямую, т.к. он умышленно изолирован через hidden_methods
^myobj._sysquirk[myvars]
[code]
Ну вот как-то так хотелось бы.
- Не получается изолировать поля/перменные, чтобы был доступ только через свойства объекта но не напрямую. Получается либо-либо., AndySobb 07.11.2014 18:21
- Ответ, MoKo 07.11.2014 21:07
- А это вообще отвал башки => $myobj[^myclass::create[$myhash] $.property1[value1] ..., Andrey 08.11.2014 00:37
- Ответ, MoKo 08.11.2014 14:36
- Но вообще по ощущению не хватает именно локальных переменных в рамках класса/объекта но доступного между методами и обработчиками свойств. Есть ли весомые основания для их отсутствия. Добавить к @OPTIONS class_locals напримэр (-), AndySobb 08.11.2014 00:01
- Ответ, MoKo 08.11.2014 14:58
- Конкретизирую:, Andrey 08.11.2014 19:53
- Вообще конкретно это не критично, это все в рамках изучения тонкостей, проще просто отбить служебные переменные каким-то символом, чтобы не зацепить (-), AndySobb 07.11.2014 23:57
- $caller уже попробовал - мне понравилось :) можно делать интересные рекурсии. (-), AndySobb 07.11.2014 23:49
- Не совсем понял обход с ^reflection:uid[$self] - можно на примере?, AndySobb 07.11.2014 23:44