Використання різних шаблонів для подібних функцій


10

Я єдиний розробник проекту, який, як і будь-який проект програмного забезпечення, може бути прийнятий ким-небудь ще.

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

Тоді настав час реалізувати функцію B. Це схоже на A, але цього разу я хочу скористатися цією можливістю, щоб пограти з малюнком Y. Я радий кінцевому результату, кращому, ніж при виконанні функції A, але тепер мій код використовує два різні візерунки, X і Y, для подібних особливостей.

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

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

  • Це кодовий запах?
  • Які недоліки зберігати вихідний код таким?
  • Чи повинен я дотримуватися лише одного шаблону? тобто рефактор A використовувати Y або продовжувати використовувати X під час запису B?
  • Як у джерелі я можу повідомити, що причина, чому існують дві різні схеми подібних особливостей, по суті не є причиною?
  • Я занадто сильно переживаю, що думає наступний розробник про мій код?

Відповіді:


7

Якщо візерунок X і Y вирішує одну і ту ж проблему, і жодне об'єктивно не є кращим, то вам слід визначитися з однією і дотримуватися її. Якщо це взагалі можливо, вам слід прагнути вирішити ту саму проблему послідовно.

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

Недоліки у тому, щоб мати різні рішення однієї проблеми в кодовій базі:

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

2

Я згоден з відповіддю ЖакБ . Я хотів би додати, звертаючись до інших ваших питань, що якщо зараз у вас є дві схеми співіснування, і ви не мали часу (ще) перефактурувати вашу заявку, щоб використовувати ту, яку ви вважаєте найкращою, вам слід поставити що у ваших коментарях у класі "ображаючого" (той, що підлягає реконструкції). Таким чином, майбутнім розробникам (ви чи хтось інший) очевидно, що ще потрібно сплатити борг.

Нарешті, головним недоліком підтримання такої бази коду є додана, але непотрібна, складність. Ви, безумовно, хочете уникнути зайвої складності будь-якою ціною!


Я вважаю за краще це бачити в якомусь списку тодо або принаймні в додатку до коду.
JeffO

@JeffO Я згоден. Хоча покладатися лише на списки todo не викликає додаткових проблем, оскільки більшість випадків це особисті (не загальні), навпаки коментаря всередині спільної кодової бази. Але знову ж таки, я згоден, і, ймовірно, хороша ідея мати обоє (коли їх остаточно не можна уникнути).
carlossierra

Це хороший момент. Це має бути чимось більш ніж простим списком Todo, щоб включати обмін, співпрацю, спілкування та все інше, що цікаво;
JeffO

1

Не грайте в кодовій базі. Пишіть прототипи, щоб ви могли знайти переваги та недоліки одного візерунка / дизайну над іншим.

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

Очікуйте, що викинемо значною мірою код, розроблений для прототипу.


1

Від того, чи є це кодовим запахом, дійсно залежить від того, наскільки схожі проблема А та проблема В. Здається, відповідь ЖакБ припускає, що вони дуже схожі, і якщо ви зміните проблему A (наприклад, виправити помилку), вам доведеться одночасно змінити проблему B. JaqueB може бути правильним, але може статися так, що A і B змінюються незалежно, оскільки вони не всі такі схожі. У цій ситуації ви навряд чи матимете описані недоліки.

На основі вашого опису це звучить як трохи кодового запаху (копіювання), але важко сказати, наскільки смердючий запах. Наприклад, якщо A використовує метод шаблону, а B використовує стратегію, дві проблеми можуть бути дуже різними, незважаючи на використовувані дзеркальні зразки. Я б зачекав і побачив підхід. У випадку, якщо проблема C виникає, і це подібно до A і B, то я б рефактор A відповідав B і тоді створення C повинно бути дуже простим. Якщо в A є помилка, я також хочу переробити її на B, а потім виправити помилку. У випадку, якщо потім нічого не змінюється .... неважливо, чи не так?

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


1

Ні, ви можете мати кілька моделей, що використовуються в одній базі коду.

Однак, якщо ви реалізуєте компонент і ви відкриваєте спосіб його використання, що відповідає шаблону, то, мабуть, найкраще дотримуватися цього. Скажімо, наприклад, я використовую шаблон конструктора для свого клієнта REST-запиту, але потім я реалізую один з ресурсів по-іншому. Це збирається заплутати людей.

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