[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Магия и инкапсуляция
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Гость_Alan
twin
просто утверждает, что читаемость и воспринимаемость кода полностью исчезает.
Гость_Alan
Особенно когда в сеттер зашита бизнес логика. Это конечно уже ужас, если так оно делается.
Если свойство участвует в какой то бизнес логике, обязательно выводить в отдельный интерфейс.
twin
Цитата (Гость_Alan @ 13.10.2013 - 11:25)
twin
просто утверждает, что читаемость и воспринимаемость кода полностью исчезает.

Бльше того. Я считаю это нарушением принципа инкапсуляции. Ну или на грани того, что тоже очень плохо. Именно то, что есть возможность обратиться к (как мы выяснили) одноименному с приватным виртуальным свойством без видимых последствий. Вот допустим так:

class Example
{

private $a = 1;

function __get($a){}
}


$o = new Example();

echo $o->a;
Где дебаггинг???

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Guest
Цитата (OleKh @ 13.10.2013 - 15:08)
Цитата (MiksIr @ 13.10.2013 - 12:52)
У вас нет возможности обратится к private свойству извне. Никак.

Пример из учебника

class Person {
private $Age = 'Bob';
function __get( $property ) {
$method = "get{$property}";
if ( method_exists( $this, $method ) ) {
return $this->$method();
}
}


function getAge() {
return $this->Age;
}
}


$p = new Person();[
print $p->Age;

Да я понимаю что вас смущает. Но тут нет обращения к приватному свойству. Тут есть вызов метода __get произведенный посредством синтаксического сахара. Путает - возможно, нарушает инкапсуляцию - нет.
Гость_Alan
Нарушает.
Это потенциальная возможность изменить свойство из вне, при чём оно используется ТОЛЬКО внутренними методами и инкапсулирует ошибку изменения внутри класса/объекта. А здесь хлоп, и кто изменил. Искать можно долго.
twin
А вот вообще это как объяснить?
class Example
{

private $a = 1;

function __get($a){}
}


$o = new Example();

var_dump($o->a);// NULL
На этом можно и логику построить. Ошибочную. Ведь наличие кривого магического метода убивает вообще все представления о доступах. Оказывается есть такое свойство, содержит NULL. И доказывайте потом, что оно виртуальное и сахарное.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
OleKh
http://pro-cosmos.blogspot.com/2011/02/php...rseptors-header

Цитата
Такое поведение в других языках, например Java и С++, называется перегрузкой свойств и
методов (overloading). Но в PHP перегрузка свойств и методов отличается от перегрузки в Java
и С++. Применительно к PHP это поведение лучше охарактеризовать как перехват
(interception).



Цитата (Guest @ 13.10.2013 - 13:39)
Но тут нет обращения к приватному свойству.

вот тут обращение к свойству
$p->Age;
Гость_Alan
twin
Цитата
Оказывается есть такое свойство, содержит NULL.


Во всех языках принято что NULL сопутствие переменной или свойства, но не значения.
NULL это не значение.
Guest
Гость_Alan, не путай его. Null у него вышел т.к. в __get нет оператора return.
Надо нормальную магию писать и все тогда получится.
glock18
Цитата (twin @ 13.10.2013 - 11:21)
Это не логично и тут меня ни кто не переубедит.

Тебя в принципе никому не переубедить. Ни тут, ни где-то еще.
twin
Цитата (Гость_Alan @ 13.10.2013 - 12:07)
Во всех языках принято что NULL сопутствие переменной или свойства, но не значения.
NULL это не значение.

Да ладно))). А так:
class Example
{
private $a = 1;

function __get($a){}
}


$o = new Example();
$b = $o->a;
echo $b;
Где нотис? Значение и есть. Переменная определена, хоть и пустая. Стоит дальше построить логику на основе empty() и пипец, поехали.

Сразу говорю, это конечно херня, но херня возможная. А значит плохо это.

glock18
Цитата
Тебя в принципе никому не переубедить. Ни тут, ни где-то еще.

