“Saf OO dili” teriminin resmi tanımı?


13

Böyle bir soru sormak için SO kardeşler arasında daha iyi bir yer düşünemiyorum. Başlangıçta "Python saf bir OO dili mi?" ama terim tanımlamaya çalışırken insanların yaşadığı sıkıntıları ve bir tür rahatsızlığı göz önünde bulundurarak terimin kendisi için net bir tanım elde etmeye başladım.

Terimi icat eden Dr.Alan Kay'ın yazışmalarıyla başlamak oldukça adil olacaktır (hücrelere veya diğer canlı nesnelere biyolojik benzetmedeki ilhamı not edin).

Göreve yaklaşmanın aşağıdaki yolları vardır:

  1. Terimi tanımlamak için benzersiz ve yeterli (Smalltalk, Scala, Java , vb. Olsa da) belirli özellikleri gösterebilen (veya yapamayan) programlama dillerini listeleyerek karşılaştırmalı bir analiz yapın - ancak IMO bu şekilde gerçekten tam görünmüyor ne de verimli )
  2. Resmi bir tanım verin (veya buna yakın, örneğin daha akademik veya matematiksel tarzda).
  3. Tamamen somut dilin anlamsal bağlamına veya a priori programlama deneyimine dayanan felsefi bir tanım verin (topluluk tarafından başarılı bir açıklama şansı olmalı).

Şu anki sürümüm: " İşlemler ve işlenenler arasında ( dilbilgisel olarak ) belirli bir programlama ( biçimsel ) dilinin yanı sıra bu türün bir nesne (OOP açısından) olup olmadığı her işlenenin türünü hakkında çıkarımda bulunabiliyorsa, böyle bir dilde bu dilde bir nesne olan en az bir tür olduğu sürece OO dili. Son olarak, dilin tüm türleri de nesneyse, bu dili saf (güçlü) OO dili olarak tanımlıyoruz. "

Herhangi bir olası gelişme takdir ediyorum. Gördüğünüz gibi, tanımı "nesne" terimine bağımlı hale getirdim (genellikle tamamen nesne sınıfı olarak adlandırılır).

[DÜZENLE]

Ayrıca, yazılan dillerde olduğu gibi bir tip (neyse ki iyi anlaşılmış) kavramını kullanıyorum . Veri tipi programlama veya tip odaklı programlama sadece sözdizimsel bir yorum değildir (program metninin, yani değişmez değerlerin ve veri değişkenlerinin belirli değerlerinin nasıl ele alınacağı - tip güvenliğine dönüşen bir şey), ancak dil gramerine atfedilebilir ve resmi bir şekilde incelenebilir (matematiksel mantık kullanılarak) tür sistemleri olarak adlandırılır . Belirli bir tip sisteminin evrensel bir tipe sahip olmasını gerektirmenin OO dilinin saflığını tanımlamanın yollarından biri olduğuna dikkat edin (bunu anlamsal olarak genişletmenin yolları vardır).

NB

