Saya mencoba membuat model permainan kartu di mana kartu memiliki dua set fitur penting:
Yang pertama adalah efek. Ini adalah perubahan kondisi permainan yang terjadi saat Anda memainkan kartu. Antarmuka untuk efek adalah sebagai berikut:
boolean isPlayable(Player p, GameState gs);
void play(Player p, GameState gs);
Dan Anda dapat menganggap kartu tersebut dapat dimainkan jika dan hanya jika Anda dapat memenuhi biayanya dan semua efeknya dapat dimainkan. Seperti itu:
// 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;
}
Oke, sejauh ini, cukup sederhana.
Set fitur lain pada kartu adalah kemampuan. Kemampuan ini adalah perubahan kondisi permainan yang dapat Anda aktifkan sesuka hati. Ketika datang dengan antarmuka untuk ini, saya menyadari mereka membutuhkan metode untuk menentukan apakah mereka dapat diaktifkan atau tidak, dan metode untuk menerapkan aktivasi. Akhirnya menjadi
boolean isActivatable(Player p, GameState gs);
void activate(Player p, GameState gs);
Dan saya menyadari bahwa dengan pengecualian menyebutnya "aktifkan" daripada "bermain", Ability
dan Effect
memiliki tanda tangan yang sama persis.
Apakah buruk memiliki banyak antarmuka dengan tanda tangan yang identik? Haruskah saya menggunakan satu saja, dan memiliki dua set antarmuka yang sama? Seperti itu:
Set<Effect> effects;
Set<Effect> abilities;
Jika demikian, langkah refactoring apa yang harus saya ambil jika tidak menjadi identik (karena lebih banyak fitur dilepaskan), terutama jika mereka berbeda (yaitu keduanya mendapatkan sesuatu yang seharusnya tidak dimiliki oleh orang lain, sebagai lawan dari hanya satu yang mendapatkan dan yang lainnya menjadi subset lengkap)? Saya khususnya khawatir bahwa menggabungkan mereka akan menjadi tidak berkelanjutan segera setelah sesuatu berubah.
Cetak halus:
Saya menyadari pertanyaan ini muncul karena pengembangan game, tetapi saya merasa ini adalah jenis masalah yang bisa dengan mudah muncul dalam pengembangan non-game, terutama ketika mencoba mengakomodasi model bisnis dari beberapa klien dalam satu aplikasi seperti yang terjadi pada setiap proyek yang pernah saya lakukan dengan lebih dari satu pengaruh bisnis ... Juga, cuplikan yang digunakan adalah cuplikan Java, tetapi ini bisa dengan mudah diterapkan pada banyak bahasa berorientasi objek.