ฉันพยายามจำลองเกมการ์ดโดยที่การ์ดมีคุณสมบัติที่สำคัญสองชุด:
ที่แรกก็คือผลกระทบ นี่คือการเปลี่ยนแปลงสถานะเกมที่เกิดขึ้นเมื่อคุณเล่นไพ่ อินเตอร์เฟสสำหรับเอฟเฟกต์มีดังนี้:
boolean isPlayable(Player p, GameState gs);
void play(Player p, GameState gs);
และคุณสามารถพิจารณาว่าการ์ดนั้นสามารถเล่นได้ถ้าหากคุณมีราคาที่เหมาะสมและเอฟเฟกต์ทั้งหมดสามารถเล่นได้ ชอบมาก
// 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;
}
โอเคจนถึงตอนนี้ค่อนข้างง่าย
ฟีเจอร์ชุดอื่น ๆ ในการ์ดคือความสามารถ ความสามารถเหล่านี้เป็นการเปลี่ยนแปลงสถานะของเกมที่คุณสามารถเปิดใช้งานได้ตามต้องการ เมื่อมากับอินเทอร์เฟซสำหรับสิ่งเหล่านี้ฉันรู้ว่าพวกเขาต้องการวิธีในการพิจารณาว่าสามารถเปิดใช้งานหรือไม่และวิธีการเปิดใช้งาน มันจบลงด้วยการเป็น
boolean isActivatable(Player p, GameState gs);
void activate(Player p, GameState gs);
และฉันรู้ว่ามีข้อยกเว้นในการเรียกว่า "เปิดใช้งาน" แทน "เล่น" Ability
และEffect
มีลายเซ็นเหมือนกันแน่นอน
มันเป็นสิ่งที่ดีหรือไม่ที่มีหลายอินเตอร์เฟสที่มีลายเซ็นเหมือนกัน? ฉันควรใช้เพียงหนึ่งชุดและมีอินเทอร์เฟซเดียวกันสองชุดหรือไม่ ดังนั้น:
Set<Effect> effects;
Set<Effect> abilities;
ถ้าเป็นเช่นนั้นฉันควรทำตามขั้นตอนการเปลี่ยนโฉมใหม่อย่างไรหากถนนเหล่านั้นไม่เหมือนกัน (เมื่อมีการเปิดฟีเจอร์เพิ่มเติม) โดยเฉพาะอย่างยิ่งหากพวกเขาต่างกัน (เช่นพวกเขาทั้งคู่ได้รับสิ่งอื่น และอีกคนเป็นเซตย่อยที่สมบูรณ์) ฉันกังวลเป็นอย่างยิ่งว่าการรวมพวกเขาจะไม่ยั่งยืนทันทีที่มีการเปลี่ยนแปลงบางอย่าง
พิมพ์ดี:
ฉันรู้ว่าคำถามนี้เกิดจากการพัฒนาเกม แต่ฉันรู้สึกว่ามันเป็นปัญหาที่สามารถคืบคลานไปได้อย่างง่ายดายในการพัฒนาที่ไม่ใช่เกมโดยเฉพาะอย่างยิ่งเมื่อพยายามรองรับโมเดลธุรกิจของลูกค้าหลายรายในแอปพลิเคชันเดียว ทุกโครงการที่ฉันเคยทำด้วยอิทธิพลทางธุรกิจมากกว่าหนึ่ง ... นอกจากนี้ตัวอย่างที่ใช้คือตัวอย่างของ Java แต่สิ่งนี้สามารถนำไปใช้กับภาษาเชิงวัตถุจำนวนมากได้อย่างง่ายดาย