Apa pro dan kontra dari memiliki metode pembuatan objek statis di atas konstruktor?
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
Beberapa yang bisa saya pikirkan:
Pro:
- Kembalikan nol alih-alih melempar pengecualian (beri nama
TryCreate). Ini dapat membuat kode lebih singkat dan bersih di sisi klien. Klien jarang mengharapkan konstruktor gagal. - Buat berbagai jenis objek dengan semantik yang jelas, misalnya
CreatFromName(String name)danCreateFromCsvLine(String csvLine) - Dapat mengembalikan objek yang di-cache jika perlu, atau implementasi yang diturunkan.
Cons:
- Kurang dapat ditemukan, lebih sulit untuk membaca skim.
- Beberapa pola, seperti serialisasi atau refleksi lebih sulit (misalnya
Activator<Foo>.CreateInstance())
Foo x = Foo.TryCreate(); if (x == null) { ... }). Menangani pengecualian ctor adalah ( Foo x; try { x = new Foo(); } catch (SomeException e) { ... }). Saat memanggil metode normal, saya lebih suka pengecualian untuk kode kesalahan, tetapi dengan pembuatan objek, TryCreatetampaknya lebih bersih.
Namedan CsvLinemengetik, daripada mengungkapkan persyaratan melalui nama metode. Ini akan memungkinkan Anda untuk membuat berlebihan. Menggunakan string untuk keduanya dapat dianggap sebagai "obsesi primitif" (dengan asumsi Anda tidak membuat pilihan ini karena alasan kinerja yang diketahui). Lihatlah Object Calisthenics untuk mengetahui cara yang menyenangkan untuk menjelajahi ini.