Bạn có thể biện minh (cho chính mình) tại sao lớp học phụ thuộc vào 10 lớp khác không? Có các biến thành viên mà bạn sử dụng để kết hợp với nhau một tập con của các lớp đó không? Nếu vậy, điều đó chỉ ra rằng lớp này sẽ được chia nhỏ sao cho lớp được trích xuất sẽ phụ thuộc vào tập hợp con và các biến liên kết trạng thái đó với nhau sẽ nằm trong lớp được trích xuất. Với 10 phụ thuộc, có thể lớp học này đơn giản phát triển quá lớn và cần phải có nội bộ của nó bị hỏng.
Một lưu ý về câu cuối cùng của bạn: sự phụ thuộc thứ tự như vậy cũng có thể là một mùi mã, do đó, có lẽ tốt không để lộ nó trong giao diện của bạn. Trong thực tế, xem xét liệu các yêu cầu đặt hàng có phải là do các hoạt động cần được thực hiện theo một thứ tự cụ thể (đó là sự phức tạp của thuật toán hoặc giao thức), hoặc vì bạn đã thiết kế các lớp của bạn phụ thuộc lẫn nhau. Nếu sự phức tạp là do thiết kế của bạn, refactor để loại bỏ sự phụ thuộc theo thứ tự nếu có thể.
Nếu bạn không thể tái cấu trúc (sự phức tạp là tất yếu và bạn có vấn đề phối hợp khủng khiếp), bạn có thể trừu tượng hóa sự xấu xí và giữ cho người dùng lớp này được bảo vệ (nhà xây dựng, nhà máy, vòi phun, v.v.).
Chỉnh sửa: Bây giờ tôi đã nghĩ về nó, tôi không tin rằng những phức tạp cần thiết của thuật toán hoặc giao thức của bạn không thể trừu tượng một chút (mặc dù có thể là trường hợp). Tùy thuộc vào vấn đề cụ thể của bạn, các điểm tương đồng trong các thao tác của các lớp phụ thuộc đó có thể được giải quyết tốt hơn với mẫu Chiến lược hoặc mẫu Observer (trình nghe sự kiện). Bạn có thể phải bao bọc các lớp này trong các lớp thích nghi chúng với các giao diện hơi khác so với những gì chúng hiện đang phơi bày. Bạn sẽ phải đánh giá sự cân bằng của việc có mã trong lớp quái vật này trở nên dễ đọc hơn (yay) với chi phí lên đến 10 lớp khác trong dự án của bạn (boo).
Tôi cũng muốn tạo phụ lục tóm tắt việc xây dựng lớp này. Có vẻ quan trọng là bất kỳ lớp nào phụ thuộc vào lớp này cũng sử dụng mẫu Dependency Injection.Bằng cách đó, nếu bạn sử dụng công cụ xây dựng, nhà máy, vòi phun, v.v. bạn không vô tình cướp đi một số lợi ích của việc sử dụng mẫu DI (điều quan trọng nhất trong tâm trí của tôi là khả năng thay thế các đối tượng giả để thử nghiệm) .
Chỉnh sửa 2 (dựa trên chỉnh sửa của bạn):
Suy nghĩ đầu tiên của tôi là "những gì, không phụ thuộc khai thác gỗ?" :)
Ngay cả khi biết phụ thuộc là gì, rất khó để đưa ra lời khuyên hữu ích.
Đầu tiên: trách nhiệm của mọi người là gì? Tại sao lớp này phụ thuộc vào mã điều khiển (logic nghiệp vụ) và trên mã Mô hình (hai lớp truy cập cơ sở dữ liệu khác nhau, với các lớp DAO)?
Tùy thuộc vào cả DAO và các lớp truy cập DB là một mùi mã. Mục đích của DAO là gì? Mục đích của các lớp DB là gì? Bạn đang cố gắng hoạt động ở nhiều cấp độ trừu tượng?
Một trong những nguyên tắc của OO là dữ liệu và hành vi được đưa vào những thứ nhỏ được gọi là lớp học. Bạn có vi phạm điều này khi bạn tạo ra lớp logic kinh doanh này khác với các đối tượng mà nó thao tác riêng biệt với DAO khác biệt với lớp này không? Liên quan: Hãy chuyển hướng ngắn gọn thành SOLID.
Thứ hai: Một lớp để tải cấu hình. Mùi hôi. Dependency Injection giúp bạn xác định các phụ thuộc và trao đổi chúng. Lớp quái vật của bạn phụ thuộc vào các thông số nhất định. Các tham số này được nhóm vào lớp cấu hình này vì ...? Tên của lớp cấu hình này là gì? Là DBparameters? nếu có, nó thuộc về (các) đối tượng DB, không phải lớp này. Có phải nó giống như cấu hình? Nếu vậy, bạn đã có một bộ phun phụ thuộc nhỏ ngay tại đó (được cấp, nó có lẽ chỉ tiêm chuỗi hoặc giá trị int thay vì dữ liệu tổng hợp như các lớp, nhưng tại sao?). Lúng túng.
Thứ ba: Bài học quan trọng nhất tôi học được từ Refactoring là mã của tôi bị hút. Mã của tôi không chỉ hút, nhưng không có một biến đổi nào để làm nó ngừng hút. Điều tốt nhất tôi có thể hy vọng là làm cho nó ít hút hơn. Một khi tôi đã làm điều đó, tôi có thể làm cho nó hút ít hơn một lần nữa. Và một lần nữa. Một số mẫu thiết kế là xấu, nhưng chúng tồn tại để cho phép mã sucky của bạn chuyển sang mã ít sucky hơn. Vì vậy, bạn có globals của bạn và làm cho họ singletons. Sau đó, bạn loại bỏ những người độc thân của bạn. Đừng nản lòng vì bạn vừa mới tái cấu trúc để thấy rằng mã của bạn vẫn còn hút. Nó hút ít hơn. Vì vậy, đối tượng tải cấu hình của bạn có thể ngửi, nhưng bạn có thể quyết định rằng đó không phải là phần dễ vỡ nhất trong mã của bạn. Trong thực tế, bạn có thể thấy rằng nỗ lực để "sửa chữa" nó không phải là giá trị nó.
có thể trùng lặp của [Dependency Injection Constructor Madness] (http://stackoverflow.com/questions/2420193/dependency-injection-constructor-madness) –
khi bạn sử dụng một số loại ORM thì tất cả 4 DAO có thể được thay thế bằng Đối tượng UnitOfWork. – Firo