Öyleyse * Alan Kay, “nesne yönelimli” terimiyle gerçekten ne demek istedi?


95

Bildirildiğine göre, Alan Kay "nesne yönelimli" teriminin mucididir. Ve sık sık bugün OO dediğimiz şeyin kastettiği olmadığını söylediğini belirtti.

Örneğin, bunu Google’da buldum:

'Nesne yönelimli' terimini oluşturdum ve aklımda C ++ olmadığını hatırladım

- Alan Kay, OOPSLA '97

Belli belirsiz o ne olduğuna ilişkin oldukça anlayışlı şeyler duyduğunu hatırlamıyorum vermedi demek. "İleti geçiyor" satırları boyunca bir şeyler.

Ne demek istediğini biliyor musun? Ne anlama geldiği ve bugünün ortak OO'sundan nasıl farklı olduğu hakkında daha ayrıntılı bilgi verebilir misiniz? Eğer varsa, lütfen bazı referansları paylaşın.

Teşekkürler.


Blog yazılarımı bu konuda çok ilginç bulabilirsiniz: yegor256.com/tag/oop.html
yegor256

Alan Kay kendini soruları yanıtlar nerede bu blog yayınında ait yorumlar bölümünü kontrol edin: Alan Kay Him Wrong biri olmadığını
yegor256

Yanıtlar:


82

http://www.purl.org/stefan_ram/pub/doc_kay_oop_en


Tarih: Çar, 23 Tem 2003 09:33:31 -0800 Kime: Stefan Ram [gizlilik için kaldırıldı] Kimden: Alan Kay [gizlilik için kaldırıldı] Konu: Re: "nesne yönelimli" nin açıklanması

Selam Stefan -

Gecikme için üzgünüm ama tatildeydim.

Stefan Ram, 18:27 +0200 7/17/03 tarihinde şunları yazdı:

Sevgili Dr. Kay,

Konuyla ilgili eğitim sayfam için "nesne yönelimli programlama" terimiyle ilgili bir miktar söz sahibi olmak istiyorum. "Yetkili" olarak düşündüğüm tek iki kaynak, "ISO / IEC 2382-15" te "nesne yönelimli" yi tanımlayan Uluslararası Standartlar Örgütü ve siz de onların dediği gibi, bu terimi siz yazdınız.

Yaptığımdan oldukça eminim.

Ne yazık ki, o terimin tanımını veya açıklamasını içeren bir web sayfası veya kaynağı bulmak zor. Bu konuda söyleyebilecekleriniz hakkında birkaç rapor var (“kalıtım, polimorfizm ve kapsülleme” gibi), ancak bunlar ilk elden kaynaklar değil. Ayrıca daha sonra "mesajlaşma" konusuna daha çok önem verdiğinizi biliyorum - ama yine de "nesne yönelimli" hakkında bilmek istiyorum.

Kayıtlar için, eğitim sayfam, ek dağıtım ve yayın bölümlerini açıklar mısınız?

"Nesne yönelimli" terimi ilk olarak ne zaman ve nerede kullanıldı?

Utah'da, Kasım 66'dan sonra, ARPAnet için tasarlanan Eskiz defteri, Simula, Burroughs B5000 ve Biyoloji ve Matematik alanındaki geçmişimden etkilendiğim zaman, programlama için bir mimari düşündüm. Muhtemelen biri bana ne yaptığımı sorduğunda 1967’de oldu ve ben de dedim ki: “Nesneye yönelik programlama”.

Orijinal anlayışı aşağıdaki bölümleri vardı.

  • Nesnelerin bir biyolojik ağ hücreleri ve / veya bir ağdaki ayrı bilgisayarlar gibi olduklarını, sadece mesajlarla iletişim kurabildiklerini düşündüm (bu yüzden mesajlaşma en baştan geldi - programlama dilinde mesajlaşmanın yeterince verimli bir şekilde nasıl yapılacağını görmek biraz zaman aldı. Bir işe yara).

  • Verilerden kurtulmak istedim. B5000 bunu neredeyse inanılmaz HW mimarisi ile yaptı. Hücre / tüm bilgisayar metaforunun verilerden kurtulacağını ve “<-” mesajının başka bir mesaj belirteci olacağını fark ettim (bunu düşünmem biraz zaman aldı çünkü tüm bu sembollerin isimlerini düşündüm. fonksiyonlar ve prosedürler.

  • Matematik arkaplanım, her nesnenin kendisiyle ilişkili birkaç cebir olabileceğini ve bunların aileleri olabileceğini ve bunların çok çok faydalı olacağını fark etmemi sağladı. "Polimorfizm" terimi çok daha sonra dayatıldı (bence Peter Wegner tarafından) ve gerçekten geçerli değil, çünkü gerçekten fonksiyonların isimlendirilmesinden geliyor ve ben de fonksiyonlardan biraz daha fazlasını istedim. Yarı-cebirsel formda jenerik davranışlarla başa çıkmak için "jeneriklik" terimini kullandım.

  • Simula I veya Simula 67'nin miras yapma şeklini beğenmedim (Nygaard ve Dahl'ın sadece muazzam düşünürler ve tasarımcılar olduğunu düşünmeme rağmen). Bu yüzden mirası, daha iyi anlayana kadar yerleşik bir özellik olarak bırakmaya karar verdim.

