İlk dönemde kapsülleme, veri gizleme, modülerlik, kalıtım vb. OOP kavramlarını Java ve UML üzerinden tanıttık. (Java benim ilk programlama dilimdir)
Bunların hiçbiri OOP kavramı değil. Hepsi OO dışında, OO'dan bağımsız olarak var ve birçoğu OO'dan önce icat edildi.
OO'nun bununla ilgili olduğunu düşünüyorsanız, sonucunuz doğrudur: Bunların hepsini işlemsel dillerde yapabilirsiniz çünkü onların OO ile ilgisi yoktur .
Örneğin, Modülerlik ile ilgili seminal makalelerden biri, Modüllere Ayrıştırma Sistemlerinde Kullanılacak Kriterler Üzerinedir . Orada OO'dan bahsetmiyoruz. (1972'de yazılmıştır, o zamana kadar OO, on yıldan daha eski olmasına rağmen hala belirsiz bir yerdi.)
Veri Soyutlama , OO'da önemli olmakla birlikte , OO'nun (Messaging) birincil özelliğinin, tanımlayıcı bir özellik olmaktan çok bir sonucudur . Ayrıca, farklı türde veri soyutlamalarının olduğunu hatırlamak çok önemlidir . Günümüzde kullanılan en yaygın iki veri soyutlama türü (muhtemelen hala birleştirilen diğer ikisinden daha fazla kullanılan "hiçbir şekilde soyutlama" görmezden gelirsek), Özet Veri Türleri ve Nesneleridir . Yani, sadece "Bilgi Gizleme", "Kapsülleme" ve "Veri Soyutlama" diyerek, OO hakkında hiçbir şey söylemediniz, çünkü OO sadece bir Veri Soyutlama biçimidir ve ikisi aslında temelde farklıdır:
- Soyut Veri Tipleriyle, soyutlama mekanizması tip sistemidir ; Uygulamayı gizleyen tip sistemidir. (Tip sisteminin mutlaka statik olması gerekmez.) Nesnelerle, uygulama, tür gerektirmeyen bir prosedürel ara yüzün arkasına gizlenir . (Örneğin, ECMAScript'te olduğu gibi kapaklarla uygulanabilir.)
- Özet Veri Türleriyle, farklı ADT örnekleri birbirinden kapsüllenir, ancak aynı ADT örnekleri birbirlerinin temsilini ve özel uygulamalarını inceleyebilir ve bunlara erişebilir. Nesneler her zaman her şeyden kapsüllenir . Sadece nesnenin kendisi kendi temsilini denetleyebilir ve kendi özel uygulamasına erişebilir. Başka hiçbir nesne , aynı tipteki diğer nesneler, aynı sınıfın diğer örnekleri, aynı prototip içeren diğer nesneler, nesnenin klonları veya ne yapabilirse yapılmadı. Yok .
Bunun anlamı, bu arada, Java'da sınıfların nesne yönelimli olmamasıdır. Aynı sınıfın iki örneği olabilir birbirlerinin temsilini ve özel uygulama erişin. Bu nedenle, sınıf örnekleri nesne değildir, aslında ADT örnekleridir. Java interface
s, ancak, do nesne yönelimli veri soyutlama sağlamak. Yani başka bir deyişle: sadece arayüzlerin örnekleri Java'daki nesnelerdir, sınıfların örnekleri değildir.
Temel olarak, tipler için sadece arayüzleri kullanabilirsiniz. Bunun anlamı, parametre türlerinin ve yapıcıların, geri dönüş yöntem türlerinin, örnek alan türlerinin, statik alanların ve yerel alanların, bir instanceof
işlecin ya da bir işlecin argümanının ve genel bir tür kurucu için tür argümanlarının her zaman arayüz olması gerektiği anlamına gelir. Bir sınıf sadece new
operatörden hemen sonra, başka hiçbir yerde kullanılabilir.
Örneğin, modülerlik için programı, kodu ayrı dosyalarda bulunan iyi tanımlanmış görevleri gerçekleştiren birçok küçük programa ayırabiliriz. Bu programlar birbirleriyle iyi tanımlanmış girdi ve çıktıları ile etkileşime girer. Kapsülleme sağlamak için dosyalar korunabilir (şifrelenmiş mi?). Kodu tekrar kullanmak için, yeni programlarda gerektiğinde bu dosyaları çağırabiliriz. Bu, OOP'nin ne olduğunu yakalamıyor mu yoksa çok açık bir şeyi mi özlüyorum?
Tanımladığınız şey OO.
Bu gerçekten OO hakkında düşünmek için iyi bir yoldur. Aslında, OO'nun özgün mucitlerinin aklında olan şey tam olarak buydu. (Alan Kay bir adım daha ileri gitti: birbirlerine ağ üzerinden mesajlar gönderen çok sayıda küçük bilgisayar öngördü.) "Program" dediğiniz şeye genellikle "nesne" denir ve "çağrı" yerine "genellikle" ".
Nesne Oryantasyonu tamamen Mesajlaşma (aka dinamik gönderme ) ile ilgilidir. "Nesne Yönelimli" terimi, Smalltalk'ın ana tasarımcısı Dr. Alan Kay tarafından yazılmıştır ve şöyle tanımlamaktadır :
Bana göre OOP sadece mesajlaşma, yerel alıkoyma ve devlet sürecinin korunması ve saklanması ve her şeyin aşırı geç bağlanması demektir.
Şunu parçalayalım:
- mesajlaşma ("sanal yöntem gönderme", Smalltalk'ı bilmiyorsanız)
- devlet süreci olmalı
- yerel olarak tutulan
- korumalı
- gizli
- her şeyin aşırı geç bağlanması
Uygulama-bilgili, mesajlaşma bir geç sınırlanmış prosedür çağrısıdır ve prosedür çağrıları geç sınırlanmışsa, o zaman tasarım zamanında ne arayacağınızı bilemezsiniz , böylece devletin somut temsili hakkında herhangi bir varsayımda bulunamazsınız. Yani, bu gerçekten mesajlaşma ile ilgili, geç-bağlama mesajlaşma bir uygulama ve kapsülleme bunun bir sonucudur.
Daha sonra " Büyük fikir" mesajlaşma " olduğunu açıkladı ve" mesaj yönelimli "yerine" nesne yönelimli "olarak adlandırdığı için pişmanlık duydu, çünkü" nesne yönelimli "terimi önemsiz şeye odaklanıyor (nesneler) ) ve gerçekte önemli olanın dikkatini dağıtır (mesajlaşma):
Sadece küçük bir hatırlatmak için son OOPSLA'da bazı sıkıntıları çektiğimi hatırlatan bir hatırlatma, Smalltalk'un sadece sözdizimi ya da sınıf kütüphanesi değil, sınıflarla ilgili olmadığını da hatırlatmak için. Uzun zaman önce bu konu için "nesneler" terimini kullandığım için üzgünüm çünkü birçok insanın daha az fikre odaklanması gerekiyor.
Büyük fikir "mesajlaşma" dır - Smalltalk / Squeak'in çekirdeği tamamen budur (ve Xerox PARC fazımızda asla tamamlanmayan bir şeydir). Japonların küçük bir kelimesi var - "- bunlar arasında olan" - belki de en yakın İngilizce karşılığı "interstitial". Mükemmel ve büyütülebilir sistemler yapmanın anahtarı, modüllerinin iç özelliklerinin ve davranışlarının ne olması gerektiğinden ziyade nasıl iletişim kurduğunu tasarlamaktır. İnterneti düşünün - yaşamak, (a) tek bir standardın ötesinde birçok farklı türde düşünce ve gerçekleştirmeye izin vermek ve (b) bu fikirler arasında farklı derecelerde güvenli birlikte çalışabilirlik sağlamak için izin vermek zorundadır.
(Tabii ki, bugün, çoğu insan nesnelere odaklanmıyor, hatta daha da yanlış olan sınıflara odaklanıyor.)
Mesajlaşma , hem metafor hem de mekanizma olarak OO için esastır .
Birine mesaj gönderirseniz, onunla ne yaptıklarını bilemezsiniz. Sadece sen gözlemleyebilirsiniz şey, onların yanıttır. Mesajı kendileri işleme alıp almadıklarını (yani nesnenin bir yöntemi olup olmadığını), mesajı başka birine iletip iletmediklerini (temsilci / vekil), bilmiyorlarsa bile bilmiyorsunuz. Kapsüllemenin konusu budur, OO'nun konusu budur. Bir vekili, beklediğiniz gibi yanıt verdiği sürece, gerçek olandan ayırt edemezsiniz.
"Mesajlaşma" için daha "modern" bir terim "dinamik yöntem gönderme" veya "sanal yöntem çağrısı" dır, ancak metaforu kaybeder ve mekanizmaya odaklanır.
Dolayısıyla, Alan Kay'ın tanımına bakmanın iki yolu vardır: eğer kendi başına ayakta durursanız, mesajlaşmanın temelde bir gecikme prosedürü çağrısı olduğunu ve geç bağlamanın kapsülleme anlamına geldiğini gözlemleyebilirsiniz; ve # 2 aslında gereksizdir ve OO tamamen geç bağlanma ile ilgilidir.
Ancak, daha sonra önemli olan şeyin mesajlaşma olduğunu ve böylece farklı bir açıdan bakabileceğimizi açıkladı: mesajlaşma geç kalmış. Şimdi, eğer mesajlaşma mümkün olan tek şey olsaydı, o zaman # 3 önemsiz bir şekilde doğru olurdu: eğer sadece bir şey varsa ve o şey geç bağlıysa, o zaman her şey geç kalmış olur. Ve bir kez daha, kapsülleme mesajlaşmadan sonra gelir.
Benzer noktaları da yapılır Revisited Veri Soyutlama, Anlama On tarafından William R. Cook da onun "Odaklı Nesne" "Nesne" ve basitleştirilmiş Modern Tanımlar önerisi :
İşlemlerin dinamik gönderilmesi nesnelerin temel özelliğidir. Çağrılacak olan işlem nesnenin kendisinin dinamik bir özelliği olduğu anlamına gelir. İşlemler statik olarak tanımlanamaz ve genel olarak, verilen bir talebe cevap olarak hangi işlemin gerçekleştirileceğini, çalıştırmanın dışında tam olarak bilmenin bir yolu yoktur. Bu, her zaman dinamik olarak gönderilen birinci sınıf işlevlerle aynıdır.
Smalltalk-72'de herhangi bir nesne bile yoktu! Yalnızca ayrıştırılan, yeniden yazılmış ve yönlendirilen ileti akışları vardı . İlk olarak yöntemler (mesaj akışlarını ayrıştırma ve yeniden yönlendirmenin standart yolları), daha sonra nesneler (bazı özel durumları paylaşan yöntemlerin grupları) geldi. Miras çok daha sonra geldi ve sınıflar sadece mirası desteklemenin bir yolu olarak tanıtıldı. Kay'ın araştırma grubu prototipler hakkında zaten bilgi sahibi olsaydı, muhtemelen ilk etapta asla ders vermezlerdi.
Türler ve Programlama Dillerinde Benjamin Pierce , Nesne Yöneliminin belirleyici özelliğinin Açık Özyineleme olduğunu savunuyor .
Yani: Alan Kay'a göre, OO tamamen mesajlaşma ile ilgili. William Cook'a göre, OO tamamen dinamik yöntem gönderimi ile ilgilidir (bu gerçekten aynı şeydir). Benjamin Pierce'e göre, OO tamamen Açık Recursion ile ilgilidir, bu temel olarak öz referansların dinamik olarak çözüldüğü (veya en azından düşünmenin bir yolu) veya başka bir deyişle mesajlaşma anlamına gelir.
Gördüğünüz gibi, "OO" terimini kullanan kişi nesneler üzerinde oldukça metafizik bir görünüme sahip, Cook oldukça pratik bir görünüme sahip ve Pierce çok sıkı bir matematiksel görünüme sahip. Ancak önemli olan şudur: filozof, pragmatist ve teorisyen hepsi aynı fikirde! Mesajlaşma, OO'nun bir ayağıdır. Dönemi.
Burada miras söz konusu değil! Kalıtım, OO için zorunlu değildir. Genel olarak, çoğu OO dili yeniden kullanımın bir yolunu kullanmaktadır, ancak bunun mutlaka miras olması gerekmemektedir. Örneğin, bir tür delegasyon da olabilir. Aslında, Orlando Antlaşması tartışır heyeti nesne oiented dillerin tasarım alanı içinde farklı tasarım noktalarına heyeti ve miras kurşun formları veraset ve ne kadar farklı alternatif olarak. (Aslında Java gibi kalıtımı destekleyen dillerde bile, insanlara aslında OO için gerekli olmadığını belirten, bundan kaçınmaları gerektiğini öğretilmektedir.)