Quais são os prós e os contras de ter métodos estáticos de criação de objetos sobre construtores?
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
Poucos em que consigo pensar:
Prós:
- Retorne nulo em vez de lançar uma exceção (nomeie-a
TryCreate). Isso pode tornar o código mais conciso e limpo no lado do cliente. Os clientes raramente esperam que um construtor falhe. - Crie diferentes tipos de objetos com semântica clara, por exemplo,
CreatFromName(String name)eCreateFromCsvLine(String csvLine) - Pode retornar um objeto em cache, se necessário, ou uma implementação derivada.
Contras:
- Menos detectável, mais difícil de ler o código.
- Alguns padrões, como serialização ou reflexão, são mais difíceis (por exemplo
Activator<Foo>.CreateInstance())
Foo x = Foo.TryCreate(); if (x == null) { ... }). A manipulação de uma exceção de ctor é ( Foo x; try { x = new Foo(); } catch (SomeException e) { ... }). Ao chamar um método normal, prefiro exceções a códigos de erro, mas com a criação de objetos, TryCreateparece mais limpo.
Namee CsvLinedigitar, em vez de expressar requisitos por meio de nomes de métodos. Isso permitiria sobrecarregar o Create. O uso de strings para ambos pode ser considerado uma "obsessão primitiva" (supondo que você não tenha feito essa escolha por motivos conhecidos de desempenho). Confira Object Calisthenics para uma maneira divertida de explorar isso.