Baiklah... #kita_goreng_kode!
RPG di konsol — itu dasar. Kode melakukan tugasnya, tetapi ditulis sedemikian rupa sehingga setiap upaya untuk menskalakannya akan menyebabkan SAKIIIIIIIT. Mari kita bahas masalah paling penting 👇
1️⃣ Ctrl+C, Ctrl+V pewarisan
Lihat hierarki armor:
class Armor(Item):
def __init__(self, name, category, strength=None, value_strength=None...): # dan masih 100500 argumen
super().__init__(name, category)
# ...
class Helmet(Armor):
def __init__(self, ...):
super().__init__(...)
class Chestplate(Armor):
# Salinan Helmet
class Greaves(Armor):
# Salinan ChestplateSemua kelas ini (
Helmet, Chestplate, Greaves, Boots) — benar-benar identik. Mereka tidak menambahkan atribut baru maupun perilaku baru. Mereka tidak melakukan apa pun selain memanggil super().__init__. OOP diciptakan bukan untuk mendeskripsikan setiap objek fisik di dunia dengan kelas terpisah. Jika entitas hanya berbeda dalam nama kategori — itu harusnya satu kelas
Armor yang memiliki atribut slot_type (idealnya melalui Enum). 2️⃣ Konstruktor Frankenstein
Lihat bagaimana item dibuat:
crown = Helmet('Шлем Господства', 'Шлем', 'Сила', 5, 'Ловкость', 7, 'Интеллект', 3)Jangan pernah hardcode nama stat dalam signature method. Gunakan dictionary.
Alih-alih parameter yang panjang seperti ini, item harus menerima
stats={'strength': 5, 'agility': 7, 'intellect': 3}.3️⃣ Incest kelas
Kelas
Characteristic menerima hero, lalu melakukan ini:for item in self._hero.slots_equipment.values():
if item:
if hasattr(item, 'value_strength') and item.value_strength:
self.attributes['strength'] += item.value_strengthIni disebut "Tight Coupling" (keterikatan erat). Kelas karakteristik ikut campur tangan ke inventaris hero, memeriksa apakah ada item, lalu melalui
hasattr (yang merupakan solusi darurat dalam 99% kasus) mencoba mengambil stat dari item tersebut. Hero seharusnya menanyai perlengkapannya sendiri dan meneruskan modifier akhir ke sistem karakteristik. Sekarang ekor yang menggerakkan anjing.
4️⃣ Menggunakan Exception untuk logika
Dalam metode
equip_armor kita lihat ini:try:
if key not in self.slots_equipment:
print('Tidak ada slot seperti itu.')
# ... logika ...
except KeyError:
print(f'Item tidak ditemukan')Pertama, menangkap
KeyError secara luas akan menyembunyikan bug nyata dalam kode (misalnya, salah ketik dalam dictionary di dalam try). Kedua, exception — untuk situasi luar biasa, bukan untuk memeriksa keberadaan item di inventaris. Untuk itu ada metode dictionary .get().Singkatnya, untuk permulaan, alih-alih 10 kelas armor yang tidak berguna dan konstruktor yang mengerikan, setidaknya bisa dilakukan seperti ini:
from dataclasses import dataclass
from enum import Enum
class EquipmentSlot(Enum):
HEAD = "Helm"
CHEST = "Pelindung Dada"
WEAPON = "Senjata"
@dataclass
class Equipment:
name: str
slot: EquipmentSlot
stats_bonus: dict[str, int]
# Membuat item:
crown = Equipment(
name='Helm Dominasi',
slot=EquipmentSlot.HEAD,
stats_bonus={'strength': 5, 'agility': 7, 'intellect': 3}
)Dan selesai. Tidak ada duplikasi kode, perlindungan dari salah ketik pada slot melalui Enum, dan sistem stat yang dapat diperluas, di mana besok bisa ditambahkan "Keberuntungan" tanpa menulis ulang
__init__ dari puluhan kelas.OOP bukanlah ketika Anda memiliki kelas terpisah untuk setiap entitas di alam semesta. OOP adalah tentang mengelola kompleksitas dan keadaan.
Tapi untuk pembelajaran satu bulan — ini adalah tahap evolusi yang benar-benar normal.
📖 Baca:
- Kapan kelas di Python itu jahat: 6 kasus ketika Anda mempersulit hidup sendiri
- Prinsip SOLID dalam OOP dengan contoh di Python
Komentar
0Belum ada komentar.
Masuk untuk ikut berdiskusi.