У нас довольно много мест в исходном коде нашего приложения, где один класс имеет много методов с одинаковыми именами и разными параметрами. Эти методы всегда имеют все параметры «предыдущего» метода плюс еще один.
Это результат долгой эволюции (устаревший код) и такого мышления (я считаю):
« Есть метод M, который выполняет функцию A. Мне нужно сделать 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);
Мои вопросы:
- Является ли описанная проблема действительно проблемой?
- Что вы думаете о предлагаемых решениях? Какой из них вы бы предпочли (исходя из вашего опыта)?
- Можете ли вы придумать какое-либо другое решение?