Нещодавно я читав веб-сайт про розробку чистого коду (тут не посилаю посилання, оскільки це не англійською мовою).
Один із принципів, що рекламується на цьому веб-сайті, - це принцип відкритого закриття: кожен програмний компонент повинен бути відкритим для розширення та закритим для модифікації. Наприклад, коли ми впровадили та протестували клас, ми мусимо лише модифікувати його, щоб виправити помилки чи додати нові функціональні можливості (наприклад, нові методи, які не впливають на існуючі). Існуючу функціональність та реалізацію не слід змінювати.
Я зазвичай застосовую цей принцип, визначаючи інтерфейс I
та відповідний клас реалізації A
. Коли клас A
став стабільним (реалізований і протестований), зазвичай я його не надто сильно змінюю (можливо, зовсім не), тобто
- Якщо надійдуть нові вимоги (наприклад, продуктивність або абсолютно нова реалізація інтерфейсу), які потребують великих змін у коді, я записую нову реалізацію
B
та продовжую користуватися доA
тих пір,B
поки не зріла. КолиB
вона зріла, все, що потрібно, - це змінити те, якI
миттєво. - Якщо нові вимоги також пропонують змінити інтерфейс, я визначаю новий інтерфейс
I'
та нову реалізаціюA'
. Таким чиномI
,A
будуть заморожені і залишаються реалізація для виробничої системи до тих пір,I'
іA'
мало стабільна , щоб замінити їх.
Тож, з огляду на ці спостереження, я трохи здивувався, що веб-сторінка тоді запропонувала використовувати складні рефактори , "... тому що неможливо написати код безпосередньо в його остаточному вигляді".
Чи не існує суперечності / конфлікту між застосуванням відкритого / закритого принципу та пропонуванням використання складних рефактори в якості найкращої практики? Або ідея тут полягає в тому, що під час розробки класу можна використовувати складні рефактори A
, але коли цей клас був успішно протестований, його слід заморозити?