it-swarm-tr.com

Nesneye yönelik programlamanın avantajları

Not : bu soru bir blog yazısı 'dan düzenlenmiş bir alıntıdır. Birkaç ay önce yazdım. Blog için bir link yerleştirdikten sonra comment Programcılar üzerine.Bunu birisi cevaplayabilmeleri için burada bir soru göndermemi istedi. İnsanlar Google çok içine "Nesne yönelimli programlama almıyorum" yazıyor gibi görünüyor bu yayın benim en popüler. Burada veya Wordpress'te bir yorumda yanıtlamaktan çekinmeyin.

Nesneye yönelik programlama nedir? Kimse bana tatmin edici bir cevap vermedi. Etrafta burnundan havaya “nesne” ve “nesne yönelimli” diyen birinden iyi bir tanım bulamayacağınızı hissediyorum. Nesneye yönelik programlama dışında hiçbir şey yapmayan birinden de iyi bir tanım elde edemezsiniz. Hem prosedürel hem de nesne yönelimli programlamayı anlayan hiç kimse bana bir nesne yönelimli programın gerçekte ne yaptığına dair tutarlı bir fikir vermedi.

Birisi bana nesne yönelimli programlamanın avantajları hakkında fikirlerini verebilir mi?

35
Joel J. Adamson

Yazılımı, bilgisayarın içinde bulunan bir makine veya Montaj hattı olarak düşünün. Bazı hammaddeler ve bileşenler makineye beslenir ve bunları nihai ürün olarak işlemek için bir dizi prosedür izler. Prosedürler, belirli bir sırayla belirli bir parametre setine (örn., Zaman, sıcaklık, mesafe, vb.) Bazı hammadde veya bileşen üzerinde belirli bir işlem yapmak üzere ayarlanır. Gerçekleştirilecek işlemin ayrıntıları yanlışsa veya makinenin sensörleri doğru şekilde kalibre edilmemişse veya bazı hammadde veya bileşenler beklenen kalite standartlarında değilse, işlemin sonucunu değiştirebilir ve ürün sonuç vermeyebilir beklenildiği gibi.

Böyle bir makine, çalışması ve kabul edilebilir girdileri bakımından çok katıdır. Makineler tasarımcıların zekasını veya mevcut çalışma ortamını sorgulamaz. Yönlendirildiği sürece prosedürleri izlemeye devam edecektir. Hammadde veya bileşenlerde bir değişiklik daha sonraki operasyonlarda olanlar üzerinde dramatik bir etkiye sahip olsa bile, makine yine de prosedürlerini yerine getirecektir. İstenen sonucu telafi etmek ve üretmek için prosedürlerde hangi değişikliklerin gerekli olduğunu görmek için sürecin gözden geçirilmesi gerekecektir. Ürünün tasarımında veya yapılandırmasında yapılacak bir değişiklik, gerçekleştirilen işlemlerde veya siparişlerinde önemli bir değişiklik yapılmasını gerektirebilir. Üretimden sorumlu olanlar, aralarındaki istenmeyen etkileri azaltmak için izole etme işlemlerinin önemini hızlı bir şekilde öğrendikleri halde, işleme tabi tutuldukça durum bileşenlerinin çok fazla varsayımı yapılır; son ürün farklı bir işletim ortamında kullanıcının eline geçene kadar algılanamayan varsayımlar.

Prosedürel programlama böyle.

Nesne yönelimi, bileşenlerin durumunun varsayımlarını ortadan kaldırmanın bir yoludur; böylece, bu bileşen üzerinde gerçekleştirilecek işlemler ve nihai ürüne nasıl entegre edileceği. Başka bir deyişle, OOP, belirli bir bileşenle uğraşmak için işlem ayrıntılarını almak ve bunu yapmak için daha küçük bir makineye vermek gibidir. İşlemden sorumlu daha büyük makine, bileşene özgü makineye yapılması beklenir, ancak adımların ayrıntılarını işlenecek bileşene özgü makineye bırakır.