nasıl cevap verilir :

  • terminoloji ve kavramlar hakkındaki anlayışınızı destekleyen / açıklayan bir kitap veya referans belirtirseniz yardımcı olur (genellikle iyi bir tanım, temel hariç tüm bağımlı kavramları kapsar veya referans alır).
  • mümkünse cevabınızın / tanımınızın girintili bir kategorisini aksi belirtilmedikçe belirtin (yukarıya bakın: 1 - dil örneğine göre, 2 - matematiksel mantık, 3 - teknik açıklama ve programlama felsefesi)
  • sınıflandırma önemlidir (ve ayrıca saf-OO terimi OO terimine dahil edildiğinden), cevaplama OO paradigmasının elemanlarını diğer iyi bilinen metodolojilerden karıştırmaya çalışın (ve hiçbir şekilde bunları karıştırmayın / örtüşmeyin, örneğin tipik olarak modüler programlama unsurları kapsanabilir / OO programlama ile somutlaştırılmış): OOP'yi fonksiyonel programlama, Mantıksal programlama (özellikle güçlü bir şekilde uzmanlaşmış), Soyut Veri Tipleri (ADT), Modüler, Metaprogramlama (jenerikler ve LISP'nin makro genişleme süresinden) ayırmaya çalışın, Sözleşmeler (örn. Eyfel), Unsur yönelimli (AO), (deklaratif ve fonksiyonel sınıflandırma ile Dijkstra'nın yapılandırılmış tarihsel tanımları arasındaki fark açıktır)

biçimsel bir tanım verme zorluğu üzerine : şaşırtıcı bir şekilde, belirli bir mantıksal (biçimsel) sistem biçiminde (büyük olasılıkla tür temelli) OOP'nin matematiksel bir tanımını vermek ve bir kavramı birbiri ardına tanımlamak çok kolaydır. Hatta bu formalizmi,sadece soyut eğlence veya egzersizdenziyade güvenlik kontrolüne veya yeni dil tasarım yönlerine (bu Sezgisel Tip Teorisi , Bağımlı türler , bağımsız olarak, FOL formalizmlerinde lambda kalkülüsü olarakarama formülü)uygulayarak daha pratik bir şey yapmaya çalışabilir.ve sadece kategori teorisini kullanarak). Buradaki ana nokta, şaşırtıcı bir şekildebu tür formülasyonlar IMO, büyük olasılıkla başlangıçta eksik OOP (bilgisayar mühendisliğinde) anlayışı ile güçlü bir şekilde önyargılıdır (kusurludur) ve daha sonra neredeyse erişilemez hale gelir (böylece programlama dünyasına geriye doğru katkıda bulunmaz - belki de belirli bir yüzdenin uygulamaları popüler dillere entegre edilmiştir ).

Yani evet, sadece tanım değil, “iyi” bir tanım vermek de zor. Ancak deneyimleriniz ve doğrudan katılımınız nedeniyle bunu burada sormaktan olumluyum arkadaşlar.


2
Python için kendine cevap verdin. "Hayır".
psr

2
Güzel soru için +1, ancak sürümünüz bir tür ve bir nesnenin farklı şeyler olması sorunuyla biraz kusurlu .
Frank

5
@JoachimSauer: Squeak posta listesindeki başka bir postada "büyük fikir Mesajlaşma" olduğunu ve buna "Nesne Odaklı" adını vermiş olduğu için pişman olduğunu ve bunun yerine "Mesaj Odaklı" olarak adlandırılması gerektiğini söyledi. Örneğin Erlang, tüm "nesneler", "yöntemler", "kalıtım", "sınıflar", "prototipler" veya benzeri bir şeyde herhangi bir kavram olmaksızın Dr. Kay'nın kriterlerinin tümünü karşılayan tamamen nesneye yönelik bir dildir. .
Jörg W Mittag

1
Bu, sözdizimlerinin bir OO dili tanımlamak için yeterli olmadığını gösteren güzel bir örnek olabilir. OOP'un (örneğin bir araç olarak) yalnızca semantik (sözdiziminden bağımsız) olduğunu gösterebilirsem, bu sorumu tamamen değiştirir (tersine çevirir)!
Yauhen Yakimovich

2
@YauhenYakimovich Bu, OOP'yi tartışmanın temel sorunlarından biri, herkes ve köpeğinin ne olduğu hakkında kendi fikirleri var. Bunun aksine, yapılandırılmış programlama ve fonksiyonel programlamanın her biri çok basit bir şekilde tanımlanabilir. Bu, OO'nun bilim yerine dine benzer özelliklere sahip olup olmadığını sorgulamama neden oluyor.
Ricky Clarkson

Yanıtlar:


19

OO, Alan Kay'ya göre tamamen mesaj geçişi ile ilgili ve hepsi bu. Çok biçimlilik ve kapsülleme gibi niteliklerin aslında mesaj geçişinden kaynaklandığını göreceksiniz.

Şimdi bu duruş aslında çok aşırı, çünkü temelde sadece Smalltalk ve dillerin aynı nitelikte olacağı anlamına geliyor.

OO'yu, sisteminizi, durumlarını tam olarak içine alan ve doğal polimorf özellikleri nedeniyle değiştirilebilir hale getiren varlıklar üzerine inşa etmek olarak tanımlayabilirsiniz. Böylece tamamen OO dili bu iki temel niteliğin her zaman karşılanmasını sağlar. OO dillerini "saf olmayan" kılan şey, bu kriterleri karşılamayan yapıların oluşturulmasına izin veren mekanizmalar olacaktır, örneğin:

  • halka açık alanları beyan et
  • yalnızca belirli bir sınıfın örneklerini ve alt sınıflarını tutabilecek değişkenleri (yani değişkenler, Kay'ın anolojisinde biyolojik nesnelerin iletişim kurduğu arayüzlere yazılmalıdır) tanımlayın; bu da polimorfizme daha az yer bırakır
  • ilkelleri beyan et

Sonra tekrar, IMHO dil saflığı bir güçten çok bir zayıflıktır. OO gümüş bir kurşun değildir. Tek bir paradigma yoktur.


2
+1 "OO gümüş bir kurşun değildir".
Andres F.

1
@AndresF. OOP'un pratik değerinin yanı sıra programlama ile ilgili diğer teorik bilgilerin gerçekten de bir sorunun parçası olmadığını unutmayın. Kodlama, programlama teknikleri veya teorileri (ve tersi) hakkında derin bir anlayış olmadan oldukça başarılı bir şekilde kod yazabileceği açıktır. OO dillerinin uygulama özellikleri de tartışılmaz, vs.
Yauhen Yakimovich

@YauhenYakimovich Oh, biliyorum. Eğer konu dışı olsaydı cevabı iptal edemezdim. Yine de katıldığım bir iddiayı beğendim.
Andres F.

@AndresF. Tabii :-) "OO gümüş bir mermi değil" büyük olasılıkla doğru olduğu gibi mükemmel bir programlama dilinden yoksundur. Ama OOP'u gümüş bir kurşun değil tam olarak yapan nedir? İyi bir hata raporu gibi, detaylı ve kesin terminolojinin buna cevap vermenin yolu olduğunu düşünüyorum. Onunla çalışmak için çok zaman harcadım, bir sonraki seviyeye getirmek için çok meraklıyım. OOP sadece bir grup fikirden bir programlama kitabından diğerine yapıştırılmış mı?
Yauhen Yakimovich

@ back2dos +1, Kay (Smalltalk, Objective-C) 'ye göre "mesaj iletme" rolünü açıkça belirttiği için. Görünüşe göre OOP'un bugünkü yönlere doğru geliştiğini hiç düşünmemişti. Ama Kay veri nesneleri (türleri) yapmak için bu fikirleri vardı gerçekten sevdim. Onları gerçekten biyolojik niteliklere atfetmeye çalıştı, ancak "mesajlaşma" ile sonuçlandı.
Yauhen Yakimovich

6

Buna, OOP yapılarını kullanan ve başka bir şey kullanan bir dil olarak tanımlayarak yaklaşırdım (saf FP dilinin değişmez verilerle saf işlevleri kullandığı şekilde ve başka bir şey olmadan).

Özellikle:

  • Programınızın üzerinde çalıştığı her varlık birinci sınıf bir Nesnedir - yani ilkel, işaretçi, dizi vb.
  • Bir nesneyle yapabileceğiniz tek şey , üzerinde (potansiyel olarak polimorfik) bir yöntem çağırmaktır (== mesaj gönderme). Başka işlem yok.
  • Tüm veriler kapsüllenir - yani kamusal alan erişimi yok, bir nesne üzerindeki yöntemlerden geçmelisiniz
  • Birinci sınıf işlevleriniz varsa, bunlar da nesne olmalıdır - bu yüzden böyle bir şey yapmanız gerekirfunctionObject.call(param1,param2)
  • Global değişken yok - böyle bir şey istiyorsanız, mevcut global ortamı temsil etmek için bir nesne kullanmanız gerekir, örneğin environment.getValue("myThing")veya değişkeni bir sınıf nesnesine koymanız gerekir

Bunun hala birkaç seçeneği açık bıraktığını unutmayın:

  • Sınıf tabanlı veya prototip tabanlı nesne modelleri
  • Kalıtım nasıl uygulanır (eğer varsa)
  • Yöntemlerde tek veya birden fazla dağıtımınız olup olmadığı
  • Nesnelerinizin statik veya dinamik olarak yazılıp yazılmadığı
  • Yöntem çağrıları için kullanılan tam sözdizimi (örneğin, alıcılar / ayarlayıcılar için sözdizimsel şekeriniz olabilir).

1
bunlar iyi tanımlar, ancak nesne gerçekliğini sadece sözdizimi ile karıştırmayın. İşlevler ve global değişkenler dostane bir sözdizimine sahip olduklarından, aslında kalpteki nesneler olabilirler.
ddyer

@ddyer - bu gerçekten sadece sözdizimi ise doğrudur, ancak sözdizimi de farklı anlambilim içeriyorsa "saflığı" bozabileceğini düşünüyorum. Örneğin, global değişkenlere wrt kullanımı, globalVariableNameglobal bir değişkene erişmek için kullanılması , bir nesne üzerindeki yöntem çağrısından farklı bir anlamsaldır; bu, saf OOP'ta yerel olmayan bir değere erişmenin tek yoludur.
mikera

"Her şeyin" kalifiye olması gerektiğini düşünüyorum. Bir dilin hiçbir yansıtma yeteneği yoksa (örneğin, bir nesnenin yöntemine soyut bir adla başvuramaz veya bir değişkende saklayamazsa), yöntemlerin de nesne olması gerekir mi? Referans nesneleri mi? Referanslar ve nesneler farklı şeyler mi?
Joachim Sauer

@ Joachim - iyi bir nokta. Nesneleri, değişken adları ve sözdizimsel yapılar gibi meta meta nesnelerden ayırt etmek için bunu "programınızın üzerinde çalıştığı her varlık" olarak nitelendirdim. Açıkçası, programınız gerçekten böyle şeyler üzerinde yansıma yoluyla çalışırsa, o zaman gerçek nesneler olarak yeniden tanımlanması gerekir, ancak bu her zaman bir gereklilik olmayacaktır. Her neyse, daha iyi bir nitelik düşünebilirseniz, o zaman düzenlemek için çekinmeyin!
mikera

"Sınıf tabanlı veya prototip tabanlı nesne modelleri": ancak her iki durumda da bir tür sınıflandırmaya sahip olduğunuzu söyleyebilirim, yani ortak bir yapı ve davranışa sahip nesneleri gruplandırırsınız.
Giorgio

4

OO dilleri ile ilgili tartışma her zaman beyin yıkanmış tarafta olmuştur. yani:

"Birisi bana X dilinin OO olduğunu söyledi, bu nedenle X dili OO'ya eşit, o zaman X dilinin özelliklerinden yoksun olan her dil OO olamaz. Ve kodumu X dilinde yazdığım için yaptığım her şey OO. "

Nesneye yönelik tasarım terimi 3 şeye bağlanır:

  1. Programın geri kalanı hakkında gereksiz bilgiler bilmeyen otonom nesnelerle modüler tasarım, yani mümkün olduğunca gevşek bağlantı .
  2. Hem kasıtlı hem de kazara harici erişimi önlemek için nesnelerin içindeki verilerin kapsüllenmesi.
  3. Nesneler arasında açıkça belirtilen bağımlılıklar. Gevşek kuplaj elde etmek, aynı zamanda programın bakımını ve genişletilmesini kolaylaştırmak.

1) saf program tasarımı, herhangi bir programlama dilinde elde edilebilir. Ancak, bazı diller sınıf / yapı ve özel anahtar kelimeler gibi yararlı özelliklere sahiptir.

