Saya menemukan proyek PythonPlantsVsZombies di GitHub. Ini adalah klon dari game legendaris "Plants vs. Zombies" menggunakan Pygame: dengan animasi, berbagai jenis zombie, dan level melalui JSON. Tapi begitu Anda melihat "di balik kap" — Anda mulai bersimpati pada zombie. Setidaknya mereka tidak perlu memelihara kode ini.

Mari kita bedah mahakarya teknik ini.

1️⃣ Neraka if-elif atau "Pabrik dengan Kruk"
Di file source/state/level.py ada metode addPlant. Saat Anda menanam tanaman di sel, mesin memulai interogasi dengan 19 cabang elif.

"Kamu bunga matahari? Tidak? Mungkin penembak kacang? Juga tidak? Kalau begitu, mungkin ceri?"


if self.plant_name == c.SUNFLOWER:
new_plant = plant.SunFlower(x, y, self.sun_group)
elif self.plant_name == c.PEASHOOTER:
new_plant = plant.PeaShooter(x, y, self.bullet_groups[map_y])
# ... dan seterusnya 17 kali


Ingin menambahkan jenis bunga matahari baru? Pergi ke tengah file dan tulis lagi:
elif self.plant_name == c.SUNSHROOM:
new_plant = plant.SunShroom(x, y, self.sun_group)


Ini adalah antipattern klasik. Di dunia normal, kita menggunakan registri kelas atau pemetaan. Satu kamus — dan aib ini berubah menjadi dua baris elegan.

2️⃣ Sinkronisasi Daftar — Jalan Menuju Skizofrenia
Di source/component/menubar.py, data tentang tanaman (nama, biaya, cooldown) tersebar di empat daftar independen.
Semuanya harus sama panjangnya dan dalam urutan yang ketat.
Salah satu indeks di plant_sun_list? Selamat, sekarang penembak kacang Anda seharga ceri, dan ceri gratis.

Kita punya dataclasses, kamus, OOP, pada akhirnya. Kelompokkan data terkait ke dalam objek, jika tidak debugging akan menjadi neraka.

3️⃣ Efek Samping Global.
Di source/tool.py, inisialisasi Pygame dan pembuatan jendela (SCREEN) terjadi langsung di level modul.
Masalahnya: Anda tidak bisa mengimpor konstanta atau fungsi pembantu dari file ini ke dalam tes tanpa menginisialisasi seluruh inti grafis. Ini membunuh kemungkinan pengujian unit. Logika harus dipisahkan dari "perangkat keras".

4️⃣ "Otak" Pintar dengan Objek Bodoh
Alih-alih menggunakan polimorfisme (di mana setiap tanaman tahu cara menyerangnya sendiri), kelas utama Level secara manual memeriksa nama string: if plant.name == c.THREEPEASHOOTER, dan memutuskan sendiri ke mana harus menembak. Ini membuat kelas tanaman hanya menjadi dekorasi dengan gambar, dan logika game menjadi monolit yang tak terangkat.

Verdik:
Proyek ini keren sebagai demo dan cara untuk bermain-main dengan Pygame. Tapi jika Anda datang dengan pendekatan arsitektur seperti ini ke proyek normal — Anda akan dimakan lebih cepat daripada zombie memakan kacang di baris pertama.

🎓 Apa yang kita pelajari:
1. Jangan buat rantai if-else raksasa di mana polimorfisme bekerja.
2. Kelompokkan data terkait ke dalam objek atau kamus.
3. Jika dalam kode Anda ada frasa "indeks dalam daftar ini sesuai dengan indeks dalam daftar itu" — hapus semuanya dan tulis ulang.
4. Sumber daya (grafis/suara) harus dimuat secara malas (Lazy Loading), bukan "semua sekaligus" saat mengimpor modul.

#goreng_kode