Nesne yönelimli olmayan nesneye göre nesne yöneliminin avantajlarına gelince:

  • bileşene özgü davranış - belirli bir bileşenin daha küçük bileşene özgü makinenin sorumluluğunun nasıl ele alınacağıyla ilgili ayrıntılar yapmak, bileşenin her işlenişinde makinenin uygun şekilde çalışmasını sağlar;
  • polimorfik ifadeler - bileşene özgü makineler, kendi bileşenlerine göre uyarlanmış işlemler gerçekleştirdiğinden, farklı makinelere gönderilen aynı mesaj farklı davranabilir;
  • tip soyutlama - Birkaç farklı bileşen türünün, makinelerinin yaptığı işlemler için aynı kelimeleri kullanması çoğu zaman mantıklıdır;
  • endişelerin ayrılması - bileşenlere özgü detayların makinelerine bırakılması, proses makinesinin sadece sürecinin daha genel, daha büyük endişelerini ve onu yönetmek için gerekli verileri ele alması gerektiği anlamına gelir; artı, diğer bileşenlerdeki değişikliklerden etkilenme olasılığı daha düşüktür;
  • yarlanabilirlik - uzmanlık alanlarına odaklanan bileşenler, yalnızca kullandığı bileşenleri değiştirerek veya başka bir işlem makinesine sunarak öngörülemeyen kullanıma uyarlanabilir;
  • kodun yeniden kullanımı - dar bir odağı ve daha fazla uyarlanabilirliği olan bileşenler, daha sık kullanılmaya başlanarak geliştirme maliyetlerinden yararlanabilir.
7
Huperniketes

Blogunuzdan, hem zorunlu hem de işlevsel programlamaya aşina olduğunuz ve nesne yönelimli programlamayla ilgili temel kavramlara aşina olduğunuz görülüyor, ancak ne için gerçekten hiç "tıklamayın" yararlı kılar. Bu bilgi açısından açıklamaya çalışacağım ve size yardımcı olacağını umuyorum.

Özünde, OOP, sorunlu etki alanını modelleyen "akıllı" veri yapıları oluşturarak yüksek derecede karmaşıklığı daha iyi yönetmek için zorunlu paradigmayı kullanmanın bir yoludur. tabanlı bir programda, iki temel şey vardır: değişkenler ve onlarla ne yapılacağını bilen kod.Kod, kullanıcıdan ve diğer çeşitli kaynaklardan girdi alır, değişkenlerde depolar, üzerinde çalışır ve çıktı verileri üretir kullanıcıya veya diğer çeşitli yerlere gider.

Nesne yönelimli programlama, bu temel modeli alıp daha küçük ölçekte tekrarlayarak programınızı basitleştirmenin bir yoludur. Tıpkı bir program, kodun ne yapılacağını bilen geniş bir veri koleksiyonu gibi, her nesne, onunla ne yapacağını bilen koda bağlı küçük bir veri parçasıdır.

Sorunlu etki alanını daha küçük parçalara bölerek ve olabildiğince fazla verinin doğrudan onunla ne yapacağını bilen koda bağlı olduğundan emin olarak, bir bütün olarak süreç ve alt-süreç hakkında akıl yürütmeyi çok daha kolay hale getirirsiniz. süreci oluşturan konular.

Verileri nesne sınıflarına gruplayarak, bu verilerle ilgili kodu merkezileştirerek ilgili kodu hem bulmayı hem de hata ayıklamayı kolaylaştırır. Ayrıca, erişim belirleyicilerinin arkasındaki verileri kapsülleyerek ve yalnızca yöntemlerle (veya diliniz destekliyorsa özelliklerle) erişerek veri bozulması veya değişmezlerin ihlali olasılığını büyük ölçüde azaltırsınız.

Ve kalıtım ve polimorfizm kullanarak, önceden var olan sınıfları yeniden kullanabilir, orijinalleri değiştirmenize veya her şeyi baştan yeniden yazmanıza gerek kalmadan özel ihtiyaçlarınıza uyacak şekilde özelleştirebilirsiniz. (Bu bir asla yapmamanız gereken bir şeydir , bundan kaçınabiliyorsanız.) Sadece temel nesnenizi anladığınıza veya katil kangur ile sonuçlanabileceğine dikkat edin.

Bana göre, bunlar nesne yönelimli programlamanın temel ilkeleridir: karmaşıklık yönetimi, kod merkezileştirme ve nesne sınıflarının oluşturulması yoluyla gelişmiş sorun-alan modellemesi, kalıtım ve polimorfizm ve kapsülleme ve kullanımıyla güçten veya kontrolden ödün vermeden artan güvenlik özellikleri. Umarım bu, birçok programcının neden faydalı olduğunu anlamanıza yardımcı olur.

EDIT: Joel'in yorumlardaki sorusuna yanıt olarak,

Zorunlu bir programdan temel olarak farklı olan "nesne yönelimli bir programın" (ana hatlarıyla belirttiğiniz bu süslü tanımlar dışında) neler içerdiğini açıklayabilir misiniz? Nasıl topu yuvarlatıyorsunuz?

