2008-10-01 36 views

Trả lời

10

Có nhiều lý do đây không phải là nói chung được coi là thiết kế tốt, một số trong đó giống như việc thử nghiệm đơn vị khó khăn và khó xử lý lỗi đã được đề cập.

Lý do chính tôi chọn không làm như vậy là đối tượng của bạn và lớp truy cập dữ liệu hiện được kết hợp chặt chẽ, có nghĩa là bất kỳ việc sử dụng đối tượng nào ngoài thiết kế ban đầu yêu cầu phải làm lại đáng kể. Ví dụ, nếu bạn gặp một cá thể mà bạn cần sử dụng đối tượng đó mà không có bất kỳ giá trị nào được gán ví dụ để duy trì một cá thể mới của lớp đó? bạn bây giờ hoặc là phải quá tải các nhà xây dựng và sau đó chắc chắn rằng tất cả các logic khác của bạn xử lý trường hợp mới này, hoặc kế thừa và ghi đè.

Nếu đối tượng và truy cập dữ liệu được tách riêng thì bạn có thể tạo một thể hiện và sau đó không làm ẩm nó. Hoặc nếu bạn có một dự án khác nhau sử dụng cùng một thực thể nhưng sử dụng một lớp kiên trì khác thì các đối tượng có thể sử dụng lại được.

Có nói rằng tôi đã đưa ra những con đường dễ dàng hơn của khớp nối các dự án trong quá khứ :)

+0

"Đã nói rằng tôi đã thực hiện đường dẫn khớp nối dễ dàng hơn trong các dự án trong quá khứ :)" Tôi thích điều đó, cho thấy bối cảnh đó rất quan trọng. – Sully

1

Vấn đề duy nhất tôi có thể nghĩ đến với phương pháp này là bất kỳ lỗi nào từ việc khởi tạo DB sẽ được nhân giống như trường hợp ngoại lệ từ các nhà xây dựng.

11

Vâng .. Tôi sẽ không. Nhưng sau đó một lần nữa cách tiếp cận của tôi thường liên quan đến lớp KHÔNG chịu trách nhiệm về việc lấy dữ liệu riêng của nó.

4

Yea, bạn CÓ THỂ làm điều đó, nhưng nó không phải là thiết kế tốt nhất, và xử lý lỗi trong các nhà xây dựng không phải là gọn gàng như ở nơi khác.

7

Nó cũng sẽ làm cho nó khó khăn để viết bài kiểm tra đơn vị cho lớp như bạn sẽ không thể buộc các lớp để sử dụng một phiên bản Mock/Stub của lớp db. Xem ở đây: http://en.wikipedia.org/wiki/Dependency_injection

7

Bạn có thể sử dụng một lần mẫu nếu bạn tham khảo một kết nối DB:

public class MyClass : IDisposable 
{ 
    private Database db; 
    private int? _id; 

    public MyClass() 
    { 
     db = new Database(); 
    } 

    public int Id 
    { 
     get 
     { 
      if (_id == null) _id = db.GetIdFor(typeof(MyClass)); 
      return _id.Value; 
     } 
    } 

    public void Dispose() 
    { 
     db.Close(); 
    } 
} 

Cách sử dụng:

using (var x = new MyClass()) 
{ 
    /* ... */ 

} //closes DB by calling IDisposable.Dispose() when going out of "using" scope 
-3

Tại sao mọi người muốn sử dụng một đối tượng giả/bài thay vì thật? Bạn có đồng ý rằng các nhà sản xuất xe hơi nên sử dụng các mô hình bìa giấy để khắc phục sự cố?

+2

Đối với thử nghiệm tích hợp, bạn hoàn toàn sử dụng lớp đầy đủ. Đối với một thử nghiệm đơn vị, bạn chỉ muốn xác minh rằng đối tượng của bạn gọi những gì nó nói nó sẽ. Bạn có thể sử dụng một bài kiểm tra đơn vị hoặc tích hợp khác để xác minh rằng tài nguyên của nó thực hiện những gì họ nói cũng sẽ như vậy. –

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