2) esas olarak program tasarımıdır, ancak dil desteği olmadan tam olarak elde edilemez, çünkü yanlışlıkla kullanıma karşı özel / statik gibi dil mekanizmalarına ihtiyacınız vardır.

3) esas olarak program tasarımıdır. Genellikle üç farklı bağımlılık vardır: "X nesnesi Y nesnesini içerir", "X nesnesi bir tür Y" ve "X nesnesi Y nesnesiyle etkileşime girer". Bu bağımlılıklara yardımcı olacak birçok dil özelliği vardır: kalıtım / polimorfizm, soyut temel sınıflar vb.

Şimdi, yukarıdakilere bakarsak, OO programları yazmak için herhangi bir dil özelliğine ihtiyacınız olmadığını görebiliriz. Özellikler çok daha kolay.

Yukarıdaki hedeflere biraz çamurlu geriye doğru mantık kullanılarak ulaşılamaz: sadece class anahtar sözcüğünü kullandığınız için, programınız otomatik olarak modüler bir tasarım elde etmez. Sırf kalıtım kullandığınız için, nesne bağımlılıklarınızın otomatik olarak anlamlı olduğu anlamına gelmez. OO özelliklerine sahip bir dil, class TheWholeBloodyProgram"Hayvan Cat'i devralır" gibi şeylere izin verir .

