[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сеттеры.
twin
Ребят, ООПэшники. Расскажите несведущему, где оправдано применение магического метода __set

До меня нифига не доходит. Только не трудитесь объяснять как он работает и для чего он нужен. Это я знаю. Мне нужна ситуация, где он действительно на своем месте, то есть используется рационально.



Спустя 33 минуты, 59 секунд (1.10.2012 - 09:12) sharki написал(а):
twin
Ну например для БД, если ты захотел намутить актив рекорд паттерн для БД, или архитектуры приложения. Там например удобно создавать динамически поля, а потом их перебирать и строить какую нибудь штукенцию. И вот когда вызывается этот магический метод, там можно фиксировать состояние приложения, например ты добавил поле "окно", и тут сеттер понимает, что твое окно принадлежит другому экземпляру классу, и надо что-то сделать с этим классом, может получить доп данные по классу, и присвоить какие то состояния.

Спустя 4 минуты, 29 секунд (1.10.2012 - 09:16) twin написал(а):
Ну это не рационально. ИМХО. Начиная с этого места:
Цитата
если ты захотел намутить актив рекорд паттерн для БД

А вот про окно нифига не понял. Примерчик кода небольшенький мог бы написать?

Спустя 12 минут, 33 секунды (1.10.2012 - 09:29) sharki написал(а):
Цитата
Ну это не рационально

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

$bla->myTask = new BlaTaskFromWork("Новая задача");

и больше ничего делать не надо, а BlaTaskFromWork наследуется от единого интерфейса, где описаны такие методы типа getInfo(), getUserInfo(), getDate() и т.д...и реализация твоего магического метода

.... __set($name,$value){
$this->collectionTask->add($value->getInfo(),$value->getDate());
}

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

Цитата
Примерчик кода небольшенький мог бы написать

Ну вот же на википедии есть, а так смысл ясен из этих строк

part = new Part()
part.name = "Sample part"
part.price = 123.45
part.save()


Есть у нас описание таблиц БД, например есть класс таблица part, ты её описываешь классом (модель данных) Part, в нем поля и бла бла все нужные для удобной работы с таблицей. В итоге что мы имеем, берем создаем родительский класс например DataDb в нем есть несколько методов, например save, delete и т.д... Потом когда мы присваиваем новые поля или что еще хуже, при вызове метода save, метод перебирает все функции, св-ва и другое, и делает какую то логику, сохраняет в БД например, очень удобно. Глянь в сторону Doctrine

Спустя 49 минут, 12 секунд (1.10.2012 - 10:18) twin написал(а):
Спорить действительно не нужно))) Во-первых я написал ИМХО, а во вторых конструктор на боевом сайте... Какая же это рационализация. Конструктор хорош для конструирования. На то он и. А для работы лучше использовать обкатанную модель, где нет ничего лишнего.

