Як видалити повторюваний код (загалом)?


10

Як на мові ОО (наприклад, але не обмежуючись Явою), як виправити дублюючий код залежно від сфери його виникнення? Я б почав з (наприклад)

  • в цьому ж класі (області) виконують метод рефакторингу Extract Method (fix)
  • в класах однієї ієрархії (області) виконують метод Extract і тягніть вгору (виправити)
  • ...

подивіться приклад реалізації принципу DRY (не повторюйте себе) з тим самим класом у цьому: geekswithblogs.net/chrisfalter/archive/2008/03/07/…
NoChance

Оригінальне запитання в SO ( stackoverflow.com/questions/7380946/… ) було закрито. Тому я перемістив його сюди.
Пітер Кофлер

Відповіді:


8

Нещодавно я знайшов хорошу відповідь на своє запитання у «Чистому коді» дядька Боба, яким хочу поділитися. Він розрізняє три типи дублювання

Шматки однакового коду слід замінити єдиним методом. Таким чином, виправленням було б вилучення методу та делегування загальній поведінці.

  • тим же методом виконайте Extract Local Variable і повторно використовуйте його.
  • в цьому ж класі виконують метод рефакторингу Extract Method.
  • в класах тієї ж ієрархії Метод вилучення та витягніть його вгору. Для створення місця для методів може бути створена ієрархія.
  • у класах окремих ієрархій використовують делегування на нові об’єкти.
  • Якщо для методів не потрібен який-небудь закриваючий стан, тоді може бути застосований шаблон "lib" (тобто контейнер для статичних методів, як правило, називається SthUtilабо SthLib).

випадки switch/caseі if/elseщо завжди випробування для того ж набору умов .

  • Їх слід замінити поліморфізмом.

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

  • Оскільки сфера застосування більша, використовуються дизайнерські малюнки. Шаблон дизайну методу шаблону може бути застосований для алгоритмів всередині ієрархії класів.
  • Шаблон дизайну стратегії може застосовуватися для будь-якого алгоритму, який використовується в різних місцях.

Також дійсна точка, згадана Одедом, при роботі з різними версіями бібліотек

  • консолідуватись за єдиною версією. Тут може допомогти модель дизайну фасадів.

Зрештою, найкраще одне речення, щоб відповісти на моє запитання - це стимулами:

метод повторного використання коду, що використовується в мовах ОО, - це об'єкти.


5

Загалом - консолідуйте дублікат коду в одне місце і переконайтеся, що оригінальний сайт дублювання викликає об'єднане місце.

У ваших прикладах, у межах класу це був би вилучений метод, а в наборі класів - підтягнутий метод у базовому класі.

У копіювальному коді вставляти дублікати та забезпечувати, щоб будь-який користувач зараз використовував єдину копію (на якому б рівні це не було).

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


Чи не це був би метод "висунутого", якщо він знаходиться в базовому класі? Я завжди уявляю базові класи як фізично під похідними класами.
Дейв Най

Власна назва з книги Refactoring - "підтягування".
Пітер Кофлер

1

Я думаю, це питання відкритого типу, але це також залежить від стану коду. Я маю на увазі, що ви можете трохи терпіти дублікат коду залежно від контексту. Правило три добре для цього питання.

Правило три Перший раз, коли ти щось робиш, ти просто робиш це. Другий раз, коли ви робите щось подібне, ви уболіваєте за дублювання, але все одно робите дублікат. Третій раз, коли ви робите щось подібне, ви рефактор.

Хоча це досить сперечається, цей пост також розглядає випадки, коли ви будете терпіти дублюючий код.


1
+1 про "правило трьох". Я завжди вражений тим, наскільки це широко застосовується.
Енді манго

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