Katakanlah saya memiliki kelas Musuh, dan konstruktor akan terlihat seperti:
public Enemy(String name, float width, float height, Vector2 position,
float speed, int maxHp, int attackDamage, int defense... etc.){}
Ini terlihat buruk karena konstruktor memiliki begitu banyak parameter, tetapi ketika saya membuat contoh Musuh saya perlu menentukan semua hal ini. Saya juga ingin atribut ini di kelas Musuh, sehingga saya bisa beralih melalui daftar mereka dan mendapatkan / mengatur parameter ini. Saya berpikir mungkin mensubklasifikasikan Musuh menjadi Musuh, Musuh, sementara hardcoding maxHp mereka, dan atribut spesifik lainnya, tetapi kemudian saya akan kehilangan akses ke atribut hardcoded mereka jika saya ingin beralih melalui daftar Musuh (terdiri dari EnemyA, EnemyB, dan EnemyC's).
Saya hanya mencoba mempelajari cara membuat kode dengan bersih. Jika ada bedanya, saya bekerja di Java / C ++ / C #. Titik mana pun di arah yang benar dihargai.
Jawaban:
Solusinya adalah menggabungkan parameter menjadi tipe komposit. Lebar dan Tinggi terkait secara konseptual - mereka menentukan dimensi musuh dan biasanya akan dibutuhkan bersama. Mereka dapat diganti dengan
Dimensions
tipe, atau mungkinRectangle
tipe yang juga mencakup posisi. Di sisi lain, mungkin lebih masuk akal untuk mengelompokkanposition
danspeed
menjadiMovementData
tipe, terutama jika akselerasi kemudian memasuki gambar. Dari konteks Saya berasumsimaxHp
,attackDamage
,defense
, dll juga milik bersama dalamStats
jenis. Jadi, tanda tangan yang direvisi mungkin terlihat seperti ini:Detail halus tempat menggambar garis akan tergantung pada sisa kode Anda dan data apa yang biasanya digunakan bersama.
sumber
Enemy
hanya kelas yang menargetkanPlayer
, tetapi kelas dasar umum merekaCombatant
membutuhkan statistik pertarungan.Dimensions
/MovementData
sebagai wadah data lama biasa) atau metode (jika dia mengubahnya menjadi data abstrak jenis / objek). Sebagai contoh, jika dia belum membuatVector2
jenis, dia mungkin akhirnya melakukan matematika vektorEnemy
.Anda mungkin ingin melihat pola Builder . Dari tautan (dengan contoh pola versus alternatif):
sumber
Menggunakan subclass untuk mempreset beberapa nilai tidak diinginkan. Hanya subkelas ketika tipe musuh baru memiliki perilaku atau atribut baru yang berbeda.
The pola pabrik biasanya digunakan untuk abstrak di atas kelas tepat digunakan, tetapi juga dapat digunakan untuk menyediakan template untuk penciptaan objek:
sumber
Saya akan memesan subklasifikasi ke kelas yang mewakili objek yang mungkin ingin Anda gunakan secara mandiri, misalnya kelas karakter di mana semua karakter, bukan hanya musuh yang memiliki nama, kecepatan, maxHp, atau kelas untuk mewakili sprite yang memiliki tampilan di layar dengan lebar, tinggi, posisi.
Saya tidak melihat ada sesuatu yang salah dengan konstruktor dengan banyak parameter input tetapi jika Anda ingin membaginya sedikit maka Anda dapat memiliki satu konstruktor yang mengatur sebagian besar parameter dan konstruktor lain (kelebihan beban) yang dapat digunakan untuk mengatur yang spesifik dan membuat orang lain mengatur ke nilai default.
Bergantung pada bahasa apa yang Anda pilih untuk digunakan, beberapa dapat menetapkan nilai default untuk parameter input konstruktor Anda seperti:
sumber
Contoh kode untuk ditambahkan ke jawaban Rory Hunter (di Jawa):
Sekarang, Anda dapat membuat instance baru Musuh seperti ini:
sumber