Я много где читал, что на все свойства для моделей нужно создавать геттеры и сеттеры. Обосновывали, в основном, это тем что можно будет инкапсулировать логику если нужно в них. Но мой опыт работы с объектным кодом говорит об обратном, а именно сначала уставнови в публичные свойства данные так как они есть, а потом производи с объектом действия.
Может я что-то упускаю, и что где-то не прочёл?
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Это тоже тема для холивара.
Жесткие принципы инкапсуляции вообще не допускают публичных свойств. Только через set/get. Объясняется тем, что публичные свойсвта имеют схожесть с глобальными переменными. И изменять состояние объекта вне объекта моветон.
Но это совсершенные ортодоксы так поступают.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Цитата (twin @ 6.11.2014 - 22:17) |
Жесткие принципы инкапсуляции вообще не допускают публичных свойств. |
то есть вы считаете, что только поэтому, больше причин нет?
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
AlmazDelDiablo
6.11.2014 - 22:40
Свойства без get/set допустимы только в целях оптимизации при работе с большими массивами (а они, как известно, копируются при передачи из метода). Такое случается крайне редко, а посему в отступлении от правил инкапсуляции в такой ситуации ничего очень страшного нет.
В остальных ситуациях удобнее всего работать именно с set/get. В своей работе не раз сталкивался с болью в Yii, где всё работает на публичных свойствах. Происходит изменение в системе, нужно перенести получение значения свойства из класса в другое место и при вызове поля N всегда нужно обращаться в другой класс, а оно без get всегда вызывалось. И тебе приходится по огромному проекту искать все использования или костылить, перегружая __get, что тоже не есть хорошо.
В общем, рекомендация исключительно из опыта работы: используйте get/set везде, где только возможно. Однажды это спасёт вашу жопку от срыва сроков из-за недальновидности вас и/или ваших коллег.
_____________
Блог |
VK |
GitHub |
Twitch
Invis1ble
6.11.2014 - 22:52
все правильно, для инкапсуляции логики
Цитата |
Происходит изменение в системе, нужно перенести получение значения свойства из класса в другое место и при вызове поля N всегда нужно обращаться в другой класс, а оно без get всегда вызывалось. И тебе приходится по огромному проекту искать все использования или костылить, перегружая __get, что тоже не есть хорошо. |
Цитата (chee @ 6.11.2014 - 18:39) |
то есть вы считаете, что только поэтому, больше причин нет? |
Вобщем то и этого достаточно. Слова
AlmazDelDiablo как раз подтверждают.
Даже простое обращение к свойству рекомендуется делать через магию. Хотя в этом точно никакого смысла нет, если только это не Registry. Что поделаешь. Издержки ООП. Везде рамки.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Цитата (AlmazDelDiablo @ 6.11.2014 - 22:40) |
В остальных ситуациях удобнее всего работать именно с set/get. В своей работе не раз сталкивался с болью в Yii, где всё работает на публичных свойствах. Происходит изменение в системе, нужно перенести получение значения свойства из класса в другое место и при вызове поля N всегда нужно обращаться в другой класс, а оно без get всегда вызывалось. |
можете описать как это это было в коде? Я знаю о такой ситуации, но в моей рабочей практике она не случалась. Еще уточняющий вопрос, проект в котором у вас такая ситуация была, на какой стадии был? Создание функционала или поддержка(рефакторинг, доработка фич)?
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
SoMeOnE
7.11.2014 - 00:29
Тоже всегда дума, а почему бы и не использовать публичные свойства. Теперь понятней стало)
AlmazDelDiablo
7.11.2014 - 00:41
Цитата (chee @ 7.11.2014 - 00:02) |
Цитата (AlmazDelDiablo @ 6.11.2014 - 22:40) | В остальных ситуациях удобнее всего работать именно с set/get. В своей работе не раз сталкивался с болью в Yii, где всё работает на публичных свойствах. Происходит изменение в системе, нужно перенести получение значения свойства из класса в другое место и при вызове поля N всегда нужно обращаться в другой класс, а оно без get всегда вызывалось. |
можете описать как это это было в коде? Я знаю о такой ситуации, но в моей рабочей практике она не случалась. Еще уточняющий вопрос, проект в котором у вас такая ситуация была, на какой стадии был? Создание функционала или поддержка(рефакторинг, доработка фич)?
|
Ну, например (образный код):
$className = $settings->moduleN->class;
$anyObject = new $className;
return $anyObject->value;
И вот то самое value вытаскивается из недр БД через магию Yii. А тут вдруг надо переопределить этот value и не тащить его из БД, а подгружать через http-api некоего сервиса (например), для чего в системе выделен отдельный модуль с собственной БД и кэшем. К сожалению, вопрос пришлось решить перегрузкой __get самого фреймворка, а можно было бы просто подменить логику в $anyObject->getValue(). Плюс, так как тут имя классы вытаскивается из переменной, IDE не может отследить это использование класса.
А проект у нас постоянно развивается, рефакторится. меняет технологии под капотом и т.д. Кажется, это называется «стадией поддержки», но больше похоже на бесконечную разработку :) Т.е. не тот проект, что сдаётся заказчику, а когда целая компания работает над одной большой штукой, которая умеет много чего для своих клиентов делать. Типа какого-нибудь «Яндекс.Маркета», где куча народа сидит и пилит день изо дня всё новые и новые фичи.
_____________
Блог |
VK |
GitHub |
Twitch
AllesKlar
7.11.2014 - 00:57
Цитата (AlmazDelDiablo @ 7.11.2014 - 00:41) |
А проект у нас постоянно развивается, рефакторится. меняет технологии под капотом и т.д. Кажется, это называется «стадией поддержки», но больше похоже на бесконечную разработку Т.е. не тот проект, что сдаётся заказчику, а когда целая компания работает над одной большой штукой, которая умеет много чего для своих клиентов делать. Типа какого-нибудь «Яндекс.Маркета», где куча народа сидит и пилит день изо дня всё новые и новые фичи. |
Аналогичная фигня.
Только вот на мой вопль: НУ МОЖЕТ МЫ УЖЕ НАЧНЕМ ИСПОЛЬЗОВАТЬ ГЕТТЕРЫ/СЕТТЕРЫ???
был обозван ява-маньяком, и чтобы не мешал великим php-шникам творить какашки.
_____________
[продано копирайтерам]
Цитата (AlmazDelDiablo @ 7.11.2014 - 00:41) |
И вот то самое value вытаскивается из недр БД через магию Yii. А тут вдруг надо переопределить этот value и не тащить его из БД, а подгружать через http-api некоего сервиса (например), для чего в системе выделен отдельный модуль с собственной БД и кэшем. К сожалению, вопрос пришлось решить перегрузкой __get самого фреймворка, а можно было бы просто подменить логику в $anyObject->getValue(). Плюс, так как тут имя классы вытаскивается из переменной, IDE не может отследить это использование класса. |
Ок, если вы внедрили кэш в этот геттер, тогда как вы будуте получать из него незакещированные данные если они вам понадобятся?
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
AllesKlar
7.11.2014 - 01:32
Цитата (chee @ 7.11.2014 - 01:23) |
Цитата (AlmazDelDiablo @ 7.11.2014 - 00:41) | И вот то самое value вытаскивается из недр БД через магию Yii. А тут вдруг надо переопределить этот value и не тащить его из БД, а подгружать через http-api некоего сервиса (например), для чего в системе выделен отдельный модуль с собственной БД и кэшем. К сожалению, вопрос пришлось решить перегрузкой __get самого фреймворка, а можно было бы просто подменить логику в $anyObject->getValue(). Плюс, так как тут имя классы вытаскивается из переменной, IDE не может отследить это использование класса. |
Ок, если вы внедрили кэш в этот геттер, тогда как вы будуте получать из него незакещированные данные если они вам понадобятся?
|
При помощи некого флага nocache или метода объекта clearCache()
_____________
[продано копирайтерам]
Invis1ble
7.11.2014 - 01:56
или отдать на откуп самой системе кэширования, пусть она решает, откуда тянуть данные
если инвалидация кэша качественная, то и думать об этом не нужно. Инкапсуляция
_____________
Профессиональная разработка на заказЯ на GitHub |
второй профиль
Цитата (AllesKlar @ 7.11.2014 - 01:32) |
При помощи некого флага nocache или метода объекта clearCache() |
То есть это уже не будет ни какой инкапсуляции, так как мы предположительно будем знать что внутри может быть кэш и его надо сбрасывать.
$anyObject->clearCache(true);
$anyObject->getValue();
эх какая-то простая, но при том сложная тема, вроде бы и доводы нормальные, но что-то не достает.. :unsure:
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
AllesKlar
7.11.2014 - 08:34
Цитата (chee @ 7.11.2014 - 08:15) |
Цитата (AllesKlar @ 7.11.2014 - 01:32) | При помощи некого флага nocache или метода объекта clearCache() |
То есть это уже не будет ни какой инкапсуляции, так как мы предположительно будем знать что внутри может быть кэш и его надо сбрасывать. $anyObject->clearCache(true); $anyObject->getValue();
эх какая-то простая, но при том сложная тема, вроде бы и доводы нормальные, но что-то не достает.. :unsure: |
Чёйта?
Кеш - это нифига не универсальная штука. Для каждого проекта она индивидуальная. И разработчику самому решать, как должен себя вести кеш, когда ему очищаться, по тайм-ауту или по событию.
Впринципе, Invis1ble уже написал:
Цитата |
если инвалидация кэша качественная |
И инкапсуляция не нарушится.
_____________
[продано копирайтерам]
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.