Bu mimari ile ilgili özgün deneylerim, van Wijngaarten'in ve Wirth'in "Algol'ün Genelleştirilmesi" ve Wirth'in Euler'in uyarladığı bir model kullanılarak yapıldı. Bunların her ikisi de oldukça LISP'ye benzer, ancak daha geleneksel bir okunabilir sözdizimine sahipti. O zamanlar canavar LISP'in somut meta-dil fikrini anlamadım, ancak Irons'un IMP'si de dahil olmak üzere çeşitli kaynaklardan elde edilen genişletilebilir diller hakkındaki fikirlerle biraz daha yakınlaştım.

Bunun ikinci aşaması sonunda LISP'yi anlamak ve daha sonra bu anlayışı daha küçük ve daha küçük ve daha güçlü ve daha geç sınırlanmış yapılar yapmak için kullanmaktı. Dave Fisher'ın tezi "McCarthy" tarzında yapıldı ve genişletilebilir kontrol yapıları hakkındaki fikirleri çok yardımcı oldu. Bu zamanda bir başka büyük etki Carl Hewitt'in PLANNER'dı (ki bu, Prolog'u ne kadar iyi ve ne kadar erken tahmin edebileceği göz önüne alındığında hak ettiği haberi asla almadı).

Xerox PARC'taki orijinal Smalltalk, yukarıdakilerden çıktı. Takip eden Smalltalklar, Tarih bölümünün sonunda şikayet edildi: Simula'ya geri adım attılar ve uzatma mekanizmalarının yerini hiçbir yerde daha kullanışlı olmayan daha güvenli olanlarla değiştirmediler.

"Nesne yönelimli [programlama]" sizin için ne ifade ediyor? (Öğretici benzeri bir girişe gerek yok, kısa bir açıklama [mesela "kalıtım, polimorfizm ve kapsülleme ile programlama"] gibi] kendilerine aşina olan bir okuyucu için diğer kavramlar açısından mümkünse açıklamak gerekli değildir. ", çünkü zaten" Küçük Tarihin Erken Tarihi "nden" nesne "ile ilgili açıklamanızla ilgili kaynaklarım var.)

(Türlere karşı değilim, ancak tam bir acı olmayan herhangi bir tür sistem bilmiyorum, bu yüzden hala dinamik yazmayı seviyorum.)

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. Smalltalk ve LISP'de yapılabilir. Muhtemelen bunun mümkün olduğu başka sistemler de var, ama onların farkında değilim.

[Ayrıca,] Bahsetmem gereken şeylerden biri, Simula tarafından katalize edilen iki ana yol olduğudur. Erken olanı (sadece kaza ile) aldığım bio / net veri dışı prosedür yoluydu. Bir çalışma hedefi olarak biraz sonra gelen diğeri soyut veri tipiydi ve bu çok daha fazla oyun aldı.

Bütün tarihe bakarsak, proto-OOP olayının ADT ile başladığını, "nesneler" dediğim şeye küçük bir çatal olduğunu görüyoruz - bu Smalltalk'a, vb. Yol açtı - küçük çataldan sonra CS kuruluşu hemen hemen ADT yaptı ve veri prosedürü paradigmasına sadık kalmak istedi. Tarihsel olarak, USAF Burroughs 220 dosya sistemine (Smalltalk tarihinde anlattığım), MIT'deki Doug Ross'un (AED ve önceki) erken çalışmalarına, veri yapılarında gömme prosedürü işaretçilerinin, Sketchpad'in sahip olduğu savundu. tam polimorfizm - örneğin veri yapısındaki aynı uzaklık "ekran" anlamına geliyordu ve temsil edilen yapının, vb. ve Burroughs B5000 için uygun rutinin bir göstergesi olacaktı. Program referans tabloları gerçek "büyük nesneler" idi ve hem "veri" hem de "prosedürlere" dair işaretçiler içeriyordu ancak verilerden sonra gidip bir prosedür gösterici bulmaya çalışıyorsa, genellikle doğru olanı yapabilirdi. Ve Utah'taki ilk şeylerle çözdüğüm ilk problemler, sadece metotları ve nesneleri kullanarak “verilerin kaybolması” idi. 60'ların sonunda (sanırım) Bob Balzer "Dataless Programming" adında oldukça şık bir yazı yazdı ve kısa bir süre sonra John Reynolds, lamda'yı kullandığını gösterdiği ve (1970'de) eşit derecede şık bir yazı "Gedanken" yazdığını söyledi. ifadeleri doğru şekilde veri prosedürleri ile soyutlanmasına izin verir. ancak veriden sonra gidip bir prosedür gösterici bulmaya çalışıyorsa doğru olanı yapabilirdi. Ve Utah'taki ilk şeylerle çözdüğüm ilk problemler, sadece metotları ve nesneleri kullanarak “verilerin kaybolması” idi. 60'ların sonunda (sanırım) Bob Balzer "Dataless Programming" adında oldukça şık bir yazı yazdı ve kısa bir süre sonra John Reynolds, lamda'yı kullandığını gösterdiği ve (1970'de) eşit derecede şık bir yazı "Gedanken" yazdığını söyledi. ifadeleri doğru şekilde veri prosedürleri ile soyutlanmasına izin verir. ancak veriden sonra gidip bir prosedür gösterici bulmaya çalışıyorsa doğru olanı yapabilirdi. Ve Utah'taki ilk şeylerle çözdüğüm ilk problemler, sadece metotları ve nesneleri kullanarak “verilerin kaybolması” idi. 60'ların sonunda (sanırım) Bob Balzer "Dataless Programming" adında oldukça şık bir yazı yazdı ve kısa bir süre sonra John Reynolds, lamda'yı kullandığını gösterdiği ve (1970'de) eşit derecede şık bir yazı "Gedanken" yazdığını söyledi. ifadeleri doğru şekilde veri prosedürleri ile soyutlanmasına izin verir.

