Nesneye yönelik programlamayı başarılı yapan nedir? [kapalı]


17

Nesneye yönelik programlamayı bu kadar başarılı kılan, size göre bu özellik nedir?

  1. İleti geçişi
  2. miras
  3. Polimorfizm
  4. kapsülleme

Ya da tanıtmak isteyebileceğiniz başka bir özellik.

Ayrıca Özet Veri türü ve Nesneye Yönelik programlama arasındaki bağlantının ne olduğunu bilmek istiyorum.


popüler ve başarılı eşanlamlı değildir
kevin cline

Yanıtlar:


76

Nesneye yönelik programlamanın en önemli özelliğinin karmaşıklık yönetimi olduğunu öne sürüyorum .

İnsan beyni bir seferde sadece çok fazla kavram tutabilir - 7 +/- 2 bağımsız öğeyi hatırlamanın sıkça bahsedilen sınırı akla gelir.

İşyerinde 600kloc'luk bir sistem üzerinde çalışırken, her şeyi aynı anda kafamda tutamıyorum. Bunu yapmak zorunda olsaydım, çok daha küçük sistemler üzerinde çalışmakla sınırlı olurdum .

Neyse ki, zorunda değilim. Bu projede kullandığımız çeşitli tasarım desenleri ve diğer yapılar, aynı anda tüm sistemle uğraşmak zorunda olmadığım anlamına geliyor - daha geniş uygulamalara sığdıklarını bilerek bireysel parçaları alıp üzerinde çalışabiliyorum. iyi tanımlanmış.

Tüm önemli OO kavramları karmaşıklığı yönetmenin yollarını sunar.

Kapsülleme - bu hizmetlerin nasıl uygulandığından endişelenmeden bana çeşitli hizmetler sağlayan harici bir API ile ilgilenmeme izin verin.

Soyutlama - temel özelliklere odaklanmama ve ilgisiz olanları görmezden gelmeme izin verin.

Kompozisyon - Yeni kombinasyonlarda oluşturulmuş bileşenleri tekrar kullanmama izin verin

Çok biçimlilik - farklı nesnelerin farklı şekillerde nasıl sağlayabileceği konusunda endişelenmeden bir hizmet istememe izin verin.

Kalıtım - bir arayüzü veya uygulamayı yeniden kullanmama izin verin, yalnızca daha önce olanlardan farklı parçalar sağlayın.

Tek Sorumluluk İlkesi - her bir nesnenin amacını açık ve özlü tutmaya izin verir, bu nedenle akıl yürütmek kolaydır

Liskov İkame İlkesi - garip bağımlılıklar getirerek birbirleri için tuzaklar bırakmayalım

Açık / Kapalı Prensibi - mevcut kodu ihlal etmemizi gerektirmeyen şekillerde genişletmeye ve değiştirmeye izin verelim

Bağımlılık Enjeksiyonu - bileşimi bir sonraki seviyeye alalım ve bileşenleri daha sonra bir araya getirelim.

Arayüz odaklı geliştirme - soyutlamayı bir sonraki seviyeye taşıyalım ve sadece soyutlamaya bağlı olalım, asla somut bir uygulamaya dayanmayalım.


6
+1. Sadece bir kez oy verebiliyorum, ki bu daha fazlasını hak eden bir utanç.
Richard

1
Bunun bir sonucu var, şu anda referansı bulamadığım için utanç verici ama bakmayı ve yorumu düzenlemeyi hatırlamaya çalışacağım. Bu nedenle, kod gözden geçirme uygulamaları üzerine yapılan bir çalışma, kod incelemelerinin OO kodundaki hataları bulma işleminden daha uzun sürdüğünü bulmuştur, çünkü akış OO kodunda daha fazla atlar. TDD ve çift programlama gibi uygulamalar bunu hafifletir, ancak yine de ilginç (ve benim için beklenmedik) bir sonuçtur.

5
Bu mükemmel bir cevap olabilir - bilgi dolu, ancak okuyucunun bir roman okuması gerekmeyecek kadar kısa. Bravo
Tim Claason

@Graham Lee: Bu çalışmayı okumak isterim.
Frank Shearar


13