Не утрируй. Тот же MiksIr прошлый раз убедил во многом. Это трудно, но вполне возможно, если у меня не останется аргументов. Потому что хочется знать абсолютную истину. Пока не убедительно.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Guest
Причём тут механизмы, здесь ситуация возможного не подконтрольного открытого изменения.
Цитата
Это потенциальная возможность изменить свойство из вне, при чём оно используется ТОЛЬКО внутренними методами и инкапсулирует ошибку изменения внутри класса/объекта. А здесь хлоп, и кто изменил. Искать можно долго.


Никто не запрещает использовать, но нужно знать такие вещи. Смысл в том что это потенциальная лазейка для горе - программиста.
twin
Во как отчитал, как пацана.

Цитата
Далее, на пальцах про магию.

Да не надо на пальцах. Уже на протяжении нескольких страниц я с вами соглашаюсь и механизм давно понятен. Чего толочь в ступе одно и то же. Я говорю не о том, что это работает иначе. Я говорю, что это работает неправильно. С точки зрения логики. Пусть это моё субъективное мнение, но оно логично и я имею право высказывать претензию.

Прогрммировние - точная наука. Это факт. И должна подчиняться точным законам, а не размазанным формулировкам.

Пока я в этом вопросе вижу кучу несоответствий.

1. В интерфейсе мы обращаемся не к свойству класса, а к виртульному свойству интерфейса. Хотя интерпреттор говорит обо обратном. Это не логично. По крайней мере есть противоречие, что не вяжется с точностью науки. Я хочу защитить доступ, а оказывается это не защита, а простая условность.

2. Интерпретатор выдает ошибку, если есть обращение с одноименным приватному виртуальным свойству. Это логично. Но он передает управление макросу, никак не обозначая сие действо. По логике тут должен быть нотис. Пусть работает магия, коль это кому то важно. Но почему это должно путать программиста? Без магии ошибка есть, с магией нет.

3. Если имеется магический сеттер или геттер, я не могу быть уверенным в том, как поведет себя программа, потому что все приватные уровни доступов теряют смысл. Да, я не могу получить к нему прямой доступ. Однако программа может отработать нештатно, если каким то образом произойдет попытка обращения. Причем отловить эту ошибку будет достаточно проблематично (см. п. 2 и примеры выше)

4. Можно сказать, что все зависит от кривизны рук программиста. Однако это вступает в прямое противоречие с самим принципом инкапсуляции, так как она в большей части и выступает в роли защиты от дурака. Здесь тоже нет никакой логики. Сначала пытаемся защтить, потом тут же всю защиту нахрен.

5. Инкапсуляция запрещает доступ к закрытым свойствам. Это простой и ясный закон. Все остальные рассуждения плана "на усмотрение программиста" звучат как "закон как дышло, как повернул, так и вышло". С точки зрения точных наук это нонсенс. И уж точно никакой логики.

Ну и хватит пока, про лазейки писать больше не буду - устал уже.

Да, можно выучить все наизусть. Но вот упрекать меня в том, что я не могу проанализировать - это вы зря. Как раз зубрежку предполагают гуманитарные науки:
Цитата
литературе, философии и прочем наукам работающим с субъективным
Если вы относитесь к программированию, как к предмету зубрежки, а не как к точной науке, подчиняющейя логическим законам, не советуйте хотя бы другим искать другую работу.

Точные науки должны подчиняться точным и ясным законам, а не болтаться как говно в проруби. То приватное, то виртульное, то варнинг на доступ, то нате вам пожалуйста.

Вызубрить не сложно. Но логики это не прибавит. Это конечно мое субъективное мнение, но я не привык верить наслово, принимать все как должное и меня эти нелогичные вещи возмущают. Да, я не могу на это повлиять. Но и вашего восторга от такой вакханалии испытать не могу.

Вы можете пользоваться этмми фичами сколь угодно, но то, что это правильно, говорить не стоит. Это тоже сугубо ваше мнение.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.