Những ưu và nhược điểm của việc có các phương thức tạo đối tượng tĩnh so với các hàm tạo là gì?
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
Vài điều mà tôi có thể nghĩ đến:
Ưu điểm:
- Trả về null thay vì ném một ngoại lệ (đặt tên cho nó
TryCreate). Điều này có thể làm cho mã ngắn gọn hơn và sạch hơn về phía khách hàng. Khách hàng hiếm khi mong đợi một nhà xây dựng thất bại. - Tạo các loại đối tượng khác nhau với ngữ nghĩa rõ ràng, ví dụ
CreatFromName(String name)vàCreateFromCsvLine(String csvLine) - Có thể trả về một đối tượng được lưu trữ nếu cần thiết hoặc thực hiện dẫn xuất.
Nhược điểm:
- Ít khám phá hơn, khó đọc mã hơn.
- Một số mẫu, như tuần tự hóa hoặc phản chiếu là khó khăn hơn (ví dụ
Activator<Foo>.CreateInstance())
Foo x = Foo.TryCreate(); if (x == null) { ... }). Xử lý một ngoại lệ ctor là ( Foo x; try { x = new Foo(); } catch (SomeException e) { ... }). Khi gọi một phương thức bình thường, tôi thích các ngoại lệ hơn cho các mã lỗi, nhưng với việc tạo đối tượng, TryCreatecó vẻ sạch hơn.
Namevà nhập CsvLine, thay vì thể hiện các yêu cầu thông qua tên phương thức. Điều này sẽ cho phép bạn quá tải Tạo. Sử dụng chuỗi cho cả hai có thể được coi là "nỗi ám ảnh nguyên thủy" (giả sử bạn không đưa ra lựa chọn này vì lý do hiệu suất đã biết). Kiểm tra Object Calisthenics cho một cách thú vị để khám phá điều này.