Grafik kullanıcı arayüzleri. Seksenlerin sonlarında, doksanların başlarında, Mac'ler, Amigas, Atari STs, Windows ve GEM karakter tabanlı kullanıcı arayüzlerinin yerini almaya başladığında, C gibi dillerin GUI programları yazmak için uygun olmadığı ortaya çıktı. Geleneksel veri işleme, aynı zamanda prosedürel bir dilde de yapılabilen bir "girdi verileri -> işleme -> çıktı verileri" şeması olarak kabul edilirken, OOs özellikleri bir GUI'nin doğal karmaşıklığını ele almak için kullanışlı hale geldi.


1
GUI uygulamalarından bahsetmek için +1. Nesne yönelimi, (prosedürel kod ile) yönetilmesi oldukça zor olan GUI'lerin uygulanmasına izin veren araçtır.
Giorgio

7

Kapsülleme tarafından sağlanan Veri Gizleme.


Bu bir cevap mı? ADT'ler veri gizleme sağlar (bu yüzden "veri soyutlamaları" olarak adlandırılır)
Frank Shearar

@Frank, Belirli özellikler istedi ve bu cevabı yazdığımda sadece bir tane daha vardı ve kopyalamamaya çalışıyordum.

Yeterince adil, ama kapsülleme tam olarak OO'ya özgü değil. Bunu kendim kontrol etmeliyim, ama OO'dan çok önce kapsülleme yaptığımızdan eminim.
Frank Shearar

1
@Frank, OO'ya özgü olmadığını kabul ediyorum, ana özelliklerinden sadece biri.

Bu çoğu OOPL için doğrudur , ancak hepsi için geçerli değildir. CLOS dikkate değer bir istisnadır.
Frank Shearar

7

Diğer yanıtların hiçbirinde henüz bahsedilmeyen bir özellik: alan adı modelleme . İnsanlar, nesnelerle veya nesnelerle şeyler yapmayı ve içsel özelliklere sahip nesneler hakkında düşünme eğilimi gösterdiğinden, nesne yönelimli yazılım kullanarak bir sorunu veya iş akışını modellemek çok kolaydır. Esasen, koddaki isimler, fiiller ve sıfatlarla başa çıkmak için mevcut yeteneğimizi kullanmamıza izin verir.


6

Bence kalıtım OOP'un en önemli noktasıdır.

[oyun geliştirmeden] Oluşturma yöntemleri ve nitelikleri ile Drawable sınıfı gibi bir şey oluşturabilir ve Drawable'dan miras alan bir Spaceship ve Planet sınıfı oluşturabilirsiniz. Bu [ve diğer Sprite alt öğelerinden] tüm nesneleri alın, bir drawableObjArray atın ve sadece her nesne için draw yöntemini çağırın. Sadece bunun bir Çekilebilir olduğunu bilmelisin.


2
Gerçekten mi?? Polimorfizm YOL daha önemlidir ve kalıtım gerektirmez (teorik açıdan).
Thomas Eding

Sanal işlevler bile gerektirmez, sadece işlev işaretçileri kullanın.
Calmarius

1
Alan Kay'ın orijinal OO konsepti miras içermiyordu, çünkü önceki sistemlerde nasıl uygulandığını sevmiyordu.
Michael Borgwardt

3

Soyutlama

Gereksiz şeyleri gizleyerek gerekli hizmetleri sağlamak. Açıklamamı buradan görebilirsiniz- Soyutlama nedir?


Yazım hatası: "Absraction" "Abstraction" olmalıdır
Vetle

2

Biraz başarılı çünkü insan zihninin bir şeyleri nesneler halinde örgütlemesini teşvik ediyor. İnsanlar genellikle şeylerin ilişkilerini görme konusunda iyidir - farklılıklar, benzerlikler ve davranışlar gibi şeyler. OO, dünyanın insan kavramsallaştırmasını taklit etmek için yazılım geliştirmeyi teşvik eder.

Yazılım geliştirmeyi dünyaya bakışımıza benzer hale getirmek zihnimizin karmaşıklığı ele almasını kolaylaştırır.


Belki de prosedürle ilgili daha fazla deneyim nedeniyle, ancak her iki yöntemi kullandıktan sonra, yine de prosedürü OOP'tan daha sezgisel buluyorum. Yine de her iki stilin de güzel kısımlarını seviyorum.
Juha Untinen

1

Burada " ADT ve nesneler " gibi birçok soru soruldu. Tek satırlık cevap, "ADT'ler ve nesneler birbirinin tersidir - birinin düzgün bir şekilde soyutladığı şey olamaz; her biri farklı şekillerde esnekliğe izin verir."

