Чи вважається поганою практикою додавання логіки в налаштування властивості?


28

Я заскочив у проект і бачу, що інші розробники додають багато логіки у задачі синтезованих властивостей. Я розумію, як це працює, але думаю, що це ускладнює розуміння потоку програми; під час читання коду, коли я бачу self.something = whatever, я завжди перевіряю, чи somethingне занесений сетер.

Яка ваша думка навколо цієї теми? Як ви вважаєте, це ознака поганої архітектури чи продуманого рішення?

Я був би радий прочитати більше про це, якщо у вас є відповідні посилання / джерела, отримати занадто важкі результати Google просто важко, тому я вирішив запитати і тут.

Дякую за будь-яку відповідь. Будь ласка, зауважте, що я кажу про ціль C у випадку, якщо ви не бачили тегів (хоча, мабуть, це не повинно бути специфічним для мови).


5
Яка логіка? Немає нічого поганого в прикладі логіки перевірки, наприклад. З іншого боку, сетер, який розсилає кілька подій, дзвонить у веб-сервіс та оновлює інтерфейс користувача, абсолютно неправильно.
Арсеній Муренко

@MainMa Я погоджуюсь, що перевірки добре - можливо, додамо також деяких спостерігачів, правда? Чи не могли б ви навести кілька прикладів того, що ви вважаєте більш доцільним розмістити в сеттері?
філ

дійсно, спостерігачі мають рацію. Що стосується речей, які підходять сетеру, я дозволю більш досвідченим розробникам відповісти на це питання.
Арсеній Муренко

Відповіді:


44

Чи вважається поганою практикою додавання логіки в налаштування властивості?

Ні

Властивості були винайдені, щоб конструктори класів могли мати логіку, приєднану до зручного інтерфейсу доступу до поля та призначення.

Скільки це занадто багато? Це залежить від обов'язків класу. Ось деякі речі, які доцільно розмістити у програмі налаштування властивості:

  • оновити деякі похідні значення
  • повідомляти спостерігачів про те, що стан класу змінився
  • розповсюдження змін на якийсь об'єкт, що міститься
  • розповсюдження змін на підкладку магазину
  • виконати перевірку

Програмування простіше, коли у класів є інтерфейси, які дозволяють зрозуміти, що може робити клас, не змушуючи абонентів замислюватися над тим, як це робиться. Поміщення логіки за налаштуваннями властивостей дозволяє класам приховати їх реалізацію за простим інтерфейсом. Для деяких класів ніякі методи не потрібні. Просто поверніть регулятори, встановивши властивості, і прочитайте вихід, отримавши властивості.


13
Виконайте перевірку ...
Роберт Харві

Наскільки корисно перезавантажити колекційний перегляд або табличний перегляд методом, який переосмислив сетер?
Крішнан

15

Як правило, сетери використовують для зміни стану об'єкта без значних побічних ефектів або важких розрахунків; для цього використовують методи та функції. Основна причина впровадження програми - це зміна та підтримка дійсного стану . Отже, обмеження діапазону, встановлення прапорів для запиту перерахунку або налаштування відповідних властивостей абсолютно нормально.


7

Я не знаю про об'єктивну C, але, як ви кажете, це здається загальним питанням для будь-якої мови ОО. Перш за все і фактично пов’язане з цим, питання про те, чи потрібно мати сеттерів та гетерів на першому місці - питання дискусії (в деяких випадках їх існування виправдано використанням рамки чи бібліотеки).

Я вважаю, що назва методу повинна пояснювати, що робить метод і що робить метод. Додатково документація, пов'язана з цим методом, повинна описувати її більш чітко. У цьому сенсі назва методу у формі "set" + {noun} не повинна мати жодних побічних ефектів, крім встановлення значення змінної, і це має бути єдиною дією, пов'язаною з нею. Перевірка правильності аргументу є прийнятною, але вона повинна бути описана в її документації.


1
+1 для "чи мати сеттерів та геттерів". І ще +1 для "ім'я методу має пояснювати, що він робить".
авів
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.