2010-03-11 35 views
7

Tôi cần một lớp cơ sở cho các lớp DTO của tôi sẽ được sử dụng trong các giao diện chung của tôi.Có thiết kế cơ sở không có lớp rỗng không?

Nhưng các lớp DTO không có điểm chung. Chúng chỉ là những lớp câm có chứa một số thuộc tính.

public void GetGridData() 
{ 

    IDataForGrid<DTOBase> aa; 

    if(request == 1) aa = new CustomerGridData; 
    if(request == 2) aa = new OrderGridData; 

    var coll = aa.GetList(); 
} 

public class CustomerGridData : IDataForGrid<CustomerDTO> 
{ 
    ... 
} 
+3

Đối tượng là một lớp cơ sở trống :) –

+11

@Brian - Đối tượng không trống :) –

+0

liên quan đến http://stackoverflow.com/questions/2424099/generic-interface-problem dành cho nền –

Trả lời

6

Nếu họ có điểm chung, những gì thì bạn sẽ làm gì với các trường hợp bạn lấy ra khỏi danh sách của bạn?

Trong mọi trường hợp, có lớp cơ sở có nghĩa là khi (okay, nếu) bạn xác định một cái gì đó họ làm cần phải có điểm chung sau này, bạn không cần phải quay trở lại và cấu trúc lại (lại cơ sở) mọi thứ. Nhưng tôi sẽ xem xét sử dụng một giao diện chứ không phải là một lớp cơ sở cho loại điều này trong mọi trường hợp, vì nó không âm thanh như có một nhu cầu mạnh mẽ để tái sử dụng thực hiện cơ bản (vì họ không có gì chung chưa!). Nó sẽ phụ thuộc vào những gì bạn nghĩ rằng họ có thể sẽ có chung sau này.

6

Nó không phải là một thiết kế xấu, mặc dù hơi không phổ biến. Hãy suy nghĩ theo cách này - có ít nhất hai lợi ích trong khi không có nhược điểm:

  • Lớp cơ sở đóng vai trò là bộ lọc cho giao diện của bạn để bạn không thể truyền bất kỳ đối tượng nào cho chúng - chỉ DTO của bạn các đối tượng. Các giao diện điểm đánh dấu cũng có thể thực hiện điều này.
  • Khi họ cuối cùng đạt được điểm chung, bạn sẽ dễ dàng thêm nó vào đó và bạn sẽ không phải cấu trúc lại mọi thứ.
2

Nguyên tắc mã hóa .NET nói rằng có lớp cơ sở trống hoặc giao diện (còn gọi là giao diện “thẻ”) thực sự là kiểu xấu. Kiểu ưa thích là sử dụng thuộc tính thay vì chú thích các lớp cùng loại. Ngoài ra còn có một số FxCop rule để thực thi quy ước này.

Tuy nhiên, đôi khi tôi (trong trường hợp hiếm hoi) sử dụng thành ngữ này khi lớp cơ sở chung hữu ích để biểu thị một hệ thống phân cấp chung ngay cả khi không có chức năng chung nào tồn tại. Thuộc tính không thể được sử dụng cho việc này.

Ví dụ: trong thông dịch viên cho một ngôn ngữ lập trình, một số phương thức trả về lớp cơ sở đặc biệt Value, tức là một thứ có giá trị bên trong ngôn ngữ lập trình đó. Về cơ bản, giá trị này có thể là mọi thứ từ một số đến một chuỗi (trong đó, là các lớp đặc biệt, không phải là System.Int32 hoặc System.String) cho đối tượng hỗn hợp. Tôi có thể cũng trả lại System.Object nhưng điều này sẽ làm cho việc nhập giao diện công khai của tôi yếu hơn.

Lợi nhuận mã tốt, tự tạo tài liệu từ giao diện bị hạn chế.

+7

Một giao diện điểm đánh dấu/lớp có thể máy chủ như là một hạn chế biên dịch thời gian để bạn không thể vượt qua các đối tượng sai với một phương pháp. Các thuộc tính không thể làm điều này. Vì vậy, tôi có xu hướng không đồng ý với các hướng dẫn. –

+1

Vừa mới đăng liên kết này! http://msdn.microsoft.com/en-us/library/ms182128%28VS.80%29.aspx –

+0

@Vilx: như tôi (xem ví dụ tôi đã thêm). Nhưng nó * là * một hướng dẫn FxCop. –

1

Trong java, đây được gọi là Tag Interface. Liên kết cung cấp một số nền tảng tốt về giao diện thẻ, cách sử dụng và các vấn đề của họ.

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