Я прийшов у щось вірити про рефакторинг, про який я не бачив згадуваних тут, я знаю, що тут вже багато відповідей, але я думаю, що це нове.
Я був безжальним рефакторером і твердим віруючим в DRY ще до появи термінів. Переважно тому, що у мене проблеми із збереженням великої бази коду в голові, а почасти тому, що мені подобається кодування DRY, і мені нічого не подобається щодо кодування C&P, насправді це боляче і страшенно повільно для мене.
Річ у тім, що наполягання на DRY дало мені багато практики в деяких техніках, якими я рідко бачу інших. Дуже багато людей наполягають на тому, що на Яві важко або неможливо зробити DRY, але насправді вони просто не намагаються.
Один з давніх-давен приклад, який дещо схожий на ваш приклад. Люди схильні думати, що створення Java-графічного інтерфейсу важко. Звичайно, якщо ви кодуєте так:
Menu m=new Menu("File");
MenuItem save=new MenuItem("Save")
save.addAction(saveAction); // I forget the syntax, but you get the idea
m.add(save);
MenuItem load=new MenuItem("Load")
load.addAction(loadAction)
Кожен, хто думає, що це просто божевільний, абсолютно прав, але це не вина Java - код ніколи не повинен писатися таким чином. Ці виклики методів - це функції, призначені для обгортання в інших системах. Якщо ви не можете знайти таку систему, побудуйте її!
Ви, очевидно, не можете кодувати так, тож вам потрібно відступити назад і подивитися на проблему, що насправді робить цей повторний код? Це вказує деякі рядки та їх зв’язок (дерево) та приєднує листя цього дерева до дій. Тож, що ти насправді хочеш, це сказати:
class Menu {
@MenuItem("File|Load")
public void fileLoad(){...}
@MenuItem("File|Save")
public void fileSave(){...}
@MenuItem("Edit|Copy")
public void editCopy(){...}...
Після того, як ви визначили свої відносини якимось стислим та описовим, тоді ви пишете метод для вирішення цього питання - у цьому випадку ви повторюєте методи класу, що передається, та будуєте дерево, а потім використовуєте це для створення своїх меню. і "Дії", а також (очевидно) відображення меню. У вас не буде дублювання, і ваш метод повторного використання ... і, ймовірно, простіше написати, ніж велика кількість меню було б, і якщо ви насправді насолоджуєтесь програмуванням, вам було набагато веселіше. Це не важко - метод, який потрібно писати, напевно, менше рядків, ніж створення свого меню вручну!
Справа в тому, що для цього добре потрібно попрактикуватися, багато. Потрібно добре проаналізувати, яка саме унікальна інформація є у повторних частинах, витягнути цю інформацію та зрозуміти, як її добре висловити. Навчитися використовувати такі інструменти, як розбір рядків та анотації, допомагає багато. Навчитися бути зрозумілим щодо повідомлення про помилки та документацію також дуже важливо.
Ви отримуєте "безкоштовну" практику, просто кодуючи її - шанси на те, що, як тільки ви добре в ній зрозумієте, що кодування чогось DRY (включаючи написання інструменту для багаторазового використання) швидше, ніж копіювання та вставлення та всі помилки, дублювані помилки і важкі зміни, які викликає тип кодування.
Я не думаю, що я міг би насолоджуватися своєю роботою, якби я не практикував сухі техніки та інструменти побудови стільки, наскільки міг. Якби мені довелося знизити зарплату, щоб не робити копіювання та вставлення програмування, я б взяв це.
Тож мої моменти:
- Копіювати та вставляти коштує більше часу, якщо ви не знаєте, як правильно перефактурувати.
- Ви навчитесь добре рефакфікувати, роблячи це - наполягаючи на DRY навіть у найскладніших і тривіальних випадках.
- Ви програміст, якщо вам потрібен невеликий інструмент, щоб зробити свій код ДУХОМИ, побудуйте його.
always
іnever
як до червоних прапорів. Існує річ, яка називається "контекст", деalways
іnever
правила, навіть якщо вони загалом хороші, можуть бути не такими підходящими. Остерігайтеся розробників програмного забезпечення, які мають справу з абсолютами. ;)