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. Tali metodi hanno sempre tutti i parametri di un metodo "precedente" più uno in più.
È il risultato di una lunga evoluzione (codice legacy) e di questo pensiero (credo):
" Esiste un metodo M che fa la cosa A. Ho bisogno di fare A + B. OK, lo so ... Aggiungerò un nuovo parametro a M, creerò un nuovo metodo per quello, sposterò il codice da M al nuovo metodo con un altro parametro, esegui A + B laggiù 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
(...)
}
(...)
}
Sento che questo è 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 (...) } }
Impostare i parametri
DocumentHome
sull'oggetto prima di chiamarecreateDocument()
@In DocumentHome dh = null; (...) dh.setName(...); dh.setMinPagesCount(...); dh.setFirstPageBlank(...); Document newDocument = dh.createDocument();
Separare il lavoro in diversi metodi e chiamarli 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 a qualche altra soluzione?