У вихідному коді нашої програми є досить багато місць, де в одному класі є багато методів з однаковими іменами та різними параметрами. У цих методах завжди є всі параметри попереднього методу плюс ще один.
Це результат тривалої еволюції (застарілий код) і такого мислення (я вважаю):
" Існує метод M, який робить щось А. Мені потрібно зробити A + B. Добре, я знаю ... Я додам новий параметр до M, створіть новий метод для цього, пересуньте код з M на новий метод з ще одним параметром, зробіть A + B там і зателефонуйте новому методу від M зі значенням нового параметра за замовчуванням. "
Ось приклад (на мові, подібній до Java):
class DocumentHome {
(...)
public Document createDocument(String name) {
// just calls another method with default value of its parameter
return createDocument(name, -1);
}
public Document createDocument(String name, int minPagesCount) {
// just calls another method with default value of its parameter
return createDocument(name, minPagesCount, false);
}
public Document createDocument(String name, int minPagesCount, boolean firstPageBlank) {
// just calls another method with default value of its parameter
return createDocument(name, minPagesCount, false, "");
}
public Document createDocument(String name, int minPagesCount, boolean firstPageBlank, String title) {
// here the real work gets done
(...)
}
(...)
}
Я відчуваю, що це неправильно. Мало того, що ми не можемо назавжди додавати такі параметри, як цей, але код важко розширити / змінити через всі залежності між методами.
Ось кілька способів зробити це краще:
Введіть об'єкт параметра:
class DocumentCreationParams { String name; int minPagesCount; boolean firstPageBlank; String title; (...) } class DokumentHome { public Document createDocument(DocumentCreationParams p) { // here the real work gets done (...) } }
Встановіть параметри
DocumentHome
об'єкта перед тим, як викликатиcreateDocument()
@In DocumentHome dh = null; (...) dh.setName(...); dh.setMinPagesCount(...); dh.setFirstPageBlank(...); Document newDocument = dh.createDocument();
Розділіть роботу на різні методи та зателефонуйте їм за потребою:
@In DocumentHome dh = null; Document newDocument = dh.createDocument(); dh.changeName(newDocument, "name"); dh.addFirstBlankPage(newDocument); dh.changeMinPagesCount(new Document, 10);
Мої запитання:
- Чи справді описана проблема є проблемою?
- Що ви думаєте про запропоновані рішення? Якому б ви віддали перевагу (виходячи зі свого досвіду)?
- Чи можете ви придумати якесь інше рішення?