Nesne Yönelimi için gereken özellikler nelerdir?


9

Sadece bir dilin veya bir kütüphanenin 'Nesneye Dayalı' olarak tanımlanması için tam olarak ne özellikleri olması gerektiğini merak ediyorum. Nesne Yönelimi , iyi özelliklere sahip herhangi bir genel amaçlı programlama dilinde az çok elde edilebilecek bir şey midir? Yoksa yalnızca Nesne Odaklı Programlamayı desteklediklerini özel olarak tanıtan dillerde elde edilebilecek bir şey mi?

Örneğin, aşağıdaki C koduna bakın:

SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE);
SDL_FreeSurface( screen );

veya burada tartışılan kod .

Şimdi yukarıdaki kod kalıtım, çalışma zamanı-polimorfizm (?), Sanal fonksiyonlar vb. Kullanmaz. Ama bana çok OOP gibi görünüyor.

Nesne-Oryantasyon basitçe böyle herhangi bir özel desen üzerinde gerektirmez veya Programlama Dili veya bir tarafından sağlanan özellikler yapılar vb nesneler, sınıflar gibi creatable ve destructable veri yapıları dayalı kod yazıyor kütüphaneye ?


2
OOP genellikle nesneler gerektirir . Ancak çoğu dilde OOP gibi görünen bir kod yazmak mümkündür ("Bu derleme OOP görünüyor" diyebilirsiniz)
Raynos

Yukarıdaki kod bir if ifadesi veya döngü kullanmaz . Çarpma veya toplama kullanmaz. Herhangi bir yargıya varmak için iki kod satırı ve gösterilmeyen şeylerin listesini kullanamazsınız . Bu iki kod satırından, bir OO dili değil, kesinlikle tembel bir fonksiyonel programlama dili olduğunu söyleyebilirim. Genellemenin bir parçası olarak iki kod satırı kullanmak gerçek bir soru değildir.
S.Lott

Bağlantı da dahildir yukarıdaki kodda ben üzerine değerlendirilecektir. Ayrıca bir olmadığına dikkat yargı , ben değilim soran bu cepten düşünülebilir olmadığını.
ApprenticeHacker

Önemsiz cevap evet . Demek istediğim bu. Kod örneklerinden OOP hakkında bir yargıya varamazsınız. Bu önemsiz bir tanım meselesi. Ya dil olduğu belirlenen bir OOP dili olarak ya da yoktur. Herhangi bir kod örneği tüm OOP özelliklerini gerektirmeyebilir . Gerçekten de, OOP kodu çok çok az özellik kullanabilir. Örneğin Python'da 1+2gerçekten Nesneye Yöneliktir. Mevcut iki nesneden yeni bir nesne oluşturan bir kurucudur. Kod örnekleri kullanmak hiçbir şey göstermez.
S.Lott

Bu tanımın kullanılması ve dil ile karşılaştırılmasında yanlış olan nedir (iki kod örneği değil)? en.wikipedia.org/wiki/…
S.Lott

Yanıtlar:


11

"Nesne yönelimli" terimini icat eden Alan Kay'a göre,

OOP bana sadece mesajlaşma, yerel tutma ve devlet sürecinin korunması ve gizlenmesi ve her şeyin aşırı geç bağlanması anlamına geliyor. Smalltalk ve LISP'de yapılabilir. Muhtemelen bunun mümkün olduğu başka sistemler de var, ama bunların farkında değilim.

