Нещодавно під час огляду коду я натрапив на код, написаний новим колегою, який містить візерунок із запахом. Я підозрюю, що рішення мого колеги ґрунтуються на правилах, запропонованих відомою книгою «Чистий кодекс» (а можливо, і іншими подібними книгами).
Наскільки я розумію, конструктор класу повністю відповідає за створення дійсного об’єкта і що його головне завдання - це присвоєння об'єктам (приватних) властивостей. Звичайно, може статися, що необов'язкові значення властивостей можуть встановлюватися іншими методами, ніж конструктор класів, але такі ситуації є досить рідкісними (хоча і не обов'язково помилковими, за умови, що решта класу враховує необов'язковість такої властивості). Це важливо, оскільки дозволяє переконатися, що об’єкт завжди знаходиться у дійсному стані.
Однак у коді, з яким я стикався, більшість значень властивостей фактично задаються іншими методами, ніж конструктор. Значення, отримані в результаті обчислень, присвоюються властивостям, які використовуються в межах декількох приватних методів у всьому класі. Автор, здавалося б, використовує властивості класу так, ніби вони були глобальними змінними, які повинні бути доступними протягом усього класу, замість того, щоб параметризувати ці значення функціям, які їм потрібні. Крім того, методи класу слід викликати у певному порядку, оскільки інакше не буде багато чого.
Я підозрюю, що цей код був натхненний порадою тримати методи короткими (<= 5 рядків коду), уникати великих списків параметрів (<3 параметри) і конструктори не повинні працювати (наприклад, виконуючи якийсь обчислення). що важливо для обґрунтованості об'єкта).
Тепер, звичайно, я можу скласти справу проти цієї закономірності, якщо можу довести, що всі види невизначених помилок потенційно виникають, коли методи не викликаються в певному порядку. Однак я прогнозую, що відповідь на це буде додавати перевірки, які підтверджують, що властивості повинні бути встановлені після виклику методів, які потребують встановлення цих властивостей.
Проте я б запропонував повністю змінити код, щоб клас став блакитним друком на фактичний об'єкт, а не на низку методів, які слід викликати (процедурно) у визначеному порядку.
Я відчуваю, що код, з яким я стикався, пахне. Насправді я вважаю, що існує досить чітка відмінність того, коли зберігати значення у властивості класу та коли вводити його в параметр для використання іншого методу - я не вірю, що вони можуть бути альтернативами один одному . Я шукаю слова для цього розрізнення.