Neden kalıtım, kapsülleme ve polimorfizm OOP direkleri değil? [kapalı]


16

Bir gün Stack Overflow sohbetine gittim ve bir miras gördüm, bu da miras, enkapsülasyon ve polimorfizmin OOP'un temel direkleri olduğunu (temel oldukları anlamıyla bir inşaat tabanı olduğunu) belirten bir ifade gördüm.

Ayrıca, benzer bir soru var, üniversite sınavlarında ve iş görüşmelerinde sıkça soruldum ve doğru cevap her zaman sorunun başlığında telaffuz edilen ifadeydi ("Evet, kalıtım, kapsülleme ve polimorfizm OOP'un sütunlarıdır) ).

Ancak Stack Overflow sohbetinde ciddi şekilde alay konusu oldum, katılımcılar böyle bir ifadeye şiddetle karşı çıktılar. Peki, bu ifadenin nesi yanlış?

Programcılar Sovyet sonrası ve Amerika Birleşik Devletleri kolejlerinde farklı konularda eğitim almış gibi görünüyor mu?

Kalıtım, kapsülleme ve polimorfizm ABD / İngiltere programcıları tarafından OOP'nin temel direkleri olarak kabul edilmiyor mu?


7
Sorunuzun bağlamı yok; SO sohbetteki insanların ne düşündüklerini veya neye cevap verdiklerini bilmiyoruz. Belki sohbet odasındaki sohbete bağlanabilir, böylece bir göz atabiliriz? Bununla birlikte, bunun en iyi sohbet odasında değil, burada olduğunu düşünüyorum.
Robert Harvey

1
@ Robert, çok fazla zaman geçti. Konuşmanın bağlantısını bile bulabilsem şüpheliyim. Ancak bağlamın önemli olduğunu kabul ediyorum. Birini suçlamak ya da kendimi sohbet saldırganlığının masum bir kurbanı olarak sunmak değil, sadece gerçeği bilmek istiyorum.
PaulD

5
Loca. Önce alev geçirmez elbiseni giydin mi?
Robert Harvey

1
Cümleye verebileceğim tek anlam ya "herhangi biri olmadan OOP olabilir" (doğru, ama en azından kapsülleme için hiçbir anlam ifade etmiyor) ya da "onları OOP dışında da kullanabilirsiniz" ya da bunun gibi bir şeydir.
SJuan76

2
Imo OO'nun sadece bir sütunu var ve bu: "Devlet". Beyniniz durum düşündüğünde, OO alırsınız.
Pieter B

Yanıtlar:


40

Kalıtım, kapsülleme ve polimorfizm ABD / İngiltere programcıları tarafından OOP'nin temel direkleri olarak kabul edilmiyor mu?

Birçok programcı tarafından sütun olarak kabul edilirler ve birçok kolej OO'yu bu şekilde öğretir.

Ne yazık ki, aynı zamanda dar görüşlü bir görünümdür.

  • Kalıtım OOP uygulamak için kullanılan bir mekanizmadır ve OOP yapmamak için kötüye kullanılabilir.
  • Kapsülleme, OOP ve değil, her türlü programlama için yararlı bir kavramdır.
  • Çok biçimlilik, hesaplamanın nasıl davrandığını açıklayan bir özelliktir (?). Hepsi OO'ya özgü olmayan polimorfizme ulaşmanın birçok yolu vardır.

OOP çok az bir temele sahiptir, çünkü gerçekte çok kavramsaldır: "Bir şeyi nesneler olarak düşünerek programınızın tasarımına yaklaşın - veri ve işlevsellikleri birleştiren paketler."

Modern program tasarımı, işleri "tamamen OO tarzında" yapmak için kötü bir görüş alırken, çoğu yetenekli programcı, SOLID ilkelerinin (veya bazı alt kümelerin) "Nesne Odaklı Programlamanın temel direkleri" için daha iyi adaylar olduğu konusunda hemfikir olacaktır. OOP olmayanlara iyi uygulayın). Bunlar hiç bu terimlerle çalışmaz. Bunun yerine, nesneler bir olan yazılım varlıkları, arayüzler (bir C # / Java / vb. interfaceBirdir), soyutlama ve alt yazma (kalıtım bir formdur) kavramlarını kullanırlar .


10
Aslında cevapsız bir soruya iyi cevap.
Robert Harvey

3
OOP var mı?
Tulains Córdova

5
Sadece kapsüllemenin OOP'un "sütunu" olduğunu iddia ediyorum. OOP ve yapısal programlama arasındaki en büyük fark, nesnelerin sadece veri değil, kod ve veri içerdiği fikridir (örneğin klasik bir C yapısı). Diğer iki kavram öncelikle OO dillerinde kullanılır, ancak ne OO ile sınırlandırılır ne de zorunlu değildir.

3
@Snowman Kapsülleme de OOP ile sınırlı değildir. İnsanlar her zaman C ve fonksiyonel dillerde soyut veri türlerini uygularlar.
Doval

2
Ve @ JörgWMittag'in mesajlaşma konusunda iyi bir cevabı vardı. Mesajlaşma fikri mutlaka kapsüllenmeyi gerektirir . Mesajlar tipik olarak bir nesne üzerindeki bir fonksiyona veya yönteme iletilir ve daha sonra burada kapsüllenen duruma etki eder . Bu, OO dışı dillerin de mesaj geçirme veya kapsülleme yapamayacağı anlamına gelmez, sadece bunların OOP'nin temel fikirleri olduğu anlamına gelir.

23

tl; dr: OO olmadan kalıtım olabilir, OO olmadan kapsülleme yapabilirsiniz, OO olmadan polimorfizme sahip olabilirsiniz, OO'suz üç kerede bile olabilirsiniz. Flipside, kalıtım olmadan OO'ya sahip olabilirsiniz. Ayrıca, farklı kapsülleme türleri (ADT odaklı ve OO) vardır, IOW tüm kapsülleme OO değildir.

Uzun versiyon:

"Nesneye Yönelik Programlama" terimi Alan Kay tarafından icat edildi, bu yüzden ne anlama geldiğine karar verdi. Ve bunu şu şekilde tanımlar :

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.

Uygulama açısından, mesajlaşma geç bağlı bir prosedür çağrısıdır ve prosedür çağrıları geç bağlıysa, tasarım zamanında ne arayacağınızı bilemezsiniz , bu nedenle devletin somut temsili hakkında herhangi bir varsayım yapamazsınız. Yani, gerçekten mesajlaşma ile ilgili, geç bağlama mesajlaşma uygulamasıdır 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çekten önemli olandan (mesajlaşma) dikkat dağıtır:

Smalltalk'un sadece sözdizimi ya da sınıf kütüphanesi olmadığını, hatta sınıflarla ilgili olmadığını herkese hatırlatmak için son OOPSLA'da bazı acıları aldığımı nazik bir hatırlatma. Uzun zaman önce bu konu için "nesneler" terimini bulduğum için özür dilerim, çünkü birçok insan daha az fikre odaklanıyor.

Büyük fikir "mesajlaşma" - Smalltalk / Squeak çekirdeği bununla ilgilidir (ve bu Xerox PARC aşamasında asla tam olarak tamamlanmamış bir şeydir). Japonların küçük bir sözcüğü vardır - ma - "arasında" olan - belki de en yakın İngilizce karşılığı "geçiş reklamı" dır. Büyük ve büyütülebilir sistemler üretmenin anahtarı, modüllerinin iç özelliklerinin ve davranışlarının olması gerekenden ziyade nasıl iletişim kurduğunu tasarlamaktır. İnterneti düşünün - yaşamak için, (a) herhangi bir standardın ötesinde birçok farklı türde fikir ve gerçekleştirmeye izin vermek ve (b) bu ​​fikirler arasında değişen derecelerde güvenli birlikte çalışabilirliğe izin vermek zorundadır.

(Elbette, bugün çoğu insan nesnelere değil, daha da yanlış olan sınıflara odaklanıyor.)

Mesajlaşma , hem metafor hem de bir mekanizma olarak OO için esastır .

Birisine mesaj gönderirseniz, onunla ne yaptığını bilmezsiniz. Gözleyebileceğiniz tek şey onların cevabıdır. İletiyi kendileri işleyip işlemediklerini (yani nesnenin bir yöntemi varsa), iletiyi başka bir kişiye (temsilci / proxy) iletmişlerse, anladılarsa bile bilmezsiniz. Enkapsülasyonun hepsi bu, OO tamamen bununla ilgili. Proxy'yi gerçekte beklediğiniz gibi yanıtladığı sürece gerçek şeyden ayıramazsınız.

"Mesajlaşma" için daha "modern" bir terim, "dinamik yöntem dağıtımı" veya "sanal yöntem çağrısı" dır, ancak bu metaforu kaybeder ve mekanizmaya odaklanır.

Benzer noktalar William R. Cook tarafından tekrar gözden geçirilen Veri Soyutlamasını Anlama ve ayrıca "Nesne" ve "Nesneye Yönelik" Modern Tanımlar Önerisinde de yer almaktadır .

İşlemlerin dinamik olarak gönderilmesi, nesnelerin temel özelliğidir. Bu, çağrılacak işlemin nesnenin dinamik bir özelliği olduğu anlamına gelir. İşlemler statik olarak tanımlanamaz ve genel olarak, belirli bir isteğe yanıt olarak hangi işlemin çalıştırılacağı dışında, çalıştırılması dışında hiçbir yol yoktur. Bu, her zaman dinamik olarak gönderilen birinci sınıf işlevlerle tamamen aynıdır.

Smalltalk-72'de herhangi bir nesne bile yoktu! Yalnızca ayrıştırılan, yeniden yazılan ve yeniden yönlendirilen mesaj akışları vardı . İlk önce yöntemler geldi (mesaj akışlarını ayrıştırmak ve yeniden yönlendirmek için standart yollar), daha sonra nesneler geldi (bazı özel durumları paylaşan yöntem grupları). Miras çok sonra geldi ve sınıflar sadece mirası desteklemenin bir yolu olarak tanıtıldı. Kay'ın araştırma grubu prototipleri zaten biliyor olsaydı, muhtemelen ilk etapta hiç ders vermezlerdi.

Her programcı , Tekrar gözden geçirilmiş Veri Soyutlamasını Anlama konusunu okumalıdır . Nesneler ve Soyut Veri Türleri arasındaki farkın ne olduğunu tam olarak açıklar. Java kullanarak örnekler verir ve bu soru ile son derece ilgilidir, çünkü hem ADT örneklerinde hem de Object örneklerinde kalıtım, kapsülleme ve polimorfizm kullanır, ancak örneklerden yalnızca biri nesne yönelimlidir! Başka bir deyişle: kalıtım, kapsülleme ve polimorfizm olabilir, hatta üçüne birden sahip olabilirsiniz ve yine de OO'nuz olmayabilir.

Öte yandan, kalıtım olmadan OO'ya sahip olabilirsiniz. Yukarıda ima ettiğim gibi: Smalltalk'ın ("Nesneye Dayalı Programlama" teriminin mucidi Alan Kay tarafından tasarlanan dil) mirasına sahip değildi.

Kesinlikle Son fakat en az değil, Orlando Antlaşması tartışır heyeti miras alternatif ve farklı nesne oiented dillerin tasarım alanı içinde farklı tasarım noktalarına heyet ve miras kurşun formları olarak. (Aslında, Java gibi kalıtımı destekleyen dillerde bile, insanlara bundan kaçınmayı öğrettiklerini ve yine OO için gerekli olmadığını gösterdiklerini unutmayın.)


"Kalıtım", "polimorfizm" ve "kalıtım" olabilir ...
methinks

1
Bu cevap, cevapları 'favori' edebilmemizi ister.
Chan-Ho Suh

Alan Kay'un tanımı eskidir. OO'nun mirasa ihtiyacı vardır ve C ++ 'da olduğu gibi hem çalışma zamanı hem de derleme zamanı bağlaması yapabiliyorsanız, C ile eşit performans da elde edersiniz.
Erik Alapää

Hayır, tanımı doğru. OO olmak için mirasa hiç ihtiyacınız yok. Prototip dilleri C ++ gibi miras kullanmaz ve hala OO'dur. Kalıtım yalnızca kodun yeniden kullanımını uygulamak için kullanılır, en iyi yol bile değildir, örneğin, mixinlere sahip çok daha iyi diller vardır. Ayrıca, sanal yöntemleri kullanabildiğinizde C ++ 'da değil, dinamik gönderime sahip olabileceğiniz için bağlamayla da hiçbir ilgisi yoktur. Performansın bunlarla hiçbir ilgisi yoktur, bunlar üst düzey kavramlardır, performansları yoktur. Aslında, C'den geçen iletiyi uygulayabilir ve OO olabilirsiniz
Luiz Felipe
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.