Tôi đang cố gắng mô hình hóa một trò chơi bài trong đó thẻ có hai bộ tính năng quan trọng:
Đầu tiên là một hiệu ứng. Đây là những thay đổi về trạng thái trò chơi xảy ra khi bạn chơi bài. Giao diện cho hiệu ứng như sau:
boolean isPlayable(Player p, GameState gs);
void play(Player p, GameState gs);
Và bạn có thể coi thẻ có thể chơi được nếu và chỉ khi bạn có thể đáp ứng chi phí của nó và tất cả các hiệu ứng của nó đều có thể chơi được. Thích như vậy:
// in Card class
boolean isPlayable(Player p, GameState gs) {
if(p.resource < this.cost) return false;
for(Effect e : this.effects) {
if(!e.isPlayable(p,gs)) return false;
}
return true;
}
Được rồi, cho đến nay, khá đơn giản.
Các tính năng khác trên thẻ là khả năng. Những khả năng này là những thay đổi về trạng thái trò chơi mà bạn có thể kích hoạt theo ý muốn. Khi đến với giao diện cho những thứ này, tôi nhận ra rằng họ cần một phương pháp để xác định xem chúng có thể được kích hoạt hay không và một phương thức để thực hiện kích hoạt. Nó kết thúc là
boolean isActivatable(Player p, GameState gs);
void activate(Player p, GameState gs);
Và tôi nhận ra rằng ngoại trừ việc gọi nó là "kích hoạt" thay vì "chơi" Ability
và Effect
có cùng chữ ký.
Có phải là một điều xấu khi có nhiều giao diện với một chữ ký giống hệt nhau? Tôi có nên đơn giản sử dụng một và có hai bộ giao diện giống nhau không? Như vậy:
Set<Effect> effects;
Set<Effect> abilities;
Nếu vậy, tôi nên thực hiện các bước tái cấu trúc nào nếu chúng trở nên không giống nhau (vì nhiều tính năng được phát hành), đặc biệt nếu chúng khác nhau (nghĩa là cả hai đều đạt được thứ gì đó không nên, thay vì chỉ có một và cái kia là một tập hợp con hoàn chỉnh)? Tôi đặc biệt lo ngại rằng việc kết hợp chúng sẽ không bền vững ngay khi có gì đó thay đổi.
Bản in tốt:
Tôi nhận ra câu hỏi này được sinh ra từ phát triển trò chơi, nhưng tôi cảm thấy đó là vấn đề có thể dễ dàng phát triển trong quá trình phát triển phi trò chơi, đặc biệt là khi cố gắng điều chỉnh mô hình kinh doanh của nhiều khách hàng trong một ứng dụng chỉ xảy ra với mỗi dự án tôi từng thực hiện với nhiều hơn một ảnh hưởng kinh doanh ... Ngoài ra, đoạn mã được sử dụng là đoạn mã Java, nhưng điều này có thể dễ dàng áp dụng cho vô số ngôn ngữ hướng đối tượng.