Nesneleri veri içermeyen olarak seven insanlar sayıca daha küçüktü ve kendimi, Carl Hewitt, Dave Reed ve birkaç diğerini içeriyordu - bu grubun hemen hepsi ARPA topluluğundandı ve bir şekilde ya da başka bir gruba dahil oldular. Temel hesaplama biriminin bir bütün olarak bilgisayar olduğu ARPAnet'in Internet tasarımı. Fakat sadece bir fikrin ne kadar inatçı bir şekilde dayanabileceğini göstermek için, yetmişli yıllarda ve seksenlerde, nesneler ve mesajlar düşünmek yerine "Uzaktan Prosedür Çağrısı" ile uğraşmaya çalışan birçok insan vardı. Sic transit gloria mundi.

Alkış,

Alan Kay


1
HTTP / 1.1 403 Erişim Reddedildi.
Meslek

1
Sadece erişebildim, bu yüzden geçici bir sorun olmalı. Bu bağlantı için teşekkürler Manoj.
David Conrad

2
@Job Çarşamba (16 Mart, görünüşe göre 403 hatasını aldığınız gün), userpage.fu-berlin.de adresindeki alan yöneticisinin aylık hizmet günüdür). Ağın parçalarını rutin olarak ayda bir kez çevrimdışı tutuyorlar. Evet, sorma…
Konrad Rudolph

“Veriden kurtulmak istedim” ile ne kastedildiğini netleştirebilir misiniz? Veriler, OO'nun ayrılmaz bir parçasıdır (yani, genellikle bir sınıfta kapsüllenir veya sınıflara / sınıflardan geçirilir) ve ne olursa olsun, paradigma kullanılırsa, herhangi biri hesaplamada veri olmadan yapamaz, bu yüzden benim için hiçbir anlam ifade etmiyor .
Dennis,

1
<- orijinal küçük görev atama işleci oldu
DangerMouse

22

Çoğu Alan Kay'ın nesne yönelimi ile kastettiği şeylerin tümü Smalltalk dilinde somutlaştırılmadıysa.

Ayrıca, http://en.wikipedia.org/wiki/Message_passing#Influences_on_other_programming_models adresinden :

Alan Kay, mesaj iletmenin OOP'daki nesnelerden daha önemli olduğunu ve nesnelerin kendilerinin çoğunlukla vurgulandığını savundu. Canlı dağıtılmış nesneler programlama modeli bu gözlem üzerine kuruludur; Karmaşık bir dağıtılmış sistemin davranışını, üst düzey, işlevsel stil özellikleri kullanarak, mesaj kalıpları açısından karakterize etmek için dağıtılmış veri akışı kavramını kullanır.

