ข้อดีและข้อเสียของการมีวิธีสร้างวัตถุแบบสแตติกเหนือตัวสร้างคืออะไร
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
ไม่กี่คนที่ฉันสามารถคิด:
ข้อดี:
- ส่งคืน null แทนการโยนข้อยกเว้น (ตั้งชื่อ
TryCreate) สิ่งนี้สามารถทำให้รหัสสั้นลงและสะอาดยิ่งขึ้นในฝั่งไคลเอ็นต์ ลูกค้าไม่ค่อยคาดหวังว่านวกรรมิกจะล้มเหลว - สร้างวัตถุประเภทต่าง ๆ ด้วยความหมายที่ชัดเจนเช่น
CreatFromName(String name)และCreateFromCsvLine(String csvLine) - สามารถส่งคืนวัตถุแคชหากจำเป็นหรือการใช้งานที่ได้รับมา
จุดด้อย:
- ค้นพบน้อยลงและยากต่อการอ่านโค้ด
- รูปแบบบางอย่างเช่นการจัดลำดับหรือการสะท้อนนั้นยากกว่า (เช่น
Activator<Foo>.CreateInstance())
Foo x = Foo.TryCreate(); if (x == null) { ... }) การจัดการข้อยกเว้น ctor คือ ( Foo x; try { x = new Foo(); } catch (SomeException e) { ... }) เมื่อเรียกวิธีการปกติฉันชอบข้อยกเว้นรหัสข้อผิดพลาด แต่ด้วยการสร้างวัตถุTryCreateดูเหมือนสะอาดขึ้น
NameและCsvLineพิมพ์ได้ดีกว่าความต้องการโดยใช้ชื่อวิธีการ สิ่งนี้จะช่วยให้คุณสร้างได้มากเกินไป การใช้สตริงสำหรับทั้งคู่อาจถือได้ว่าเป็น "ความหลงใหลดั้งเดิม" (สมมติว่าคุณไม่ได้เลือกตัวเลือกนี้เนื่องจากเหตุผลด้านประสิทธิภาพที่ทราบ) ลองดูObject Calisthenicsเพื่อความสนุกในการสำรวจสิ่งนี้