
GitHub'da PythonPlantsVsZombies projesini buldum. Bu, efsanevi "Plants vs. Zombies" oyununun Pygame ile yapılmış bir kopyası: animasyonlar, farklı zombi türleri ve JSON ile seviyeler var. Ama kaputun altına baktığınızda zombilere acımaya başlıyorsunuz. En azından bu kodu desteklemek zorunda değiller.
Bu mühendislik şaheserini inceleyelim.
1️⃣ if-elif Cehennemi veya "Koltuk Değnekli Fabrika"
source/state/level.py dosyasında addPlant metodu yaşıyor. Bir hücreye bitki diktiğinizde motor, 19 adet elif dalından oluşan bir sorgulama başlatıyor."Ayçiçeği misin? Hayır mı? Bezelye atıcı mı? O da değil mi? O zaman belki kiraz?"
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])
# ... ve böyle 17 kez dahaYeni bir ayçiçeği türü eklemek mi istiyorsun? Dosyanın ortasına gidip bir tane daha ekle:
elif self.plant_name == c.SUNSHROOM:
new_plant = plant.SunShroom(x, y, self.sun_group)Bu klasik bir anti-örüntü. Normal dünyada sınıf kaydı veya eşleme kullanırız. Tek bir sözlük bu rezaleti iki zarif satıra dönüştürür.
2️⃣ Liste Senkronizasyonu - Şizofreniye Giden Yol
source/component/menubar.py dosyasında bitki verileri (isimler, maliyet, bekleme süresi) dört bağımsız listeye dağılmış durumda.Hepsi kesinlikle aynı uzunlukta ve kesin sırada olmalı.
plant_sun_list'te bir indeks hatası mı yaptın? Tebrikler, bezelye atıcın artık kiraz fiyatına, kiraz ise bedava.
dataclasses'ler, sözlükler, OOP var sonuçta. İlgili verileri nesnelerde gruplayın, yoksa hata ayıklama cehenneme döner.3️⃣ Küresel Yan Etkiler.
source/tool.py dosyasında Pygame başlatma ve pencere oluşturma (SCREEN) doğrudan modül seviyesinde gerçekleşiyor.Sorun ne: Bu dosyadan testlere bir sabit veya yardımcı fonksiyon import edemezsiniz, tüm grafik çekirdeğini başlatmadan. Bu, birim testi yapma imkanını öldürür. Mantık, "donanımdan" ayrılmalıdır.
4️⃣ Aptal Nesneler Karşısında Akıllı "Beyin"
Polimorfizm kullanmak yerine (her bitkinin nasıl saldıracağını kendisinin bilmesi gibi), ana
Level sınıfı elle isimleri kontrol ediyor: if plant.name == c.THREEPEASHOOTER ve nereye ateş edeceğine kendisi karar veriyor. Bu, bitki sınıflarını sadece resimli dekorasyonlara, oyun mantığını ise kaldırılamaz bir monolide dönüştürüyor.Karar:
Proje demo olarak ve Pygame ile oynamak için harika. Ama bu mimari yaklaşımla normal bir projeye gelirseniz, zombilerin ilk sıradaki cevizi yemesinden daha hızlı bir şekilde sizi yerler.
🎓 Öğrendiklerimiz:
1. Polimorfizmin işe yaradığı yerde devasa
if-else zincirleri yapmayın.2. İlgili verileri nesnelerde veya sözlüklerde gruplayın.
3. Kodunuzda "bu listedeki indeks, şu listedeki indekse karşılık geliyor" ifadesi varsa, her şeyi silin ve yeniden yazın.
4. Kaynaklar (grafik/ses) tembel yükleme (Lazy Loading) ile yüklenmeli, modül import edilirken "hepsi birden" değil.
#kodu_kızartıyoruz
Yorumlar
0Henüz yorum yok.