Burada küçük bir feragatname. "Nesne yönelimli bir program" modelim temelde eski Delphi ekip üyeleri tarafından yaratıldıkları için C # /. NET modeline çok benzeyen Delphi modelidir. Burada söylediğim diğer OO dilde geçerli olmayabilir veya çok geçerli olmayabilir).

Nesneye yönelik bir program, tüm mantığın nesneler etrafında yapılandırıldığı bir programdır. Tabii ki bu bir yere önyüklenmelidir. Tipik Delphi programınız Application adlı tek bir nesne oluşturan başlatma kodunu içerir. Programın başlangıcında, Application.Initialize, ardından belleğe en başından yüklemek istediğiniz her form için Application.CreateForm çağrısını yapar ve sonra Application.Run, ana formu ekranda görüntüler ve etkileşimli bilgisayar programlarının çekirdeğini oluşturan giriş/olay döngüsünü başlatır.

Uygulama ve formlarınız OS'den gelen olaylar için anket yapar ve bunları nesnenizdeki yöntem çağrılarına çevirir. Çok yaygın olan bir şey, .NET-konuşmada olay işleyicilerinin veya "delegelerin" kullanılmasıdır. Bir nesnenin "X ve Y yapın, ancak bu belirli olay işleyicinin atanıp atanmadığını kontrol edin ve varsa çağırın." Olay işleyicisi, nesnelerin davranışını genişletmek için kullanılan, yönteme bir başvuru ve nesne örneğine başvuru içeren çok basit bir kapatma olan bir yöntem işaretleyicisidir. Örneğin, formumda bir düğme nesnesi varsa, başka bir nesnenin düğme tıklatıldığında bir yöntem yürütmesine neden olan bir OnClick olay işleyicisi ekleyerek davranışını özelleştiririm.

Nesne yönelimli bir programda, işin çoğu, nesneleri belirli sorumluluklara sahip olarak tanımlayarak ve bunları yöntem işaretçileriyle veya doğrudan başka bir nesnenin genel arabiriminde tanımlanan bir yöntemi çağıran bir nesne ile bağlayarak yapılır. (Ve şimdi kapsüllemeye geri döndük.) Bu, OOP üniversitede dersler almadan önce hiçbir geri kavramımın olmadığı bir fikir.

46
Mason Wheeler

Ben OOP temelde sadece benim gibi yol boyunca yapmak için cazip olabilir bir şey verilen bir isim olduğunu düşünüyorum.

Bir bebek programcısıyken, Fortran'da bile, bir altyordamın göstergesi olarak bir şey vardı. İşaretçiyi başka bir alt programa argüman olarak bir alt programa geçirebilmek gerçekten yararlıdır.

O zaman gerçekten yararlı olacak bir sonraki şey, bir veri yapısının kaydı içinde bir alt rutine bir işaretçi saklamak olacaktır. Bu şekilde, kaydın kendi başına işlemlerin nasıl yapılacağını "bildiğini" söyleyebilirsiniz.

Bunu Fortran'a inşa edip etmediklerinden emin değilim, ancak C ve onun soyundan yapmak kolaydır.

Altında, kendiniz yapmak için cazip olabileceğiniz basit ve kullanışlı bir fikirdir ve bazı insanlar bunu korkutucu kelimelerle dolu dev bir bant vagonuna dönüştürmüş olsa bile, daha yeni dillerde yapmak daha kolaydır.

6
Mike Dunlavey

Çeşitli OO sistemleri vardır ve herkesin hemfikir olacağı bir tanım elde etmek zordur. Java'nın OO LISP Nesne Sistemi, adım adım daha geleneksel bir şeyle başlayacağım.

Dağınık veri olarak mevcut birçok nesneniz olduğunu varsayalım. Örneğin noktalar, X, Y ve Z dizilerindeki öğeler olabilir. Bir noktanın kendisini düşünmek için, tüm verileri birlikte bir C struct gibi bir şeye çekmek mantıklıdır.

Şimdi, herhangi bir veri nesnesi için verileri bir araya getirdik. Ancak, bir prosedürel programda, kod dağılmıştır. Diyelim ki geometrik şekillerle uğraşıyoruz. Şekil çizmek için büyük bir işlev vardır ve tüm şekiller hakkında bilgi sahibi olması gerekir. Alanı bulmak için büyük bir işlev ve çevre için başka bir işlev var. Bir dairenin kodu birden fazla işlev aracılığıyla dağılmıştır ve başka bir şekil eklemek için hangi işlevlerin değiştirileceğini bilmemiz gerekir. Nesne yönelimli bir sistemde, işlevler verilerle aynı türden (class) toplanır. Bu nedenle, tüm çevre koduna bakmak istiyorsak, Circle tanımında yer alıyor ve Quartercircle eklemek istiyorsak sadece sınıfını yazıyoruz ve kodu aldık .

