Zaten birkaç güzel cevabın var, ama sorunuzdaki odadaki dev fil şu:
miras kullanımından kaçınılması gereken birinden duydum ve bunun yerine arayüzleri kullanmalıyız.
Bir kural olarak, birileri size bir kural getirdiğinde, görmezden gelin. Bu sadece "birileri size bir şey söylüyor" için değil aynı zamanda internette bir şeyler okumak için de geçerli. Nedenini bilmiyorsanız (ve arkasında durabiliyorsanız), bu tür bir tavsiye değersizdir ve genellikle çok zararlıdır.
Tecrübelerime göre, OOP'deki en önemli ve faydalı kavramlar "düşük eşleşme" ve "yüksek uyum" (sınıflar / nesneler birbirleri hakkında mümkün olduğunca az şey bilir ve her birim mümkün olan en az şeyden sorumludur).
Düşük kavrama
Bu, kodunuzdaki herhangi bir "malzeme grubunun" çevresine mümkün olduğu kadar az bağlı olması gerektiği anlamına gelir. Bu, sınıflar (sınıf tasarımı), aynı zamanda nesneler (gerçek uygulama), genel olarak "dosyalar" (yani, #include
her bir .cpp
dosya için s sayısı, import
her bir .java
dosya başına sayı vb.) İçin de geçerlidir.
İki varlığın birleştiğinin bir işareti, diğerinin herhangi bir şekilde değiştirilmesi durumunda, birinin kırılacağına (veya değiştirilmesi gerektiğine) işarettir.
Kalıtım açık bir şekilde birleşmeyi artırır; temel sınıfın değiştirilmesi tüm alt sınıfları değiştirir.
Arayüzler kuplajı azaltır: açık, yöntem tabanlı bir sözleşme tanımlayarak, sözleşmeyi değiştirmediğiniz sürece arayüzün her iki tarafıyla ilgili her şeyi özgürce değiştirebilirsiniz. ("Arayüz" genel bir kavramdır, Java interface
veya C ++ soyut sınıfları sadece uygulama detaylarıdır).
Yüksek uyum
Bu, her bir sınıf, nesne, dosya vb. İle mümkün olduğu kadar az ilgilenmek veya sorumlu olmak demektir. Yani, birçok şey yapan büyük derslerden kaçının. Örneğinizde, silahlarınızın tamamen ayrı yönleri varsa (cephane, ateşleme davranışı, grafik gösterimi, envanter gösterimi vb.), O zaman bunlardan birini temsil eden farklı sınıflara sahip olabilirsiniz. Ana silah sınıfı daha sonra bu ayrıntıların bir "sahibine" dönüşür; Bir silah nesnesi o zaman bu ayrıntılara bir kaç işaretten biraz daha fazlasıdır.
Bu örnekte, "Ateşleme Davranışı" nı temsil eden sınıfınızın ana silah sınıfı hakkında insanca mümkün olduğu kadar az şey bildiğinden emin olabilirsiniz. Optimal olarak, hiçbir şey. Bu, örneğin, dünyanızdaki herhangi bir nesneye (taretler, volkanlar, NPC'ler ...) sadece bir parmağınızla "Ateşleme Davranışı" verebileceğiniz anlamına gelir . Bir noktada, silahların envanterde temsil edilme şeklini değiştirmek istiyorsanız, o zaman basitçe bunu yapabilirsiniz - sadece envanter sınıfınız bunu bilir.
Bir varlığın uyumlu olmadığının bir işareti, aynı anda birkaç yöne doğru dallanıp büyüyüp büyümesidir.
Tanımladığın gibi kalıtım, bağlılığı azaltır - silah sınıflarınız, günün sonunda silahlarınızın her türlü farklı, ilişkili olmayan yönünü ele alan büyük parçalardır.
Arayüzler, arayüzün iki tarafı arasındaki sorumlulukları net bir şekilde bölerek uyumu dolaylı olarak arttırır.
şimdi ne yapmalı
Hala kesin ve hızlı kurallar yok, bunların hepsi sadece kurallar. Genel olarak, TKK kullanıcısı cevabında belirttiği gibi, kalıtım okulda ve kitaplarda çokça öğretilir; OOP ile ilgili süslü şeyler. Arayüzler öğretmek için muhtemelen daha sıkıcıdır ve ayrıca (önemsiz örnekleri geçerseniz) kalıtım kadar açık olmayan bağımlılık enjeksiyon alanını açmak biraz daha zordur.
Günün sonunda, kalıtım temelli planınız net bir OOP tasarımına sahip olmamaktan daha iyidir. Bu yüzden ona bağlı kalmaktan çekinmeyin. İsterseniz, Düşük Kuplaj, Yüksek Uyum hakkında biraz ruminasyon yapabilir / google'da dolaşabilir ve bu tür bir düşünceyi cephaneliğinize eklemek isteyip istemediğinizi görebilirsiniz. İsterseniz daha sonra denemek için her zaman yeniden deneyimleyebilirsiniz; veya bir sonraki daha büyük yeni kod modülünüzde arayüz tabanlı yaklaşımları deneyin.