Тому, напевно, як у багатьох, я часто стикаюся з головними болями з дизайнерськими проблемами, в яких, наприклад, існує певна модель / підхід дизайну, який, здається, інтуїтивно відповідає проблемі і має бажані переваги. Дуже часто є якийсь застереження, який ускладнює реалізацію схеми / підходу без якоїсь роботи, навколо якої потім заперечується користь схеми / підходу. Я дуже легко закінчую ітерацію через багато моделей / підходів, тому що передбачувано майже всі вони мають дуже важливі застереження у ситуаціях реального світу, в яких просто непросте рішення.
Приклад:
Я надам вам гіпотетичний приклад, який грубо базується на реальному, з яким я нещодавно стикався. Скажімо, я хочу використовувати склад над успадкуванням, тому що ієрархії спадкування заважали масштабуванню коду в минулому. Я можу перефактурувати код, але потім виявлю, що є деякі контексти, де надклас / базовий клас просто потребує виклику функціональності на підкласі, незважаючи на спроби уникнути цього.
Наступним найкращим підходом, здається, є реалізація шаблону на половину делегата / спостерігача та шаблону половини композиції, щоб суперклас міг делегувати поведінку або так, щоб підклас міг спостерігати події надкласового рівня. Тоді клас є менш масштабованим та ремонтопридатним, оскільки незрозуміло, яким чином його слід розширювати, а також важко розширити наявних слухачів / делегатів. Також інформація не прихована добре, тому що для того, щоб дізнатися, як розширити суперклас (якщо ви не використовуєте коментарі дуже широко), для початку потрібно знати знання.
Тож після цього я можу вирішити просто просто використовувати спостерігачів або делегатів повністю, щоб піти від недоліків, які виникають із сильним змішуванням підходів. Однак це має свої проблеми. Наприклад, я можу виявити, що мені в кінцевому підсумку потрібні спостерігачі або делегати для збільшення кількості поведінки, поки я не виявляю необхідності спостерігачів / делегатів практично для кожної поведінки. Одним із варіантів може бути лише один великий слухач / делегат для всієї поведінки, але тоді клас реалізації реалізується з великою кількістю порожніх методів тощо.
Тоді я можу спробувати інший підхід, але з цим є стільки ж питань. Потім наступний, а той після і т.д.
Цей ітераційний процес стає дуже складним, коли, мабуть, кожен підхід має стільки ж проблем, як і будь-який інший, і призводить до свого роду паралізу дизайнерських рішень . Також важко визнати, що код виявиться настільки ж проблематичним, незалежно від того, який шаблон дизайну чи підхід використовується. Якщо я опинився в цій ситуації, чи означає це, що саму проблему потрібно переосмислити? Що роблять інші, стикаючись із цією ситуацією?
Редагувати: Здається, є ряд тлумачень питання, які я хочу прояснити:
- Я повністю зняв OOP з питання, оскільки виявляється, що він насправді не є специфічним для OOP, плюс занадто легко помилково інтерпретувати деякі коментарі, які я зробив, проходячи в ході про OOP.
- Дехто стверджував, що я повинен використовувати ітеративний підхід і спробувати різні шаблони, або що я повинен відкинути шаблон, коли він перестане працювати. Це процес, на який я мав намір звернутися в першу чергу. Я вважав, що це зрозуміло з прикладу, але я міг зробити це більш зрозумілим, тому я відредагував питання, щоб це зробити.