Я шукаю вказівки щодо сполучення DRY проти коду. Мені не подобається дублювати код, і мені також не подобається з'єднання коду між непов'язаними модулями. Тож я рефактор дублюючого коду, якщо виявляю ідентичний дублікат коду через рік після введення дублювання. Однак у мене все частіше виникають ситуації, коли реальний світ набагато непередбачуваніший, і після рефакторингу коду виникають ситуації, які потребують повторного вилучення коду.
Наприклад, якщо я мав код для управління бензиновими автомобілями, бензиновими позашляховиками, електричними автомобілями та електричними позашляховиками, скажімо, я відновив повторний код у "бензиновій" ієрархії та "електричній" ієрархії, що походить від ієрархії "транспортного засобу". Все йде нормально. І тоді моя компанія представляє гібридний автомобіль і гібридний Semi - що вимагало б основних змін до самої моєї оригінальної ієрархії. Можливо, знадобиться "композиція" між бензиновою та електричною ієрархіями.
Очевидно, що дублювання коду є поганим, оскільки збільшує час, необхідний для впровадження змін, загальних для всіх вищевказаних продуктів. Але загальний код рефакторингу робить однаково важким введення варіантів, що стосуються конкретного продукту, і призводить до безлічі "стрибків у класі", коли потрібно знайти рядок коду, щоб виправити помилку - одна зміна батьківського класу вищого рівня могла б запускають помилки регресії серед усіх нащадків.
Як можна досягти оптимального балансу між DRY та небажаним зчепленням коду?