Tôi hiện đang vật lộn với một vấn đề phụ thuộc vòng tròn khi thiết kế các lớp học của tôi.Thiết kế OO và phụ thuộc vòng tròn
Kể từ khi tôi đọc về số Anemic Domain Model (điều mà tôi đã làm mọi lúc), tôi thực sự đã cố gắng tránh xa việc tạo ra các đối tượng miền chỉ là "getters of getters and setters" và trở về nguồn gốc OO của tôi.
Tuy nhiên, vấn đề bên dưới là vấn đề mà tôi gặp phải rất nhiều và tôi không chắc mình nên giải quyết nó như thế nào.
Giả sử chúng tôi có một lớp học Nhóm, có nhiều người chơi Người chơi. Nó không quan trọng môn thể thao này là gì :) Một nhóm có thể thêm và loại bỏ người chơi, theo cách giống như một người chơi có thể rời khỏi một đội và tham gia một nhóm khác.
Vì vậy, chúng tôi có đội ngũ, trong đó có một danh sách các cầu thủ:
public class Team {
private List<Player> players;
// snip.
public void removePlayer(Player player) {
players.remove(player);
// Do other admin work when a player leaves
}
}
Sau đó, chúng ta có Player, trong đó có một tham chiếu đến Đội bóng:
public class Player {
private Team team;
public void leaveTeam() {
team = null;
// Do some more player stuff...
}
}
Người ta có thể giả định rằng cả hai phương pháp (loại bỏ và rời khỏi) có logic theo miền cụ thể cần phải chạy bất cứ khi nào một nhóm loại bỏ một người chơi và một người chơi rời khỏi một nhóm. Vì vậy, suy nghĩ đầu tiên của tôi là khi một Đội đá một cầu thủ, removePlayer (...) cũng nên gọi phương thức player.leaveTeam() ...
Nhưng sau đó những gì nếu chơi là lái khởi hành - nên phương thức leaveTeam() gọi team.removePlayer (này)? Không phải không tạo ra một vòng lặp vô hạn!
Trong quá khứ, tôi vừa tạo các đối tượng địa lý "câm" POJO và có một lớp dịch vụ thực hiện công việc. Nhưng ngay cả bây giờ tôi vẫn còn có vấn đề rằng: để tránh phụ thuộc vòng tròn, lớp dịch vụ vẫn có liên kết nó tất cả cùng nhau - ví dụ:
public class SomeService {
public void leave(Player player, Team team) {
team.removePlayer(player);
player.leaveTeam();
}
}
Tôi có phức tạp hơn điều này? Có lẽ tôi đang thiếu một số lỗi thiết kế rõ ràng. Bất kì phản hồi nào cũng sẽ được đánh giá cao.
Cảm ơn tất cả các câu trả lời. Tôi chấp nhận giải pháp của Grodriguez vì nó là rõ ràng nhất (không thể tin rằng nó không xảy ra với tôi) và dễ thực hiện. Tuy nhiên, DecaniBass thực hiện một điểm tốt. Trong tình huống tôi đang mô tả, người chơi có thể rời khỏi một đội (và nhận thức được liệu anh ấy có đang ở trong một đội hay không) cũng như cả đội lái xe. Nhưng tôi đồng ý với quan điểm của bạn và tôi không thích ý tưởng rằng có hai "điểm vào" trong quá trình này. Cảm ơn một lần nữa.
Có thể chỉ là tôi, nhưng tôi thích sử dụng nếu ... khác càng ít càng tốt. Tôi đã nhận thấy nó làm cho mã một chút ít bảo trì –
players.remove() sẽ trả về true nếu bộ sưu tập đã được thay đổi; không cần phải làm .contains(). – KarlP
@KarlP: Tôi biết, nhưng tôi nghĩ việc kiểm tra rõ ràng sẽ làm cho logic rõ ràng hơn. – Grodriguez