Abbiamo un sacco di posti nel codice sorgente della nostra applicazione, in cui una classe ha molti metodi con gli stessi nomi e parametri diversi. Questi metodi hanno sempre tutti i parametri di un metodo "precedente" più uno.
È il risultato di una lunga evoluzione (codice legacy) e questo modo di pensare (credo):
" C'è un metodo M che fa la cosa A. Devo fare A + B. OK, lo so ... Aggiungerò un nuovo parametro a M, creerò un nuovo metodo per quello, sposta il codice da M al nuovo metodo con un altro parametro, fai A + B e chiama il nuovo metodo da M con un valore predefinito del nuovo parametro. "
Ecco un esempio (in linguaggio simile a 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
(...)
}
(...)
}
Mi sembra che sia sbagliato. Non solo non possiamo continuare ad aggiungere nuovi parametri come questo per sempre, ma il codice è difficile da estendere / modificare a causa di tutte le dipendenze tra i metodi.
Ecco alcuni modi per farlo meglio:
-
Introdurre un oggetto parametro:
class DocumentCreationParams { String name; int minPagesCount; boolean firstPageBlank; String title; (...) } class DokumentHome { public Document createDocument(DocumentCreationParams p) { // here the real work gets done (...) } }
-
Imposta i parametri sull'oggetto
DocumentHome
prima di chiamarecreateDocument()
@In DocumentHome dh = null; (...) dh.setName(...); dh.setMinPagesCount(...); dh.setFirstPageBlank(...); Document newDocument = dh.createDocument();
-
Separa il lavoro in diversi metodi e chiamalo secondo necessità:
@In DocumentHome dh = null; Document newDocument = dh.createDocument(); dh.changeName(newDocument, "name"); dh.addFirstBlankPage(newDocument); dh.changeMinPagesCount(new Document, 10);
Le mie domande:
- Il problema descritto è davvero un problema?
- Cosa ne pensi delle soluzioni suggerite? Quale preferiresti (in base alla tua esperienza)?
- Riesci a pensare ad altre soluzioni?