Quels sont les avantages et les inconvénients d'avoir des méthodes de création d'objets statiques par rapport aux constructeurs?
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
Peu de choses auxquelles je peux penser:
Avantages:
- Retourne null au lieu de lever une exception (nommez-la
TryCreate
). Cela peut rendre le code plus concis et plus propre du côté client. Les clients s'attendent rarement à l'échec d'un constructeur. - Créez différents types d'objets avec une sémantique claire, par exemple
CreatFromName(String name)
etCreateFromCsvLine(String csvLine)
- Peut renvoyer un objet mis en cache si nécessaire, ou une implémentation dérivée.
Les inconvénients:
- Code moins découvrable, plus difficile à parcourir.
- Certains modèles, comme la sérialisation ou la réflexion, sont plus difficiles (par exemple
Activator<Foo>.CreateInstance()
)
Foo x = Foo.TryCreate(); if (x == null) { ... }
). La gestion d'une exception ctor est ( Foo x; try { x = new Foo(); } catch (SomeException e) { ... }
). Lors de l'appel d'une méthode normale, je préfère les exceptions aux codes d'erreur, mais avec la création d'objet, cela TryCreate
semble plus propre.
Name
et de taper CsvLine
plutôt que d'exprimer des exigences via des noms de méthode. Cela vous permettrait de surcharger Create. L'utilisation de chaînes pour les deux pourrait être considérée comme une «obsession primitive» (en supposant que vous n'ayez pas fait ce choix pour des raisons de performances connues). Découvrez Object Calisthenics pour une façon amusante d'explorer cela.