
Tetris (ve Yılan oyunu) oyun geliştirme dünyasının "Merhaba Dünya"sıdır. Görünüşte onu bozmak zordur, ancak bu deponun yazarı çok uğraşmış. "Yeni başlayanlar için eğitim materyali" olarak sunulan projeyi inceliyoruz. Evet, kod çalışıyor, proje tamamlanmış, hatta YouTube'da videosu var. Ama aslında orada kötü alışkanlıklar öğretiliyor.
1️⃣ Giriş noktasının olmaması
main.py dosyasında kod dosyanın köküne yığılmış. Hiçbir if __name__ == "__main__": yok. Bu dosyadan bir şey içe aktarmaya çalışırsanız (neden yapasınız ki?), hemen Pygame başlatılır ve bir pencere açılır.2️⃣ Ad alanı sorunu
game.py dosyasında harika bir şey görüyoruz: from blocks import *.Unutmayın:
import * kullandığınız her seferde ad alanını çöple doldurursunuz. Hangi sınıflar geldi? Nereden? Kimse bilmiyor.3️⃣ Orkestra sınıfı
Game sınıfı her şeyi yapıyor: mantığı yönetiyor, puanları hesaplıyor, sesleri yüklüyor, müzik çalıyor ve... blokları çiziyor.SRP (Single Responsibility Principle) ihlali açık. Oyun mantığı
pygame.mixer'ın varlığından veya dikdörtgenlerin nasıl çizileceğinden haberdar olmamalı.# Game.__init__'in derinliklerinde
self.rotate_sound = pygame.mixer.Sound("Sounds/rotate.ogg")
pygame.mixer.music.load("Sounds/music.ogg")Ses kütüphanesini değiştirmek mi istiyorsunuz? Oyun çekirdeğinin tamamını yeniden yazmak zorunda kalırsınız.
4️⃣ Beyin yakan OOP: Hiçbir şey için kalıtım
blocks.py dosyasında klasik bir hata görüyoruz: sadece __init__'e koordinatları içeren bir sözlük yazmak için Block'tan miras alan yedi farklı sınıf (LBlock, JBlock vb.) oluşturulmuş.Bu klasik bir aşırı mühendislik örneğidir. Tüm bu sınıfların benzersiz bir davranışı yok, sadece farklı verileri var.
Nasıl olmalı: Başlangıçta şekil türünü veya yapılandırmayı alan tek bir
Block sınıfı. Veriler ayrı, mantık ayrı.5️⃣ Position sınıfı — neden?
class Position:
def __init__(self, row, column):
self.row = row
self.column = columnİki tam sayıyı depolamak için bütün bir sınıf oluşturmak gereksizdir. Python'da
namedtuple, dataclasses veya son çare olarak basit tuple'lar (row, col) vardır.6️⃣ Sihirli sayılar ve sabit kodlama
if self.next_block.id == 3:
self.next_block.draw(screen, 255, 290)
elif self.next_block.id == 4:
self.next_block.draw(screen, 255, 280)Bu saf "koltuk değneği" bir arayüzdür. Yazar, önizleme alanının merkezini hesaplamak yerine koordinatları belirli blok kimliklerine göre ayarlamış. Yeni bir blok ekleyin ve tüm düzen bozulur.
7️⃣ Mamut çağından kalma puan işleme
game.py dosyasında şunu görüyoruz:def update_score(self, lines_cleared, move_down_points):
if lines_cleared == 1:
self.score += 100
elif lines_cleared == 2:
self.score += 300
# ... ve böyle devam ederNasıl olmalı: Basit bir sözlük veya katsayı listesi bu kodu tek satıra indirgeyebilirdi. Basit eşleştirmeler için
elif zincirleri, yazarın veri yapılarını bilmediğinin kesin bir işaretidir.🧑⚖️ Karar:
Bir eğitim projesi olarak idare eder. Bu tür eğitimlerle öğreniyorsanız, amaçlarının 20 dakikalık bir videoda sonuç göstermek olduğunu, size normal kod yazmayı öğretmek olmadığını unutmayın. Bu kalıpları üretime taşımayın.
#kodu_kızartıyoruz
Yorumlar
0Henüz yorum yok.
Tartışmaya katılmak için giriş yapın.