2013-04-24 41 views
7

Tôi tò mò muốn biết liệu có ai có đề xuất hoặc mẫu thay thế để xây dựng đối tượng tùy chỉnh với dữ liệu từ một đối tượng khác hay không.Xây dựng một phương thức xây dựng đối tượng tĩnh so với phương thức mở rộng

Hiện tại, chúng tôi đang khám phá ba phương pháp.

1) Static Xây dựng Phương pháp

public class MyObject 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public static MyObject Build(DataRow data) 
    { 
     MyObject newObject = new MyObject(); 
     newObject.Id = Convert.ToInt32(data["ID"]); 
     newObject.Name = Convert.ToString(data["NAME"]); 
     return newOjbect; 
    } 
} 

2) Builder Lớp

public class MyObject 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class MyObjectBuilder 
{ 
    public static MyObject Build(DataRow data) 
    { 
     MyObject newObject = new MyObject(); 
     newObject.Id = Convert.ToInt32(data["ID"]); 
     newObject.Name = Convert.ToString(data["NAME"]); 
     return newOjbect; 
    } 
} 

3) Phương pháp mở rộng

public class MyObject 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public static class MyObjectExtensions 
{ 
    public static void Build(this MyObject obj, DataRow data) 
    { 
     obj.Id = Convert.ToInt32(data["ID"]); 
     obj.Name = Convert.ToString(data["NAME"]); 
    } 
} 

Một trong những cân nhắc chính là chúng ta sẽ tiếp cận với chúng ta bằng cách nào cần thêm một tham chiếu using của System.Data vào lớp học. Tại thời điểm này, chúng tôi đang do dự để thêm phụ thuộc này trực tiếp vào lớp MyObject của chúng tôi.

Có ai có thể đưa ra ưu điểm hay nhược điểm cho bất kỳ phương pháp nào trong số này hoặc có thể cung cấp các giải pháp thay thế cho phép khả năng mở rộng và khả năng thử nghiệm tốt hơn?

Trả lời

6

Bất lợi của phương pháp đầu tiên là bạn trộn lẫn định nghĩa đối tượng với logic của trình tạo. Xem xét kiến ​​trúc tổng thể mà bạn chọn, bạn có thể muốn giữ các đối tượng mô hình của mình như là các POCO do đó không có logic sao chép được định nghĩa trong nó.

Tôi sẽ không sử dụng phương pháp mở rộng, theo ý kiến ​​của tôi, có liên quan hơn để mở rộng các tính năng từ khung (thường là chuỗi hoặc các lớp IEnumerable) khi bạn cần một tính năng cụ thể thông qua tất cả các dự án của bạn.

Vì vậy, giải pháp thứ hai là thú vị vì nó cho phép bạn tách định nghĩa đối tượng khỏi logic xây dựng. Tuy nhiên, bạn có thể xem xét số lượng đối tượng bạn muốn áp dụng. Nếu bạn có nhiều người trong số họ, nó có thể trở thành một mớ hỗn độn để duy trì.

2

Bạn có thể sử dụng nhà thầu

public class MyObject 
{ 
    public int Id { get; private set; } 
    public string Name { get; private set; } 

    public MyObject(int Id,string Name) 
    { 
     this.Id = Id; 
     this.Name = Name; 
    } 

    public MyObject(DataRow data) 
    { 
     Id = Convert.ToInt32(data["ID"]); 
     Name = Convert.ToString(data["NAME"]); 
    } 
} 

Nếu Id loại được Guid có thể có constructor mặc định.

MyObject myObject = new MyObject(data) 

trông dễ đọc hơn sau đó

MyObject myObject = MyObject.Build(data) 

Tôi nghĩ rằng phương pháp khuyến nông không phù hợp bởi vì tạo ra các đối tượng liên quan đến nhà nước, nhưng không đến hành vi, trong khi phương pháp mở rộng liên quan đến hành vi của đối tượng.

Các vấn đề liên quan