Ne yazık ki, iyi nesne yönelimli program tasarımı konusu bu tür tartışmalarda nadiren bahsedilmektedir. Beyin yıkama programcıları sadece sözdizimine bakar ve örneğin "C ++ ilkel veri türlerine sahiptir, bu yüzden C ++ programınız OO değildir" gibi şeyler yaparlar, daha sonra herhangi bir ipucu kullanmadan kendi favori dillerinde düpedüz korkunç bir program yazmaya giderler. program tasarımı.

Soruyu cevaplamak için: Çok az, herhangi bir dilin uygun OO program tasarımı için desteği varsa. Programcı nesneye yönelik tasarımın ne anlama geldiğini bilmediği sürece, OO ile ilgili belirli özelliklere sahip hangi dilleri bulmak önemsizdir. Belirli dillerin nesne yönelimli olduğunu iddia eden bir programcı büyük olasılıkla OO kavramını bir bütün olarak kavramadı. OO programcısına OO programlarını nasıl tasarladıklarını sorun. Yaptıkları ilk şey dil anahtar kelimeleri bağırmaya başlamaksa, OO tasarımını bilmediklerini güvenle varsayabilirsiniz.

Belki de ham kaynak kodunun çok üstünde bazı süslü yüksek seviyeli UML-ish aracı vardır, bu da programcıyı sadece iyi nesne yönelimli tasarıma sahip programlar yazmaya zorlar, ama bundan şüpheliyim. OO programlama için en iyi tasarım araçları büyük olasılıkla hala insan beyni ve sağduyudur.


