Yapıcılar üzerinde statik nesne oluşturma yöntemlerine sahip olmanın avantajları ve dezavantajları nelerdir?
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
Birkaç düşünebilirim:
Artıları:
- İstisna atmak yerine null değerini döndürün (adlandırın
TryCreate
). Bu, istemci tarafında kodu daha kısa ve temiz hale getirebilir. Müşteriler nadiren bir kurucunun başarısız olmasını bekler. - Net semantik, örneğin nesnelerin farklı türde oluşturun
CreatFromName(String name)
veCreateFromCsvLine(String csvLine)
- Gerekirse önbelleğe alınmış bir nesne veya türetilmiş bir uygulama döndürebilir.
Eksileri:
- Daha az keşfedilebilir, kod gözden kaçırılması daha zor.
- Serileştirme veya yansıma gibi bazı desenler daha zordur (ör.
Activator<Foo>.CreateInstance()
)
Foo x = Foo.TryCreate(); if (x == null) { ... }
). Bir ctor istisnasını işlemek ( Foo x; try { x = new Foo(); } catch (SomeException e) { ... }
). Normal bir yöntem çağırırken, hata kodları için istisnaları tercih ederim, ancak nesne oluşturmada TryCreate
daha temiz görünüyor.
Name
ve oluşturmak daha iyi olabilir CsvLine
. Bu, Create'i aşırı yüklemenize izin verir. Her ikisi için dize kullanmak "ilkel saplantı" olarak kabul edilebilir (bilinen performans nedenleriyle bu seçimi yapmadığınız varsayılarak). Bunu keşfetmenin eğlenceli bir yolu için Object Calisthenics'e göz atın .