OK .. sau tất cả các cuộc thảo luận Tôi đang thay đổi câu hỏi của mình một chút để phản ánh tốt hơn một ví dụ cụ thể mà tôi đang giải quyết.
Tôi có hai lớp ModelOne
và ModelTwo
, Các lớp này thực hiện loại chức năng tương tự nhưng không liên quan đến nhau. Tuy nhiên tôi có một lớp thứ ba CommonFunc
có chứa một số chức năng nào đó được thực hiện trong cả hai ModelOne
và ModelTwo
và đã được một nhân tố ra theo DRY
. Hai mô hình được khởi tạo trong ModelMain
lớp (bản thân nó được khởi tạo ở mức cao hơn, v.v. - nhưng tôi đang dừng ở cấp độ này).
Container IoC mà tôi đang sử dụng là Microsoft Unity . Tôi không giả vờ là một chuyên gia về nó, nhưng sự hiểu biết của tôi là bạn đăng ký một bộ giao diện và lớp với container và khi bạn muốn một lớp cụ thể, bạn yêu cầu bộ chứa IoC cho bất kỳ đối tượng nào phù hợp với một giao diện cụ thể. Điều này ngụ ý rằng đối với mọi đối tượng tôi muốn khởi tạo từ Unity, phải có một giao diện phù hợp. Bởi vì mỗi lớp của tôi thực hiện chức năng khác nhau (và không chồng chéo), điều này có nghĩa là có tỷ lệ 1: 1 giữa giao diện và lớp 1 . Tuy nhiên, điều đó không có nghĩa là tôi đang viết một giao diện cho mỗi lớp tôi viết.
Vì vậy, mã khôn ngoan tôi kết thúc với 2 :
public interface ICommonFunc
{
}
public interface IModelOne
{
ICommonFunc Common { get; }
..
}
public interface IModelTwo
{
ICommonFunc Common { get; }
..
}
public interface IModelMain
{
IModelOne One { get; }
IModelTwo Two { get; }
..
}
public class CommonFunc : ICommonFunc { .. }
public class ModelOne : IModelOne { .. }
public class ModelTwo : IModelTwo { .. }
public class ModelMain : IModelMain { .. }
Câu hỏi là về cách tổ chức giải pháp của tôi. Tôi có nên giữ lớp và giao diện với nhau? Hay tôi nên giữ các lớp và giao diện cùng nhau? VÍ DỤ:
Cách 1 - Tổ chức theo tên lớp
MySolution
|
|-MyProject
| |
|-Models
| |
|-Common
| |
| |-CommonFunc.cs
| |-ICommonFunc.cs
|
|-Main
| |
| |-IModelMain.cs
| |-ModelMain.cs
|
|-One
| |
| |-IModelOne.cs
| |-ModelOne.cs
|
|-Two
|
|-IModelTwo.cs
|-ModelTwo.cs
|
Tùy chọn 2 - Được tổ chức theo chức năng (hầu hết)
MySolution
|
|-MyProject
| |
|-Models
| |
|-Common
| |
| |-CommonFunc.cs
| |-ICommonFunc.cs
|
|-IModelMain.cs
|-IModelOne.cs
|-IModelTwo.cs
|-ModelMain.cs
|-ModelOne.cs
|-ModelTwo.cs
|
Tùy chọn 3 - Giao diện và triển khai
MySolution
|
|-MyProject
|
|-Interfaces
| |
| |-Models
| | |
| |-Common
| | |-ICommonFunc.cs
| |
| |-IModelMain.cs
| |-IModelOne.cs
| |-IModelTwo.cs
|
|-Classes
|
|-Models
| |
|-Common
| |-CommonFunc.cs
|
|-ModelMain.cs
|-ModelOne.cs
|-ModelTwo.cs
|
Tùy chọn 4 - Lấy ví dụ về chức năng
MySolution
|
|-MyProject
| |
|-Models
| |
|-Components
| |
| |-Common
| | |
| | |-CommonFunc.cs
| | |-ICommonFunc.cs
| |
| |-IModelOne.cs
| |-IModelTwo.cs
| |-ModelOne.cs
| |-ModelTwo.cs
|
|-IModelMain.cs
|-ModelMain.cs
|
Tôi sắp xếp tùy chọn không thích 1 vì tên lớp trong đường dẫn. Nhưng vì tôi đang có xu hướng tỷ lệ 1: 1 do sự lựa chọn / sử dụng IoC của tôi (và điều đó có thể gây tranh cãi) nên điều này có lợi thế khi thấy mối quan hệ giữa các tệp.
Tùy chọn 2 hấp dẫn tôi, nhưng bây giờ tôi đã làm vấy bẩn vùng nước giữa ModelMain
và các mô hình phụ.
Tùy chọn 3 hoạt động để tách định nghĩa giao diện khỏi việc triển khai, nhưng bây giờ tôi có các ngắt nhân tạo này trong các tên đường dẫn.
Tùy chọn 4. Tôi đã chọn Tùy chọn 2 và điều chỉnh nó để tách các thành phần khỏi mô hình mẹ.
Có lý do chính đáng để thích cái này hơn cái kia không? Hoặc bất kỳ bố trí tiềm năng khác mà tôi đã bỏ lỡ?
1. Frank đã đưa ra một nhận xét rằng có tỷ lệ 1: 1 trở lại các ngày. ++ và các tệp .cpp. Tôi biết anh ấy đến từ đâu. Sự hiểu biết của tôi về Unity dường như đưa tôi vào góc này, nhưng tôi cũng không chắc chắn làm thế nào để thoát khỏi nó nếu bạn cũng đang theo dõi câu ngạn ngữ của Program to an interface
Nhưng đó là một cuộc thảo luận cho một ngày khác.
2. Tôi đã bỏ qua các chi tiết của từng hàm tạo đối tượng. Đây là nơi container IoC tiêm các đối tượng theo yêu cầu.
Client1
cần một IBase
, nó cung cấp một Derived1
. Khi Client2
cần một IBase
, IoC cung cấp một Derived2
.
interface
nó. An interface
thực sự chỉ là một lớp trừu tượng với tất cả các thành viên ảo.