Tanımınızın, örneğin soyut veri türleriyle modüler programlamadan nasıl farklı olduğunu açıklayabilir misiniz? Sanırım doğru yoldasınız, ama henüz treni göremiyorum!
Jörg W Mittag

@ JörgWMittag Mutlaka farklı değildir, geleneksel ADT: ler nesne yönelimli tasarım kullanılarak, uygun kapsülleme, ayarlayıcılar / alıcılar, miras alma yolları vb. İle yazılabilir. ->

2
@ JörgWMittag Örneğin OO için sınırlı dil desteğine sahip C gibi bir diliniz varsa, ADT: s'yi nesne yönelimli bir şekilde yazmak zordur. En yaygın hata, ADT'nin tahsisini arayana bırakmak, yani maruz kalan tüm iç kısımlarla birlikte kamuya açık bir yapı vermek, kapsüllemeyi kırmaktır. Bunu C'de yapmanın uygun yolu "opak tipler" den (eksik tipler) geçmektir, ancak pek çok C programcısı bunları kullanmayı bilmez.

@Lundin: JörgWMittag tarafından başka bir cevaba yorum olarak gönderilen makalede ADT ve OO arasında ilginç bir (IMO) karşılaştırma var.
Giorgio

Bazı UML kitaplarından (muhtemelen) ek bir nokta 0 hatırlıyorum. Soyutlık (polimorfizm, kalıtım, toplama vb. Gibi nesneler arası ilişkiler için gerekli soyut formülasyonun önemini vurgulamak).
Yauhen Yakimovich

2

Hayır, resmi veya hatta yararlı bir tanım yoktur ve asla olmayacaktır. Bazı insanlar için OOP, "Evrensel temel sınıf" ve "En iyi bir çöp toplayıcı ile referans anlambilimi kullanmalıdır" anlamına gelir - ve şimdiye kadar icat edilen en az alakalı şeylerden biri olan sözdizimi hakkında tartışmalar bile alabilirsiniz.

Sonuçta, önce, "Nesne nedir?" Sorusunu cevaplamalısınız. Daha dar görüşlü, bazı anlamsız evrensel temel sınıftan miras almak ve gereksiz yere hak kazanmak için bir çöp toplayıcıya tahsis etmekte ısrar edecektir. Ama çok daha kullanışlı bir tanım tercih ediyorum. OOP'nin amacı bazı veriler ve bu veriler hakkında çağırabileceğiniz bazı işlevlere sahip olmaktır. Yani

  • Bir nesne bir durum tutar ve bu durum üzerinde bazı işlevler sunar.