За разъяснение большое спасибо. Только к сожалению я не этого хотел(((

Я имел ввиду вот что. Есть цикл do...while Он используется крайне редко, хотя Попов его умудрился засунуть в каждый свой сайт по нескольку раз. Однако есть такие моменты, где без этого цикла действительно сложно. Допустим преобразование целого числа в строковую запись. Там он на своем месте.

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

Спустя 7 минут, 2 секунды (1.10.2012 - 10:25) sharki написал(а):
Ну раз такое дело, то думаю вообще стоит забыть про это, т.к если сразу не видно зачем он нужен, то и не нужен вовсе. Вдруг в будущем мысль озарит, и применишь сеттер)

Спустя 10 минут, 25 секунд (1.10.2012 - 10:36) TMake написал(а):
twin
С моей точки зрения он уместен в базовом классе приложения, например для переопределения конфиг значения.
А вообще в доках где то видел, что бы жесткой привязки к свойствам классе не производилось ввели сеттеры, таким образом при необходимости мы можем изменить значение свойства и изменить сеттер под новую структуру класса и надобность изменять другие классы под измененный класс отпадает.

Спустя 9 минут, 30 секунд (1.10.2012 - 10:45) twin написал(а):
sharki
В том и дело... Вот столкнулся я в одном месте с такой штукой (упрощенно):
    public function __set($name, $value)  
{
if(in_array($name, $this->properties))
$this->$name = $value;
else
exit('property '. $name .' is not defined');
}
Ну ясно, инкапсуляция. Не дать сунуть в объект лишнее свойство. Фильтр вроде как. Благое намерение, но только если не доверяешь разработчику. Это не рационально.

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

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

stepan
Цитата
А вообще в доках где то видел, что бы жесткой привязки к свойствам классе не производилось ввели сеттеры, таким образом при необходимости мы можем изменить значение свойства и изменить сеттер под новую структуру класса и надобность изменять другие классы под измененный класс отпадает.
Переопределить свойства можно и без сеттера, на сколько мне известно. Тут дело в другом. Тут нужно такое действие в сеттере, до определения свойства, что бы при попытке обратиться к несуществующему свойству, что-либо произошло.

Чую, что есть простой пример, не могу придумать.

Спустя 10 минут, 29 секунд (1.10.2012 - 10:56) TMake написал(а):
Цитата (twin @ 1.10.2012 - 11:45)
Переопределить свойства можно и без сеттера, на сколько мне известно.

Это если оно public, я же имел введу private или protected

Цитата (twin @ 1.10.2012 - 11:45)
при попытке обратиться к несуществующему свойству, что-либо произошло.

Это еще одна из возможностей

Спустя 9 минут, 55 секунд (1.10.2012 - 11:06) twin написал(а):
stepan
Цитата
Это если оно public, я же имел введу private или protected

На кой его делать приватным, а потом изменять извратным способом... Опять нерационально.
Цитата
Это еще одна из возможностей
Да! Вот только какая конкретно, я и интересуюсь...

Спустя 32 минуты, 46 секунд (1.10.2012 - 11:38) TMake написал(а):
Цитата (twin @ 1.10.2012 - 12:06)
На кой его делать приватным, а потом изменять извратным способом

Задумка доступа была ведь не спроста введена - каждому программисту дает возможность вводить свои правила в определенные классы.
А по поводу сеттера более похожи на мини кастыль который позволяет обойти излишество в исправлениях.
Цитата (twin @ 1.10.2012 - 12:06)
Да! Вот только какая конкретно, я и интересуюсь...

Не мне тебе это рассказывать, но каждый сам себе творец wink.gif

Спустя 2 часа, 3 минуты, 26 секунд (1.10.2012 - 13:42) Guest написал(а):
Если объект имеет динамическую структуру, то есть изменяемое число свойств , при чём в разных контекстах разное число (пример тому динамический массив, но объект требует в себе какие то валидации этих свойств, алгоритмы преобразований, тогда рационально и оправданно использовать объект, а не массив).
Пример тому может быть динамический объект транзакции или ещё лучше динамический объект трансфера данных (Data Transfer Object) между какими то "слоями" в программе. Например между слоем представления->слой бизнес логики->слой БД->шлюз БД (сама запись в БД). На каждом уровне добавляется свои свойства и в определённых условиях разный набор. Это конечно не особенно читаемо, но удобно когда нужен "сквозной" объект данных.
Но лучше всего это удобство видно в объекте передачи данных по сети, при чём стандартизируются обе стороны. Слой представления->слой бизнес логики->слой БД-> и передача в компонент по отправке данных на удалённый узел. Возможно Вы скажете что по сети лучше передавать строковые данные (это конечно спорный вопрос), но никто не мешает преобразовывать объект в строку smile.gif
То есть в результате мы имеем перемещаемый контекст данных, при чём с динамической структурой. Писать bean методы для всех знаемых и не знаемых свойств нет нужды в этом.
Хорошо реализован в RUBY такой доступ.

Спустя 1 минута, 59 секунд (1.10.2012 - 13:44) Guest написал(а):
А ведь объекты могут иметь довольно внушительный объём информации в себе. И для каждого свойства писать bean метод будет ужасом smile.gif
Кстати такие объекты могут храниться как кэши в ОП, при чём с динамикой изменения.

Спустя 5 минут, 26 секунд (1.10.2012 - 13:49) Guest написал(а):
Цитата
Возможно Вы скажете что по сети лучше передавать строковые данные (это конечно спорный вопрос), но никто не мешает преобразовывать объект в строку

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


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

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

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

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

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