18
Daha sonra neden “Mesaj Yönelimli” yerine “Nesne Yönelimli” olarak adlandırdığını merak ediyor.
David Thornley

@David Thornley: Yani bu C ++ yöntemini yönlendirir mi?
back2dos

60
60'lı yıllardaki terim hakkında çok kaba davrandım ve "mesaj yönelimli" gibi bir şey seçmeliydim
Alan Kay

1
Peki o zaman "mesaj odaklı" nedir? (Senkronize olmayan çağrıları düşünebilirim (muhtemelen), ama aslında az ya da çok "normal" yöntemler uygulamayan herhangi bir dil bilmiyorum; geri dönüş değerleri hakkında da bir şeyler var, ama bu da " ref '/' out 'parametreleri veya buna benzer bir şey)
mlvljr

1
"mesaj yönelimli" temelde geç bağlayıcı / dinamik yazıdır - nesneye iletilen ileti çalışma zamanında analiz edilir (bu nesne tarafından).
Mark Cidade

6

Çoğu Alan Kay'ın nesne yönelimi ile kastettiği şeylerin tümü Smalltalk dilinde somutlaştırılmadıysa.

“Tüm fikirleri PARC'ta bile yapmadık. Carl Hewitt'in Aktörlerin orijinal Smalltalk tarafından yarattığı fikirlerinin birçoğu sonraki Smalltalk'lerden çok OOP ruhundaydı. Erlang'ın önemli kısımları gerçek bir OOP dili gibi. Mevcut Smalltalk ve kesinlikle “OOP paint” ile boyanmış C temelli diller. ”

Alan Kay adlı kullanıcının yorumundan alınmıştır:

http://computinged.wordpress.com/2010/09/11/moti-asks-objects-never-well-hardly-ever/


Yorumlarda uzun bir süre ilerlemek zorundasınız, işte Alan Kay'ın yorumuna doğrudan bağlantı: computinged.wordpress.com/2010/09/11/…
icc97 21:18

Yorumun tamamının çok faydalı olduğu, bu soruya olası bir cevapla başlıyor: ““ Nesne yönelimli ”olduğunu düşündüğüm büyük bir sistemin güzel bir örneği İnternet'tir. Milyarlarca kapsüllenmiş nesnelerin (bilgisayarların kendileri) kullanımı ve kullanımı “komutları isteme” vb. saf mesajlaşma sistemi
icc97 21:18

5

Alan Kay'ın ve Jim Coplien gibi başkalarının çalışmalarını izlemekten aldığım en önemli noktalardan biri, gerçek "nesne" yönelimli programlamanın, bilgisayar ve yazılımın İNSAN / KULLANICI zihinsel modelleri yerine modelleme ile ilgili olduğudur. PROGRAMMERS için sadece bir araç.

Anladığım kadarıyla, Alan'ın OOP vizyonu, bilgisayarı bir insanın istediğini yapmasını sağlayan bir araç haline getiriyordu: bilgisayarın tüm yetenekleri sezgisel bir etkileşimli model yoluyla doğrudan son kullanıcıya maruz kalıyor. Çalışma zamanı nesnelerini ve etkileşimlerini DIRECTLY ile yalnızca kod aracılığıyla görüntüleyemem ve heykelleştirebilmeliyim.

İşte bunun bir versiyonunu JavaScript’te kavramın kanıtı olarak gösterme planlarım: http://www.cemetech.net/forum/viewtopic.php?p=234494#234494

Yazılım geliştirme / programlama perspektifinden bakıldığında Jim Coplien, kodun nasıl yapılabileceği ve kullanıcıların zihinsel modeline nasıl benzemesi gerektiği hakkında konuşuyor. Diğer bir deyişle, kod, davranışını tanımlayan bir kişinin yazdığı gibi okur. Bu, büyük ölçüde, SINIFLAR ve TİPLER yerine, AMAÇLAR açısından düşünerek gerçekleştirilir. Davranış, bir nesnenin KİMLİĞİ tanımının bir parçası olarak değil, nesnelerin oynadığı ROLLER açısından tanımlanmaktadır. Bir etkileşimle oynadıkları ROLE ile tanımlanan nesneler üzerinden etkileşimleri modelleyebilmelisiniz. İnsan zihni modellerin işleyişi şu şekildedir: Garson, Müşteri, Kasiyer, Kaynak Hesap, Hedef Hesap, ... Bunlar ROLES, TÜRLER değil, ve o anda hangi nesnenin bu rolü oynaması için "yöntemleri tanımlayabilmeyi istiyorsun. "


DDD benzer kavramları kullanır. Muhtemelen bu konuda haklısın. :-)
inf3rno
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.