Quali sono i pro e i contro di avere metodi di creazione di oggetti statici rispetto ai costruttori?
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
Pochi a cui riesco a pensare:
Professionisti:
- Restituisce null invece di generare un'eccezione (denominala
TryCreate
). Ciò può rendere il codice più conciso e pulito sul lato client. I clienti si aspettano raramente che un costruttore fallisca. - Crea diversi tipi di oggetti con una semantica chiara, ad es.
CreatFromName(String name)
ECreateFromCsvLine(String csvLine)
- Può restituire un oggetto memorizzato nella cache, se necessario, o un'implementazione derivata.
Contro:
- Codice meno rilevabile, più difficile da sfogliare.
- Alcuni modelli, come la serializzazione o la riflessione, sono più difficili (ad es.
Activator<Foo>.CreateInstance()
)
Foo x = Foo.TryCreate(); if (x == null) { ... }
). La gestione di un'eccezione ctor è ( Foo x; try { x = new Foo(); } catch (SomeException e) { ... }
). Quando si chiama un metodo normale, preferisco le eccezioni ai codici di errore, ma con la creazione di oggetti, TryCreate
sembra più pulito.
Name
e digitare CsvLine
, piuttosto che esprimere i requisiti tramite i nomi dei metodi. Ciò consentirebbe di sovraccaricare Crea. L'uso di stringhe per entrambi potrebbe essere considerato come "ossessione primitiva" (supponendo che tu non abbia fatto questa scelta per motivi prestazionali noti). Scopri Object Calisthenics per un modo divertente di esplorarlo.