Bu durumda bile inthak kazanır. Sonuçta, ilkel veya nesneleri kabul edebilen C ++ 'da şablon kodu yazdığınızda, ilkellerin herhangi bir şekilde önemli olduğunu iddia etmek zorlaşır. Vector v1, v2; v1 + v2;Bunun yerine anlamlı bir şekilde farklı bir şey yok int v1, v2; v1 + v2;(boktan başlatma semantiği hariç, itiraf etmek gerekir). Ayrıca bu, lambdaların ve bu tür şeylerin nesne olmalarına izin verir, çünkü onlar kendi devletlerini ele geçirirler - onların yakalanmalarını - ve bu durumda lambda'yı çağırmak için bir işlev sunarlar.

Neyse ki, hem durum (bir adres) hem de bu durumdaki bir fonksiyonu (çağırmak için) bulunduğundan, işaretçileri serbest işlevler için nesne olarak sınıflandırabiliriz. Bu nedenle, tüm serbest işlevlerin aslında küresel işlev işaretçileri olduğunu söyleseniz bile, bir serbest işleve izin verilmelidir.


2
Böyle bir ayırım yapmaya gerek yok. Ancak ikincisi, diğer nesnelerin adres / referans karşılaştırmasıyla aynı kimliğe sahiptir. Adresleri karşılaştırmak dışında aynı durumdaki iki nesneyi birbirinden ayıramazsınız, yeni olmaktan çok uzaktır ve tüm nesneler için geçerlidir.
DeadMG

5
-1. İşe yaramaz ve gereksiz bir rant ile başlar, kısa bir süre sonra ad hominem saldırısına geçer ve uzaktan gerçeklere dayanan tek şey ( OOP tanımı ) yanlıştır. Özet Veri Türü ve Nesne arasındaki fark için William R. Cook tarafından tekrar ziyaret edilen Veri Soyutlamasını Anlama Üzerine bölümünü okuyun .
Jörg W Mittag

1
“Böyle bir ayrım yapmaya gerek duymuyorum.”: Fakat bu ayrım nesnelerin genel kabul gören özellikleri arasında. Tabii ki, yaygın olarak kabul edilenden farklı bir nesne hakkında kendi fikrinizi geliştirebilirsiniz. Bunu yapmakta tamamen özgürsünüz.
Giorgio

2
@ Jörg Farklı olmaya yalvarıyorum. Tamamen bu gönderiye katılmıyorum, ancak ilk paragraftaki uyarıyı “işe yaramaz” veya “rant” olarak adlandırmak aykırıdır. OOP'nin tanımı konusunda evrensel olarak kabul edilmiş bir bilgi yoktur. Bu basit ve yaygın olarak kabul gören bir gerçektir. Yazının geri kalanı bir OOP tanımı. Kesinlikle en çok kullanılan, ne de vereceğim, ama DeadMG'nin dediği gibi, aslında oldukça yararlı.
Konrad Rudolph

2
@KonradRudolph: Yorumumu yazarken sözdizimini önemseyen programcıları ırkçılarla karşılaştırmak, hatta bu sitenin belirli bir kullanıcısından adıyla bahsetmek de dahil olmak üzere çok farklı okundu.
Jörg W Mittag

0

Bunu negatif örnekle düşünebilirsiniz. Java, nesneye yönelik olmayan bir dil değildir, çünkü nesne olmayan ilkel türler de vardır. Bunlar tamsayılar, çiftler, diziler vb. Saf bir nesne dilinde, nesnelerin anlambilimi her şey için kullanılabilir.

Ayrıca, dilin ne kadarının nesne çerçevesi içinde bile modifikasyona kapalı olduğu sorusu vardır. Java'da, String veya Class gibi bazı sınıflar için yeni alt sınıflar tanımlayamazsınız.

Hangi diller saftır? Akla gelen tek aday smalltalk.


Ruby saf OO dili de değil mi?
zxcdw

2
@zxcdw (ve ddyer): sorun tam olarak budur: Kimsenin resmi bir "saf OO" tanımı yoktur, bu yüzden kimse bu soruya kesin bir cevap veremez.
Joachim Sauer
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.