Bunun bir yan yararı, sınıf değişmezlerini, sınıfın her üyesi için doğru olan şeyleri koruyabilmemizdir. Sınıf dışındaki kodu sınıf veri üyeleriyle doğrudan uğraşmasını kısıtlayarak, sınıf verilerini tek bir yerde değiştirebilecek tüm kodlara sahibiz ve bunun vidalı bir şey yapmadığını doğrulayabiliriz (tek bacağı olan bir üçgen gibi) diğer ikisinden daha uzun). Bu, sınıfın her üyesinin bazı özelliklerine güvenebileceğimiz anlamına gelir ve her kullandığımızda bir nesnenin aklı başında olup olmadığını kontrol etmek zorunda değiliz.

Ana fayda, kalıtım ve polimorfizm ile gelir. Tüm bu çeşitli şekilleri Shape adlı bir sınıfın alt sınıfları olarak tanımlayarak, kodumuzun Shapes'yi manipüle etmesini sağlayabiliriz ve bu, manipülasyonlar tarafından aranan şeyi yapmak, şekil alt nesnelerinin görevidir. . Bu, yeni şekiller eklediğimizde veya eskilerinin davranışlarını geliştirdiğimizde test edilmiş eski koda dokunmamıza gerek olmadığı anlamına gelir. Otomatik olarak yeni koddan doğrudan yararlanabilecek eski kodlarımız var. Kontrol kodunu olası tüm farklı şekillerden haberdar etmek ve olası tüm farklı şekillerden haberdar olan fonksiyonları sürdürmek yerine, Shape alt sınıflarını korurken sadece şekiller ve özellikleri ile ilgileniriz. Bu, kontrol kodunu basitleştirir.

Burada birkaç avantajımız var. Sınıf değişmezlerimiz olduğundan, daha büyük veri nesnelerini yerleşik türler için düşündüğümüz gibi akla getirebiliriz, yani karmaşık kavramları daha basit olanlara bölebiliriz. Çevre kodu büyük ölçüde Circle içinde bulunduğundan, yerelliği artırdık. Farklı yerlerde birkaç farklı fonksiyona dağılmış bir daire kavramları olmadığından, rutinler arasında daha az bağlantı kuruyoruz ve onları senkronize tutmak konusunda endişelenmemiz gerekmiyor. Sınıflar aslında tür olduğundan, sınıflarımızın uyumsuz kullanımını yakalamak için mevcut yazım sisteminden yararlanabiliriz.

5
David Thornley

OO'nun birçok farklı tanımı var, evet. Eminim bunlardan birçoğunu kendi başınıza bulabilirsiniz. Şahsen Rees Re: OO onlardan bir anlam çıkarmanın bir yolu gibi. Sanırım Paul Graham'dan alıntı yaptığından beri bunu okudun. (OO ile ilgilenen herkese tavsiye ederim.) Az çok Java tanımını {1,2,3,7,8,9}) benimseyeceğim.

OO'nun faydası sorunu, özellikle ona yaklaşma şeklim, birkaç bin satır kodla çok daha büyük bir cevabı hak ediyor (kısmen bir takım iddialar olmamak için). Ancak, bu varsayımsal belgenin bir özeti burada.

Bence OO küçük bir ölçekte, örneğin birkaç yüz satır için çok yararlı olduğunu düşünmüyorum.Özellikle, OO iyi fonksiyonel etkileri olmayan diller eğilimi herhangi bir koleksiyon veya çok sayıda veri türüne ihtiyaç duyan basit şeyler yapmayı gerçekten acı verici hale getirmek için, çoğu tasarım deseninin devreye girdiği yer burası --- altta yatanların düşük gücünde bant yardımcılarıdırlar) dili .

Yaklaşık bin satırda, tüm operasyonları ve veri yapılarını ve bunların ilişkilerini takip etmek daha zor olmaya başlar. Bu noktada, veri yapılarını ve işlemlerini açıkça organize etmenin, modül sınırları çizmenin ve sorumlulukları tanımlamanın ve bunlara karşı programlamaya çalışırken bu tanımları anlamanın uygun bir yolunun bulunmasına yardımcı olur.

Java-ish OO, popülerlik yarışmasını kazanmış olan bu sorunlara yarı bir çözümdür, çünkü Java insanların küçükler için geçerli olduğu aynı mekanizmadır) güçsüz bir dilin yarattığı sorunları ölçeklendirirse, organize kalmanın bir yolundan ziyade her şeye sihirli bir çözüm gibi görünmeye başlar. C++ 'da sıkışmış, ya da (benim gibi, C #' da günlük çalışmak) OO ama sadece bu kadar heyecanlı olmayın.