Mesajlaşma (Smalltalk'ta uygulandığı gibi), polimorfizmle karşılaştırılabilir bir kavramdır, ancak oldukça daha güçlüdür (en azından C ++ veya Java tarafından desteklenen bir tür polimorfizmden). Tüm dillerde yapılabilir, ancak doğrudan dil tarafından desteklenmiyorsa oldukça acı vericidir. Temel olarak, nesneler birbirlerine herhangi bir şey içeren mesajlar gönderebilir, amd tepki gösterebilir ancak aldıkları mesajlara istedikleri anlamına gelir. Mesajlaşmayı tam olarak desteklemek için, nesnelerin kaynak kodunda numaralandırmadan iletilere esnek bir şekilde tepki vermesinin bir yolu olmalıdır (temel olarak yöntem / işlev tanımlarının yaptığı şey budur).

devlet sürecinin yerel olarak tutulması ve korunması ve saklanması - AKA kapsüllenmesi - tüm dillerde konvansiyon ile yapılabilir, ancak bu biraz aldatıyor. Dil düzeyinde yerel tutma, aslında OO (ve paylaşmayanların çoğu) paylaştığını iddia eden tüm dillerin tek özelliği gibi görünmektedir - genellikle birden çok örnekle bileşik veri türleri oluşturmanın bir yolu vardır. Öte yandan, koruma ve saklanma genellikle sadece sözleşmeyle yapılır.

her şeyin geç bağlanması - C'nin Kay'ın vizyonundan gerçekten uzak olduğu kayan bir ölçek (C ++ gibi, Java çok daha yakınken). Taklit edilebilir (bkz. COM), ancak bu kullanmak için bir acı olacaktır.

Kay'ın mirastan nasıl bahsetmediğine dikkat edin . Aynı e-postada yazdı

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


4
Java ve C #, geç bağlanmaya C ++ 'dan nasıl daha yakındır?
fredoverflow

@FredOverflow: Java, ilk kez kullanıldıklarında çalışma zamanında sınıf tanımlarını tembel olarak yükler ve bunu, yeni sınıflar eklemeye veya hatta anında oluşturmaya izin veren son derece esnek bir mekanizma ile örtük olarak yapar. C ++, yürütülebilir dosyalarınızı yeniden bağlamanızı veya kitaplıkları açıkça yüklemenizi gerektirir. C # ile durum düşündüğümden daha az net görünüyor, bu yüzden ti referansını kaldırdım.
Michael Borgwardt

5

Nesneye yönelik programlama sözdizimi özellikleriyle ilgili değildir, kodlama ve tasarım felsefesi ile ilgilidir. Özünde, üzerinde hareket edecek rutinleri (veya bakış açınıza bağlı olarak mesajlara verilen yanıtları) belirtmek için gruplayan bir yapı olan bir nesne kavramı duruyor . OOP'un diğer önemli yönü kapsüllemedir : uygulama detaylarını opak yapılara sarmak ve bunları iyi tanımlanmış arayüzler aracılığıyla bağlamak. OOP teorisindeki hemen hemen her şey bu iki temel ilkeye dayanmaktadır.

Bu nedenle, nesneleri (hem veri hem de kod içeren varlıklar) ve kapsüllemeyi bir şekilde modelleyebilen herhangi bir dil OOP yapmak için kullanılabilir. Örneğin, C'de işlevleri yapılarda saklamak için işlev işaretçileri kullanabilir ve kapsüllemeyi gerçekleştirmek için üstbilgi / kaynak dosya sistemini kullanabilirsiniz. Uygun değil, ama OOP yapmak yeterlidir. Muhtemelen Haskell veya ML gibi bir şeyi OOP yapmak için bükebilirsiniz ve birisi montajda OOP yapmanın bir yolunu bulabilirse şaşırmam.

Bununla birlikte, pratik olarak, bir dil, açık nesne yönelimli programlama için eksiksiz bir sözdizimi özellikleri kümesi sağlıyorsa 'nesne yönelimli' olarak adlandırılabilir. Tipik olarak, bu, böyle bir dilin aşağıdakilere sahip olması gerektiği anlamına gelir: * bir nesne kavramı * yöntem çağırma veya mesaj iletme kavramı * nesne üyelerine erişimi kontrol etmenin rahat ve basit bir yolu * arayüzleri tanımlamanın rahat ve basit bir yolu

Sonuç olarak, OOP ilkelerine uyuyorsa ve kullanılabilir OOP sözdizimini kullanıyorsa, nesne yönelimli bir kod parçası çağırırdım.

BTW., Senin kod örneği muhtemelen yapar C sözdizimi çok açık yapmaz rağmen, kullanım polimorfizm ve sanal fonksiyonlar. SDL konusunda uzman değilim, ancak SDL_surfaceher birinin kendine özgü uygulamaları olan çeşitli farklı yüzey türlerini temsil edebilmesini beklerdim - bir bellek bitmapine bir şey blitting ve bir ekran yüzeyine blitting radikal olarak farklı gerektirir ancak arabirim ( SDL_surface*bağımsız değişken olarak alan işlevler ) aynı kalır. Tıpkı bunun gibi, kapsülleme de uygular: Bir yüzeyin temel temsiline doğrudan erişemezsiniz, bir işin nasıl ele alınacağını bilen işlevlerden geçmeniz gerekir SDL_surface, çünkü sahip olduğunuz tek şey bu. C'de OOP'u nasıl yapacağınıza güzel bir örnek.


Özet Veri Türleri, veri modelleme ve kapsülleme OO'ya özgü değildir (kısaca sizden bahsettiğiniz gibi).
OO'yu

4

OO anlayışım, OO'nun, bir işçinin (nesne) veya bu işçiler ( nesneler). Bu çalışma zamanı davranışı, etkinleştirmek için sağlam statik ve dinamik yapılar gerektirir.

OO'nun uygulanacağı sözdizimi, bir dilin OO olup olmadığını belirleyen anahtar değildir. Örneğin, Smalltalk ve C # farklı sözdizimlerine sahiptir, ancak her ikisi de OO dilidir (değişen derecelerde). Anahtar, verilen dilin (yukarıda) felsefeyi koruyup korumayacağı ve gerekli implantasyon araçlarını sağlayıp sağlamadığıdır.


2

Bir öğrenciyken bana nesne yönelimli programlamanın üç sütun üzerinde durduğu öğretildi:

  • kapsülleme ,
  • polimorfizm ve
  • kalıtım .

Bir dilin nesne yönelimli bir dil olarak kabul edilebilmesi için bu özellikleri desteklemesi gerekecektir .

Bunun sözdizimi yerine bir dizi özelliği açıkladığını unutmayın . Bu nedenle, yazmanız gerekip gerekmediği

type obj; // or type obj = new type;
obj.func(arg);

veya

type* ptr = create_type();
func(ptr, arg); 

önemli değil.

Yani gerçekten de C'deki nesne yönelimli paradigmaya göre programlayabilirsiniz. Ancak dil bunu desteklemiyor, bu da onu oldukça acı verici bir egzersiz haline getiriyor. Bu nedenle C, nesne yönelimli bir dil olarak kabul edilmez.


2
Bu "sütunlar" ın öğretilmesi muhtemelen dünyaya faydadan çok zarar vermiştir. Kapsülleme iyidir, ama hepsi bu.
tdammers

1
Bu listedeler, bu yüzden yaygın kabul görüyorlar: en.wikipedia.org/wiki/…
S.Lott

Polimorfizm ve Kalıtımın neden kötü olduğunu açıklayabilir misiniz?
MathAttack

@MathAttack: Benimle mi konuşuyorsun ? Çünkü kesinlikle söylemedim.
sbi

1
@missingno: Bir şey, paradigmayı ayırt etmek için önemli kabul edilecek bazı paradigmalara özgü olmak zorunda değildir. Kapsülleme, işlevlerin yapılandırılmış programlamaya özgü olması gerektiğinden, OOP'ye özel olmak zorunda değildir.
sbi

2

Sen edebilirsiniz herhangi nezih genel amaçlı dilinde OO yapmak.

Bunu "OO" dilinde yapmak daha kolaydır , çünkü mevcut deyimsel yapılarınız vardır ve C'deki OO gibi bir şeye başvurmak zorunda değilsiniz - bu mümkün, ancak korkunç.

OO yapılarının dilin kendisi, standart kütüphanesi veya başka bir kütüphane tarafından sağlanmış olması önemli değildir, çünkü bazı diller (örn. Scala) kütüphanelerin dil yapıları eklemesine izin verir, böylece programcının bakış açısından neredeyse imkansızdır hangi şeylerin temel dil tarafından ve hangilerinin bir kütüphane tarafından sağlandığını ayırt etmek.


2

OO olarak yaygın olarak kabul edilen ve kabul etmeyen dil aralığına bakarsanız, test inklüzyon polimorfizminin (alt tip polimorfizm olarak da bilinir), ancak inklüzyon polimorfizmi Cardelli tarafından beni tanıtan bir kağıt , ve ben başkalarını da bir çeşit polimorfizm sınıflamasına sokuyorum). IE, bazı değişkenlerin farklı türde değerlere sahip olma olasılığı ve bazı çağrıların, bir veya birkaç değerin türüne bağlı olarak farklı rutinlere gönderme olasılığı. Diğer her şey OO olarak kabul edilmeyen dillerde mevcuttu veya OO olarak kabul edilen dillerde eksik.

OO dilleriyle ilişkili diğer iki önemli özellik OO olmayan diller tarafından sağlanmıştır:

  • Kapsülleme Ada83 tarafından oldukça iyi sağlanmıştır;
  • Kalıtım Oberon tarafından sağlanır (Oberon ilginçtir, Wirth bir OO diline mümkün olduğunca az sarsıntı sağlamak istedi, ancak bir tane almak için anlayışını tekrar gözden geçirmek zorunda kaldı - Oberon-2 OO).

1

Nesne yönü şu şekilde tanımlanır:

ayrıca wikipedia girişlerini kontrol edin. bunlar bir dilin nesne yönelimli olarak tanımlanması için sağlaması gereken özelliklerdir.

nesne yönelimli bir programlama dilinde ise kod nesne yönelimli düşünün. yordam gibi görünen bir şey yazsanız bile, kapsülleme yoluyla polimorfizm kullanan sınıflardan nesnelerdeki yöntemlere göre hareket edecektir [belki] :)

son sorunuzla ilgili cevap muhtemelen. Evet. nesne yönelimli temelde sadece nesneler üzerindeki yöntemlere etki eder ve bu nesnelerin etrafında parametre olarak geçer.


3
Kim tarafından tanımlandı?
Michael Borgwardt
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.