Mamy całkiem sporo miejsc w kodzie źródłowym naszej aplikacji, gdzie jedna klasa ma wiele metod o tych samych nazwach i różnych parametrach. Te metody zawsze mają wszystkie parametry metody „poprzedniej” plus jeszcze jedną.
Jest to wynik długiej ewolucji (starszego kodu) i tego myślenia (wierzę):
„ Istnieje metoda M, która wykonuje czynności A. Muszę wykonać A + B. OK, wiem… dodam nowy parametr do M, stworzę nową metodę, przeniesię kod z M do nowej metody z jeszcze jednym parametrem wykonaj tam A + B i wywołaj nową metodę z M z domyślną wartością nowego parametru. ”
Oto przykład (w języku 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
(...)
}
(...)
}
Czuję, że to źle. Nie tylko dlatego, że nie możemy wiecznie dodawać nowych parametrów takich jak ten, ale kod jest trudny do rozszerzenia / zmiany z powodu wszystkich zależności między metodami.
Oto kilka sposobów, jak to zrobić lepiej:
Wprowadź obiekt parametru:
class DocumentCreationParams { String name; int minPagesCount; boolean firstPageBlank; String title; (...) } class DokumentHome { public Document createDocument(DocumentCreationParams p) { // here the real work gets done (...) } }
Ustaw parametry
DocumentHome
obiektu, zanim zadzwonimycreateDocument()
@In DocumentHome dh = null; (...) dh.setName(...); dh.setMinPagesCount(...); dh.setFirstPageBlank(...); Document newDocument = dh.createDocument();
Podziel pracę na różne metody i nazwij je w razie potrzeby:
@In DocumentHome dh = null; Document newDocument = dh.createDocument(); dh.changeName(newDocument, "name"); dh.addFirstBlankPage(newDocument); dh.changeMinPagesCount(new Document, 10);
Moje pytania:
- Czy opisany problem jest naprawdę problemem?
- Co sądzisz o proponowanych rozwiązaniach? Który wolisz (na podstawie twojego doświadczenia)?
- Czy możesz wymyślić inne rozwiązanie?