3
Jesse Millikan

OOP = hepsi programlama modellerinde mantıksal gelişmeler olan veri yapıları + mesaj iletme + kalıtım.

OOP (programcılar tarafından) yaklaşık 90 saniye içinde anlaşılabilir (bağlantı için profilime bakın). Kavramlar çok basit.

Nasıl uygulanacağı başka bir konudur. Bir çekiçin nasıl sallanacağını bildiğiniz için, bir evin nasıl tasarlanacağını ve inşa edileceğini bildiğiniz anlamına gelmez. ;-)

1
Steven A. Lowe

OOP gerçek dünya kavramlarını nesneler ve aralarındaki etkileşimler açısından modellemeye çalışır. İnsanlar olarak dünyayı nesneler olarak işleme eğilimindeyiz. Dünya belirli özelliklere sahip nesnelerle doludur ve diğer nesnelerle etkileşim gibi şeyler yapabilir. OOP dünyayı benzer terimlerle modellemeye izin verir. Örneğin,

  • Kişi bir nesnedir. Bir kişinin yaş ve cinsiyet gibi bazı özellikleri vardır. Bir kişi bir şeyler yapabilir: yemek, uyumak, araba kullanmak.
  • Araba da bir Nesnedir (farklı tipte olmasına rağmen). Ayrıca marka, model ve yıl gibi özelliklere de sahiptir. Bir araba bir şeyler yapabilir: hareket et.

Ancak bir araba kendi başına hareket edemez, onu sürmek için bir kişiye ihtiyacı vardır - Nesneler arasındaki etkileşim.

1
ysolik

Yapıları anladığınız ve işlev işaretçileri anladığınız ve işlev işaretçileri olan yapıları anladığınız için, sizin bakış açınıza göre, nesne yönelimli programlamayı basitçe "programlama, işlev işaretçileri olan yapıların yoğun kullanımı ile" olarak tanımlayacağım. Hala geleneksel anlamda programlama - hepsi veri ve verilere etki eden kod. Tek fark, tüm bu bilgilerin nasıl tanımlandığı ve onu tanımlamaya nasıl yaklaştığınızdır.

Belki de aşırı basitleştirme, geleneksel programlamanın "bazı veri yapıları ile kod" ve nesneye yönelik programlamanın "bazı kodlarla veri yapıları" olduğudur. Her ikisinin de veri yapıları vardır ve her ikisinin de hala kodu vardır. Öyleyse, nesne yönelimli programlama, önündeki veri türlerini tanımlama ve işlev kümeleri aracılığıyla nasıl iletişim kuracakları konusunda sözleşmeleri uygulama eyleminden başka bir şey değildir.

Gördüğünüz gibi, bunun bir çözüm uygulamak için harika bir yol olmadığı çok büyük bir uygulama sınıfı var. Çoğunlukla bu tür uygulamalardan oluşan bir dünyada yaşıyor gibisiniz. Blog yayınınızda "99 şişe bira" sorununun ("favori programlama vitriniz") uygulamalarına baktığınızdan bahsediyorsunuz. 99 şişe bira kesinlikle bu kategorinin bir parçası. 99 şişe bira uygulamasına bakarak nesne yönelimli programlamayı anlamaya çalışmak, bir ağaç evine bakarak yüksek katlı mimariyi anlamaya çalışmak gibidir. Çok iyi yapılmış bir ağaç evi bile size sadece çok şey öğretebilir.

TL; DR: OO programlama, geleneksel programlama gibidir, ancak önünüzdeki veri yapılarını tanımlama çabalarınızı daha fazla odaklarsınız ve bu veri yapılarının işlev işaretçileri aracılığıyla birbirleriyle iletişim kurmasını sağlarsınız.

0
Bryan Oakley

İlk anlama şeklim:

Nesneye yönelik programlamadan önce Yapısal programlama . Her şey süreç etrafında toplanıyor. Kendinize sormanız gereken ilk soru " Bilgiyle ne yapmak istiyorum? ".

Nesne yönelimli programlama ile, veriler etrafında toplanır. Kendinize sormanız gereken ilk soru, " Ele almam gereken cadı bilgileri? ". Bu soyutlamayı kolaylaştırır.

0
DavRob60

Bir süre önce yararlı bulabileceğiniz bir blog yazısı yazdım: Yordam vs OOP Açıklandı .

0
VirtuosiMedia