Bence henüz bahsedilmemiş birkaç faktör var.
Her şeyden önce, en azından her şeyin bir nesne olduğu "en azından OOP" da (örneğin, Smalltalk) , zihninizi zeki bir nesne olarak zekice bir nesne olarak düşünmek için zihninizi doğal olmayan bir konfigürasyona çevirmeniz gerekir sadece bir değer - gerçekte bu yana, 21
(örneğin) gerçekten olan bir değer. Bu, özellikle bir yandan OOP'nin büyük bir avantajının gerçeği daha yakından modellediği söylendiğinde sorunlu hale geliyor, ancak LSD'den ilham alan en basit ve en açık kısımlarının bile berbat göründüğü bir şeyi alarak başlıyorsunuz. gerçeklik.
İkincisi, OOP'deki kalıtım, çoğu insanın zihinsel modellerini de çok yakından takip etmiyor. Çoğu insan için, şeyleri en spesifik olarak sınıflandırmak , işe yarayan bir sınıf hiyerarşisi oluşturmak için gereken mutlak kurallara yakın hiçbir yere sahip değildir . Özellikle, class D
başkalarından miras kalan bir yaratma class B
, nesnelerin class D
kesinlikle, kesinlikle tüm özelliklerini paylaşması anlamına gelir class B
. class D
kendine özgü yeni ve farklı özellikler ekleyebilir, ancak tüm özellikleri class B
bozulmadan kalmalıdır.
Aksine, insanlar bir şeyi zihinsel olarak sınıflandırdıklarında, genellikle daha gevşek bir model izlerler. Örneğin, eğer bir kişi bir nesne sınıfını neyin oluşturduğu hakkında bazı kurallar koyarsa, yeterince başka kurallar izlendiği sürece neredeyse herhangi bir kuralın ihlal edilebileceği oldukça tipiktir. Gerçekten kırılamayan birkaç kural bile, neredeyse her zaman bir miktar “gerilebilir”.
Örneğin, “araba” yı sınıf olarak düşünün. Çoğu insanın "araba" olarak düşündüklerinin büyük çoğunluğunun dört tekerleğe sahip olduğunu görmek oldukça kolaydır . Ancak çoğu insan, sadece üç tekerlekli bir araba gördü (en azından bir resmini). Doğru yaştan birkaçı da 80'lerin başından (ya da öylesine) altı tekerleği olan bir yarış arabasını ya da iki tanesini hatırlıyoruz. Bu bize temel olarak üç seçenek sunar:
- Bir arabanın kaç tekerleği olduğuna dair hiçbir şey iddia etmeyin - ancak bu her zaman 4 olacağı varsayımına ve başka bir numara için kırılması muhtemel kodun açıklanmasına yol açar.
- Tüm arabaların dört tekerleğe sahip olduğunu kabul edin ve gerçekte olduklarını bilmemize rağmen diğerlerini "otomobil değil" olarak sınıflandırın.
- Sınıfı, sadece bu sayede ihtiyaç duyulmayacak, kullanılmayacak veya uygun şekilde test edilmeyecek iyi bir şans olsa bile, tekerlek sayısındaki değişime izin verecek şekilde tasarlayın.
OOP hakkında eğitim vermek çoğu zaman muazzam taksonomiler inşa etmeye odaklanır - örneğin, dünyadaki bilinen tüm yaşamın dev bir hiyerarşisinin ne olacağının parçaları veya parçaları. Bu iki problem ortaya çıkarır: her şeyden önce, birçok insanı, eldeki soru ile tamamen alakasız olan büyük miktarlarda bilgiye odaklanmaya yöneltir. Bir noktada, köpek ırklarının nasıl modelleneceği ve (örneğin) "minyatür kanişlerin" "tam boyutlu kanişlerden" mi kalması gerektiği veya bunun tersi mi yoksa soyut bir taban "Kanişlerin mi olduğu konusunda oldukça uzun bir tartışma gördüm. "sınıf," tam boyutlu kaniş "ve" minyatür kaniş "ile ondan hem miras kalan. Hepsinin görmezden geldiği görülüyordu ki, başvurunun köpekler için lisansları takip etmekle ilgilenmesi gerekiyordu.
İkincisi ve neredeyse en önemlisi, eldeki görev için önemli olan özelliklere odaklanmak yerine, öğelerin özelliklerine odaklanmaya yol açar. Şeyleri olduğu gibi modellemeye yönlendiriyor, nerede (çoğu zaman) gerçekte ihtiyaç duyulan şey ihtiyaçlarımızı dolduracak en basit modeli oluşturmak ve yaptığımız soyutlamaya uyması için gerekli alt sınıflara uymak için soyutlamayı kullanmak.
Sonunda bir kez daha söyleyeceğim: yıllar içinde veritabanlarının izlediği aynı yolu yavaşça takip ediyoruz . Erken veritabanları hiyerarşik modeli takip etti. Yalnızca verilere odaklanmaktan başka, bu tek mirastır. Kısa bir süre boyunca, birkaç veri tabanı ağ modelini izledi - temelde çoklu kalıtım ile aynı (ve bu açıdan bakıldığında, çoklu arayüzler farketmek veya ilgilenmek için çoklu temel sınıflardan yeterince farklı değil).
Uzun zaman önce, ancak, veritabanları büyük ölçüde ilişkisel modelde birleşti (ve SQL olmasalar bile, bu soyutlama seviyesinde mevcut "NoSQL" veritabanları da ilişkiseldir). İlişkisel modelin avantajları, onları burada tekrar etmekten zahmet etmeyeceğim yeterince iyi bilinmektedir. Programlamada sahip olduğumuz ilişkisel modelin en yakın analoğunun jenerik programlama olduğunu not edeceğim (ve üzgünüm, fakat ismime rağmen, Java jenerik, örneğin, gerçekten küçük bir adım olsalar bile) doğru yön).