Daha uzun bir cevap için, William Cook bkz Revisited, anlama Veri Soyutlama günü . Kısaca, nesneler, bazı verilerin birden çok uygulamasını / temsilini kolayca kullanmanıza izin verir (bir listeye benzeyen bir şey bir dizi veya kendi kendini dengeleyen bir ağaç olabilir veya ...) ancak yeni işlemler eklemeyi zorlaştırır (çünkü ADT'ler veri türünüze yeni işlemler eklemenizi kolaylaştırırken birden çok uygulamaya sahip olmanızı zorlaştırırken, bu yeni işlemi temsillerinizin her birine eklemeniz gerekir).

Düzenleme: OO başarılı kılan mesaj geçen olduğunu söyledi. Jonas'ın yorumuna dayanarak, bu doğru değildir, çünkü insanların OO olduğunu düşündüğü birçok dil mesaj geçişini kullanmaz. Doğru olmadığı için cevabımdan aldım.


1
Başarılı OOP dillerinin hiçbiri bunu kullanmadığından mesaj iletme zor olabilir.
Jonas

OO'nuz benim OO'um olmak zorunda değil. Ve AlanO'nun tanımına göre OO adı verilen birçok dil değildir. Kesin alıntıyı unutuyorum, ama Kay's, nesnelerin Smalltalk ile ilgili önemli olmadığını, mesaj iletmeyi (ve en çok bu noktayı kaçırdığını) söyledi.
Frank Shearar

@Jonas, soruyu ve cevabımı tekrar okuduktan sonra, "OO başarılı değil, çünkü bu kadar az dil doğru yapıyor" dediğimi söylüyorum. Ama sadece alev geçirmez elbisemi giydiğimde böyle şeyler söylüyorum.
Frank Shearar

0

En iyi üç özelliğim. Nesne Kompozisyonu - nesnelerin işbirliği yapmasına izin vermek. Çok biçimlilik - çalışma zamanında dinamik davranışları destekler. Kalıtım - kodu yeniden kullanarak ve yöntemleri geçersiz kılma yoluyla davranışı değiştirerek.

ADT - bunu Pascal gibi nesne yönelimli olmayan dillerde bile kullanabilirsiniz. Bir yığın veya kuyruk ADT'ye örnektir.


"ADT - Pascal gibi nesne yönelimli olmayan dillerde bile kullanabilirsiniz. Bir yığın veya kuyruk ADT'ye örnektir.": Doğru. Ancak OOP, bir ADT'nin arayüzünü tanımlamayı ve farklı, değiştirilebilir uygulama (arayüz / soyut sınıf <---> alt sınıflar / somut sınıflar) sağlamayı kolaylaştırır. Bildiğim kadarıyla Pascal'da kolay değil.
Giorgio

0

basit bir ifadeyle OOP, yeniden kullanılabilirlik ve kapsülleme için anahtardır, bu da API'leri çağırabileceği ve günün en sık istediği şeyi yapabildiği için, bu çağdaki programcılar için hayatı kolaylaştıran büyük çerçevelerin üretimiyle sonuçlanır.

Sorunuz OOP'un 4 özelliği hakkında olduğundan,

  1. Kalıtım ve 4. Kapsülleme en önemli özelliklerdir ve ilk ikisine ulaşmak için diğer ikisi çok gereklidir

böylece 1. Mesaj Geçme ve 3. Polimorfizm aslında 2. Kalıtım ve 4. Kapsülleme'yi desteklemektedir.

  1. Kalıtım ve 4. Kapsülleme OOP için başarının anahtarıdır

miras gerekli değildir, çoğu zaman OOP'nin tanımlayıcı bir bileşeni veya hatta çok arzu edilen bir kısmıdır. kapsülleme genel olarak programlama için iyi bir prensiptir. OOP tarafından icat edilmedi ve sadece OOP'ta kullanılmadı.
sara

-1

Kanımca, son üç özellik OOP'un yaygın kullanımını etkileyen bir kez en önemli özelliktir:

2. Inheritance
3. Polymorphism
4. Encapsulation

Düzenleme: Başka bir nokta IDE ve Visual studio ve Eclipse gibi grafik arayüz geliştirme ortamları olacaktır. OOP dillerini kucakladıkça, giderek daha fazla tasarım OOP'ye yöneldi.

Ve elbette SOLID Prensipleri , yazılım ürünlerini ROCK katı teslim edilebilir hale getiren bir kez var :)

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.