İşlevsel programlama gibi farklı programlama paradigmaları hakkında ne kadar çok şey öğrenirsem, kalıtım ve polimorfizm gibi OOP kavramlarının bilgeliğini sorgulamaya başlarım. İlk olarak okulda kalıtım ve polimorfizm hakkında bilgi sahibi oldum ve o zaman polimorfizm, kolay genişletilebilirliğe izin veren jenerik kod yazmanın harika bir yolu gibi görünüyordu.
Ancak ördek yazması (hem dinamik hem de statik) ve daha üst düzey işlevler gibi işlevsel özellikler karşısında, miras ve polimorfizme, nesneler arasındaki kırılgan bir ilişki kümesine dayanan gereksiz bir kısıtlama getirmeye bakmaya başladım. Çok biçimliliğin arkasındaki genel fikir, bir kez bir işlev yazmanız ve daha sonra orijinal işlevi değiştirmeden programınıza yeni işlevsellik ekleyebilmenizdir - tek yapmanız gereken gerekli yöntemleri uygulayan başka bir türetilmiş sınıf oluşturmaktır.
Ancak, ister Python gibi dinamik bir dilde, ister C ++ gibi statik bir dilde olsun, ördek yazarak başarmak çok daha kolaydır.
Örnek olarak, aşağıdaki Python işlevini ve ardından statik C ++ eşdeğerini göz önünde bulundurun:
def foo(obj):
obj.doSomething()
template <class Obj>
void foo(Obj& obj)
{
obj.doSomething();
}
OOP eşdeğeri aşağıdaki Java kodu gibi bir şey olacaktır:
public void foo(DoSomethingable obj)
{
obj.doSomething();
}
En büyük fark, elbette, Java sürümünün çalışması için bir arayüz veya miras hiyerarşisi oluşturulmasını gerektirmesidir. Java sürümü böylece daha fazla çalışma gerektirir ve daha az esnektir. Ayrıca, gerçek dünyadaki miras hiyerarşilerinin bir miktar dengesiz olduğunu görüyorum. Hepimiz Şekiller ve Hayvanlar'ın örneklerini gördük, ancak gerçek dünyada iş gereksinimleri değiştikçe ve yeni özellikler eklendiğinden, "is-a" ilişkisini gerçekten germek zorunda kalmadan önce herhangi bir iş yapmak zor yeni gereksinimleri karşılamak için başka temel sınıflar veya arayüzler içerecek şekilde hiyerarşinizi yeniden yapılandırın / yeniden düzenleyin. Ördek yazarken, hiçbir şey modelleme konusunda endişelenmenize gerek yok - sadece ihtiyacınız olan işlevsellik hakkında endişeleniyorsunuz .
Yine de, kalıtım ve polimorfizm o kadar popüler ki, onlara genişletilebilirlik ve kodun yeniden kullanımı için baskın strateji demenin çok abartılı olacağından şüpheliyim. Peki neden kalıtım ve polimorfizm bu kadar çılgınca başarılı? Miras / polimorfizmin ördek tipine göre bazı ciddi avantajlarını görmüyor muyum?
obj
birdoSomething
yöntemi yoksa ne olurdu ? Bir istisna oluştu mu? Hiçbir şey olmuyor mu?