Wir haben ziemlich viele Stellen im Quellcode unserer Anwendung, an denen eine Klasse viele Methoden mit gleichen Namen und unterschiedlichen Parametern hat. Diese Methoden haben immer alle Parameter einer 'vorherigen' Methode plus einen weiteren.
Es ist ein Ergebnis der langen Evolution (Legacy-Code) und dieses Denkens (ich glaube):
" Es gibt eine Methode M, die A ausführt. Ich muss A + B ausführen. OK, ich weiß ... Ich werde M einen neuen Parameter hinzufügen, eine neue Methode dafür erstellen, Code von M auf die neue Methode verschieben mit einem weiteren Parameter machen Sie dort das A + B und rufen die neue Methode von M mit einem Standardwert des neuen Parameters auf. "
Hier ist ein Beispiel (in Java-ähnlicher Sprache):
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
(...)
}
(...)
}
Ich denke, das ist falsch. Nicht nur, dass wir nicht für immer neue Parameter wie diese hinzufügen können, sondern auch, dass der Code aufgrund aller Abhängigkeiten zwischen den Methoden schwer zu erweitern / zu ändern ist.
Hier sind einige Möglichkeiten, wie Sie dies besser machen können:
Führen Sie ein Parameterobjekt ein:
class DocumentCreationParams { String name; int minPagesCount; boolean firstPageBlank; String title; (...) } class DokumentHome { public Document createDocument(DocumentCreationParams p) { // here the real work gets done (...) } }
Stellen Sie die Parameter auf das
DocumentHome
Objekt ein, bevor Sie es aufrufencreateDocument()
@In DocumentHome dh = null; (...) dh.setName(...); dh.setMinPagesCount(...); dh.setFirstPageBlank(...); Document newDocument = dh.createDocument();
Teilen Sie die Arbeit in verschiedene Methoden auf und rufen Sie sie nach Bedarf auf:
@In DocumentHome dh = null; Document newDocument = dh.createDocument(); dh.changeName(newDocument, "name"); dh.addFirstBlankPage(newDocument); dh.changeMinPagesCount(new Document, 10);
Meine Fragen:
- Ist das beschriebene Problem wirklich ein Problem?
- Was halten Sie von Lösungsvorschlägen? Welches würdest du bevorzugen (basierend auf deinen Erfahrungen)?
- Können Sie sich eine andere Lösung vorstellen?