[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Геттеры и сеттеры
Страницы: 1, 2
chee
Я много где читал, что на все свойства для моделей нужно создавать геттеры и сеттеры. Обосновывали, в основном, это тем что можно будет инкапсулировать логику если нужно в них. Но мой опыт работы с объектным кодом говорит об обратном, а именно сначала уставнови в публичные свойства данные так как они есть, а потом производи с объектом действия.

Может я что-то упускаю, и что где-то не прочёл?

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Это тоже тема для холивара. smile.gif
Жесткие принципы инкапсуляции вообще не допускают публичных свойств. Только через set/get. Объясняется тем, что публичные свойсвта имеют схожесть с глобальными переменными. И изменять состояние объекта вне объекта моветон.

Но это совсершенные ортодоксы так поступают.



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

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

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

user posted image
chee
Цитата (twin @ 6.11.2014 - 22:17)
Жесткие принципы инкапсуляции вообще не допускают публичных свойств.

то есть вы считаете, что только поэтому, больше причин нет?

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
AlmazDelDiablo
Свойства без get/set допустимы только в целях оптимизации при работе с большими массивами (а они, как известно, копируются при передачи из метода). Такое случается крайне редко, а посему в отступлении от правил инкапсуляции в такой ситуации ничего очень страшного нет.

В остальных ситуациях удобнее всего работать именно с set/get. В своей работе не раз сталкивался с болью в Yii, где всё работает на публичных свойствах. Происходит изменение в системе, нужно перенести получение значения свойства из класса в другое место и при вызове поля N всегда нужно обращаться в другой класс, а оно без get всегда вызывалось. И тебе приходится по огромному проекту искать все использования или костылить, перегружая __get, что тоже не есть хорошо.

В общем, рекомендация исключительно из опыта работы: используйте get/set везде, где только возможно. Однажды это спасёт вашу жопку от срыва сроков из-за недальновидности вас и/или ваших коллег.

_____________
Блог | VK | GitHub | Twitch
Invis1ble
все правильно, для инкапсуляции логики
Цитата
Происходит изменение в системе, нужно перенести получение значения свойства из класса в другое место и при вызове поля N всегда нужно обращаться в другой класс, а оно без get всегда вызывалось. И тебе приходится по огромному проекту искать все использования или костылить, перегружая __get, что тоже не есть хорошо.
twin
Цитата (chee @ 6.11.2014 - 18:39)

то есть вы считаете, что только поэтому, больше причин нет?

Вобщем то и этого достаточно. Слова AlmazDelDiablo как раз подтверждают.

Даже простое обращение к свойству рекомендуется делать через магию. Хотя в этом точно никакого смысла нет, если только это не Registry. Что поделаешь. Издержки ООП. Везде рамки. smile.gif

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

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

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

user posted image
chee
Цитата (AlmazDelDiablo @ 6.11.2014 - 22:40)
В остальных ситуациях удобнее всего работать именно с set/get. В своей работе не раз сталкивался с болью в Yii, где всё работает на публичных свойствах. Происходит изменение в системе, нужно перенести получение значения свойства из класса в другое место и при вызове поля N всегда нужно обращаться в другой класс, а оно без get всегда вызывалось.

можете описать как это это было в коде? Я знаю о такой ситуации, но в моей рабочей практике она не случалась. Еще уточняющий вопрос, проект в котором у вас такая ситуация была, на какой стадии был? Создание функционала или поддержка(рефакторинг, доработка фич)?

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
SoMeOnE
Тоже всегда дума, а почему бы и не использовать публичные свойства. Теперь понятней стало)
AlmazDelDiablo
Цитата (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
Цитата (AlmazDelDiablo @ 7.11.2014 - 00:41)
А проект у нас постоянно развивается, рефакторится. меняет технологии под капотом и т.д. Кажется, это называется «стадией поддержки», но больше похоже на бесконечную разработку smile.gif Т.е. не тот проект, что сдаётся заказчику, а когда целая компания работает над одной большой штукой, которая умеет много чего для своих клиентов делать. Типа какого-нибудь «Яндекс.Маркета», где куча народа сидит и пилит день изо дня всё новые и новые фичи.

Аналогичная фигня.
Только вот на мой вопль: НУ МОЖЕТ МЫ УЖЕ НАЧНЕМ ИСПОЛЬЗОВАТЬ ГЕТТЕРЫ/СЕТТЕРЫ???
был обозван ява-маньяком, и чтобы не мешал великим php-шникам творить какашки.

_____________
[продано копирайтерам]
chee
Цитата (AlmazDelDiablo @ 7.11.2014 - 00:41)
И вот то самое value вытаскивается из недр БД через магию Yii. А тут вдруг надо переопределить этот value и не тащить его из БД, а подгружать через http-api некоего сервиса (например), для чего в системе выделен отдельный модуль с собственной БД и кэшем. К сожалению, вопрос пришлось решить перегрузкой __get самого фреймворка, а можно было бы просто подменить логику в $anyObject->getValue(). Плюс, так как тут имя классы вытаскивается из переменной, IDE не может отследить это использование класса.

Ок, если вы внедрили кэш в этот геттер, тогда как вы будуте получать из него незакещированные данные если они вам понадобятся?

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
AllesKlar
Цитата (chee @ 7.11.2014 - 01:23)
Цитата (AlmazDelDiablo @ 7.11.2014 - 00:41)
И вот то самое value вытаскивается из недр БД через магию Yii. А тут вдруг надо переопределить этот value и не тащить его из БД, а подгружать через http-api некоего сервиса (например), для чего в системе выделен отдельный модуль с собственной БД и кэшем. К сожалению, вопрос пришлось решить перегрузкой __get самого фреймворка, а можно было бы просто подменить логику в $anyObject->getValue(). Плюс, так как тут имя классы вытаскивается из переменной, IDE не может отследить это использование класса.

Ок, если вы внедрили кэш в этот геттер, тогда как вы будуте получать из него незакещированные данные если они вам понадобятся?

При помощи некого флага nocache или метода объекта clearCache()

_____________
[продано копирайтерам]
Invis1ble
или отдать на откуп самой системе кэширования, пусть она решает, откуда тянуть данные
если инвалидация кэша качественная, то и думать об этом не нужно. Инкапсуляция smile.gif

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

chee
Цитата (AllesKlar @ 7.11.2014 - 01:32)

При помощи некого флага nocache или метода объекта clearCache()

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

$anyObject->clearCache(true);
$anyObject->getValue();



эх какая-то простая, но при том сложная тема, вроде бы и доводы нормальные, но что-то не достает.. :unsure:

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
AllesKlar
Цитата (chee @ 7.11.2014 - 08:15)
Цитата (AllesKlar @ 7.11.2014 - 01:32)

При помощи некого флага nocache или метода объекта clearCache()

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

$anyObject->clearCache(true);
$anyObject->getValue();



эх какая-то простая, но при том сложная тема, вроде бы и доводы нормальные, но что-то не достает.. :unsure:

Чёйта?
Кеш - это нифига не универсальная штука. Для каждого проекта она индивидуальная. И разработчику самому решать, как должен себя вести кеш, когда ему очищаться, по тайм-ауту или по событию.

Впринципе, Invis1ble уже написал:
Цитата
если инвалидация кэша качественная

И инкапсуляция не нарушится.

_____________
[продано копирайтерам]
Быстрый ответ:

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