Nesneye Yönelik Programlama karmaşıklığa bir çözüm müdür? [kapalı]


18

Nesne Odaklı Programlamanın karmaşıklığa bir çözüm olduğunu düşünüyor musunuz? Neden? Bu konu biraz tartışmalı olabilir ama niyetim neden buradaki uzmanlardan cevabı bilmek!


15
Zorlu deneme ödevi? ; p
glenatron

1
Karmaşıklığa bir çözüm olmadığı için soru mantıklı değil. Karmaşıklıkla (özellikle içsel, indirgenemez karmaşıklıkla) uğraşmak için stratejiler vardır. Ama çözümler, hayır yok. Bu, bir fiziksel mil mesafesini sıfıra getirmenin bir çözümünü aramak gibidir.
luis.espinal

1
Nesneye yönelik programlama karmaşıklığı yönetmek için bir araçtır.
Robert Harvey

Soru: OOP ile ilgili karmaşık problemleri programlayabilir misiniz? - Cevap: Tabii. OOP kullanırsanız, karmaşık olacaktır.
mouviciel

"tartışmalı olabilir" teknik bir soru değil, bir tartışma öğesi yapar ...
jwenting

Yanıtlar:


24

Karmaşıklığın çözümü yoktur.

"Mythical Man-Month" da Fred Brooks, programlamadaki kazara ve temel karmaşıklık arasındaki farkı tartışıyor. Yanlışlıkla karmaşıklık, bir dilde ek kod yazmak ve test etmek gibi araç ve yöntemlerimizden kaynaklanır, çünkü fikirlerimizi doğrudan ifade edemeyiz ve bunun gibi şeyler. Yeni yöntem ve teknikler kazara karmaşıklığı azaltabilir. Programları yirmi beş yıl öncesine göre daha hızlı ve daha iyi yazabilirim çünkü daha iyi dil ve araçlara sahibim.

Temel karmaşıklık, programlama ile yapmaya çalıştığımız şeyin doğası gereği karmaşık olduğu ve indirgenemez bir karmaşıklık olduğu gerçeğinden kaynaklanmaktadır. "Temel", bu bağlamda, "çok gerekli" olmak yerine "şeyin özü ile ilgili" anlamına gelir.

Bu nedenle, gümüş mermi olmayacağını, yazma yazılımının zor olmaya devam edeceğini iddia etti.

Kitabını okumanızı şiddetle tavsiye ederim: özellikle, ek bir "Gümüş Kurşun" denemesiyle Gümüş Yıldönümü baskısını öneriyorum. Bu bağlamda, karmaşıklığa yönelik önerilen çözümleri gözden geçirir ve etkilerini dikkate alır. (En etkili bulduğu şey shrink-wrap yazılımıdır - bir kez karmaşık bir şeyler yazın ve binlerce veya milyonlarca kopya satın.)

Şimdi, nesne yönelimli programlama, doğru yapıldığında, soyutlamalar yaratarak ve karmaşıklığı gizleyerek yardımcı oluyor. Bir sınıfın nesnesi, uygulamanın karmaşıklığına dikkat etmeden akla getirebileceğimiz belirli bir tanımlanmış davranışa sahiptir. Düzgün yazılmış sınıflar birbirleriyle düşük bağlantıya sahiptir ve böl ve fethet, eğer ondan kurtulabilirseniz karmaşıklıkla başa çıkmanın mükemmel bir yoludur. Birbirleriyle çok yakından ilgili olan bir dizi işlev ve veri oldukları için yüksek bir kohezyona sahiptirler.


3
20th Anniversary Edition ayrıca OOP'u "pirinç mermi" olarak adlandırdığı ve "... çok ümit verici bir kavram."
Jerry Coffin

18

Yakında daha iyi cevaplar alacağınızı umuyorum, ancak basit bir cevap:

OOP, yazılımı dünyadaki diğer her şeyi modelleme şeklimize daha yakın bir şekilde modelleyerek karmaşıklığa * yardımcı olur. Bir duvar nesnesiyle etkileşime giren bir top nesnesini görüntülemek genellikle aynı şeyi yapmak için bir dizi rutin ve veri yapısını hayal etmekten daha kolaydır, çünkü gerçek dünyayla nasıl etkileşim kurduğumuza daha yakındır.

* Çünkü hiçbir şey karmaşıklığı 'çözemez'


4
OOP teoride böyle çalışır. Pratikte, havlayan köpekler, uçan ördekler ve araç olan kamyonlar gibi OOP örnekleri, gerçek yazılım yazarken bozulmaya başlar, çünkü gerçek program nesneleri her zaman bundan daha soyuttur.
Robert Harvey

8
@Robert: OOP'da gerçek dünya nesnelerini çok sık modellediğinizi iddia etmiyorum - sadece çoğu programı nesne açısından (soket-proxy ve model-cephe nesneleri olsa bile) düşünmek daha kolay, çünkü bu nasıl köpeklerin ve ördeklerin dünyasını gerçek hayatta görüyoruz.
Fishtoaster

2
Hayır, bu OOP hakkında yaygın bir yanlış anlamadır. Programınızı gerçek hayattaki nesnelere göre modellememeniz gerekir. Gerçek hayatta BufferReader diye bir şey yoktur.
hasen

1
@Hasen j: Evet, yorumumda netleştirdiğimde bunu söyledim.
Fishtoaster


15

OOP'un şu anki ana akım tanımının karmaşıklığı yönetmek için iyi bir çözüm olmadığını düşünüyorum.

Köklerine geri dönerseniz Alan Kay'ın "lisp" den çok etkilendiğine inanıyorum.

Lisp ana akım benimsenmesi ile bozulmadığı için muhtemelen temel değerlerini korumayı başardı. Bu yüzden lisp'in bu karmaşıklık sorunuyla nasıl başa çıktığını incelemek bize bir fikir verebilir ve bunu karmaşıklıkla başa çıkmada OOP'un ne kadar yararlı olduğunu yargılamak için bir temel olarak kullanabiliriz.

"Ders 3a: Henderson Escher Örneği" ifadesinin sonundaki bakarsak ait SICP Hal Abelson karmaşıklığı, daha küçük alt görevler içine görevi kırarak ancak soyutlama katmanları yaratarak değil yönetildiğini önermektedir. En üst düzeyde, daha düşük soyutlama düzeyine çözüm açısından karmaşık soruna çözüm ifade edersiniz.

Bence OOP aslında bu soyutlama katmanlarını yaratmak için bir mekanizma olarak düşünülmüştü.

Ne yazık ki günümüzde, OOP spagetti kodu / yapıları yazmak için kullanılmaktadır.

Bir örnek oluşturacağım: Bir FPS çok oyunculu oyun.

En üst düzeyde, oyun bir harita etrafında koşan ve silah kullanarak birbirlerine ateş eden bir grup oyuncuya sahip olarak çalışır.

Bir sonraki alt seviyede, haritalar, silahlar ve oyuncular hakkında konuşmalıyız. Belki onlar hakkında oyunun dünyasında etkileşen fiziksel nesneler olarak konuşabiliriz.

Bir sonraki düşük seviyede, nesnelerin fiziksel olarak nasıl etkileştiklerinden (hareket, çarpışmalar, vb.) Bahsedebiliriz.

Ve bu böyle devam eder.

Bunun anlamı, (ve ben SICP'den alıntı yapıyorum ..), her katmanda sadece belirli bir problemi çözmekle kalmıyoruz, aynı zamanda problemin mahallesine düşen bir tür problemleri de çözüyoruz. çözmeye çalışıyorum. Bu nedenle, sorunun açıklamasında küçük bir değişiklik varsa, çözümde sadece küçük bir değişiklik yapılması gerekebilir.

Yani, OOP kullanmanın akıllı yolu, soyutlama katmanları oluşturmaktır, her soyutlama seviyesinde, sorunu doğrudan aşağıda bulunan seviyeden "nesneleri" kullanarak çözersiniz.

Dersten alıntı yaptığım kısım: http://www.youtube.com/watch?v=CYtrfncMqHQ


5
Birçok araç gibi, OOP da akıllı ve düşünceli kullanıldığında oldukça etkilidir ve istismar edildiğinde çok etkili değildir.
Robert Harvey

1
+1 "soyutlama katmanları" için - çok iyi bir açıklama. OOP ayrıca, gördüklerinizin kapsamını bir kerede tek bir nesneyle sınırlamanıza izin verir, bu da insanların tasarım ve etkileşimleri görselleştirmesini kolaylaştırır.
Michael K

1
"Ana akım benimsemeyle bozulan" bir teorik kavramın gerçek dünyadaki projelerde karmaşıklığı yönetmeyi daha iyi hale getireceği fikrini buluyorum ... tuhaf.
Michael Borgwardt

@MichaelBorgwardt, ana akım benimsenmesi yararlı bir fikri bozar, çünkü ana akıştaki birçok insan fikrin ne olduğunu anlamıyor, bu yüzden OOP'un ne olduğunu araştırmaya çalıştığınızda, çeşitli insanlar tarafından çeşitli yanlış anlayışlar görüyorsunuz. LISP hala edilir daha az olasılıkla orijinal fikirler hepsi hakkında bir ipucu ne olmaması sivri saçlı patronlar kaynaklanan yolsuzluk muzdarip işte bu yüzden, sadece bir azınlık tarafından değil, kullanılan.
hasen

@hasen j: OTOH o buna var daha muhtemel olduğunu testere ana akım kabulü gerçek dünyada işi yok fildişi kule şeyler vardı asla "orijinal fikirler". Popülerlik eksikliği kesinlikle hiçbir şey lehine net bir nokta değildir.
Michael Borgwardt

10

Her zamanki gibi herkese katılmıyorum. Karmaşıklığı yönetmek için araçlar vermekten çok, OOP yetersiz ve matematiksel olarak sahte bir paradigma olduğu için çok miktarda karmaşıklık yaratır. OOP ile modellenemeyen şeyleri OOP ile modellemeye çalışmak, programcıları hiçbir şekilde karıştırmaz.

Bana göre buradaki seminal çalışma Meyer'in Nesneye Dayalı Yazılım Yapısı. Önemli olduğunu düşündüğüm biri de dahil olmak üzere bir dizi gereksinimi detaylandırıyor: Açık-Kapalı Prensibi. Bu, bir şeyin uzatma için açık ancak aynı zamanda kullanım için kapalı olması gerektiğini söylüyor.

Meyer, Eiffel'de somutlaştırıldığı gibi bu gereksinimlerden Nesne Yönelimi elde etmeye devam eder. Kapsülleme, kapama, kalıtım açıklığı sağlar ve bahsedilen "şey" sınıftır.

Bu işi iyi bilim olarak görüyorum, çünkü Meyer açıkça yanlıştı ve çalışmasının kalitesi nedeniyle hatayı tespit etmek ve düzeltmek mümkündür.

Hata, modülerlik sınıfını veya türünü yapmaktır. Bu yanlış ve muhtemelen öyle. Meyer bile (kovaryans problemi olarak adlandırılır) problemi tanıdı, OOP'nin arity ilişkilerini birden fazla ele alamadığı (yani, OOP mülkler için iyi çalışıyor, ancak ikili ilişkilerde başarısız oluyor). Eyfel'de bu sorun, tip sisteminde bir ses çıkmasına neden oldu!

Çözüm oldukça açık. Modülerlik birimi tek tipten daha büyük olmalıdır. Birkaç türden ve bunlarla ilgili yöntemlerden oluşmalıdır.

Bu soyutlama modelinin, soyutlama matematiksel teorisi, yani kategori teorisi tarafından desteklenmesi şaşırtıcı değildir: türler bir kategorinin nesneleridir ve yöntemler (işlevler) oklardır.

Bu modelle, birkaç türün temsili bir dizi fonksiyon tarafından bilinir. Temsil halktan gizlidir, bu yüzden bu kapsülleme, ancak sınıfları değil modülleri kullanıyoruz.

Standart Meta Dil (SML) ve Ocaml doğrudan bu modele dayanmaktadır. Ocaml'ın da sınıfları ve OOP'si var: işe yaramaz çünkü OOP size dinamik bağlama olarak da adlandırılan özellikler hakkında bilgi verir. Bununla birlikte, gerçek dünyadaki sorunların çoğu ilişkileri içerir ve Ocaml'de sınıfların fazla kullanılmaması şaşırtıcı değildir.

C ++ Standart şablon kitaplığında hiç miras kalması pek şaşırtıcı değildir.

Basit gerçek şu ki, OOP size karmaşıklığı idare etmek için doğru araçları vermiyor, hatta gerçekten basit problemleri halletmek için araçlar bile vermiyor, bunun yerine yanıltıcı ve iki nesil programcıyı karıştırıyor. OOP, yardım etmekten çok, C, Fortran ve Cobol'un yorulmaya başlamasından bu yana programlamaya gelen en Kötü ve Kötü şeydir.


biraz daha oy vermek için başka bir hesap oluşturmak için cazip;)
Marco Mariani

Birkaç iddiada bulunuyorsunuz. Belki de iddialarınızı yedekleyen argümanlar veya argümanlara referanslar sağlayabilirsiniz. Çeşitli tezlerinizi desteklemeyen bu gibi ("OO ile ilgili yanlış şeyler var; yapması gereken şey budur" anlamında
Frank Shearar

3
"Foo en Kötü ve Kötü şeydir ..." demek, bu arada yapmaya çalıştığınız herhangi bir tartışmayı aktif olarak aşındırıcıdır.
Frank Shearar

6

Nesne yönelimli programlama, 1960'lara kadar izlenebilen köklere sahiptir. Donanım ve yazılım gittikçe karmaşıklaştıkça, yönetilebilirlik çoğu zaman bir sorun haline geldi. Araştırmacılar, yazılım kalitesini korumanın yollarını araştırdılar ve kısmen ayrık, yeniden kullanılabilir programlama mantığı birimlerini güçlü bir şekilde vurgulayarak ortak sorunları ele almak için nesne yönelimli programlama geliştirdiler .

Bu nedenle, bir nesne yönelimli program, bir programın gerçekleştirilecek görevler listesi (alt rutinler) olarak görüldüğü geleneksel modelin aksine, etkileşen nesnelerin bir koleksiyonu olarak görülebilir. OOP'de her nesne mesaj alma, veri işleme ve diğer nesnelere mesaj gönderme yeteneğine sahiptir. Her nesne, farklı bir rol veya sorumluluğa sahip bağımsız bir 'makine' olarak görülebilir. Bu nesneler üzerindeki eylemler (veya "yöntemler") , nesnenin kendisiyle yakından ilişkilidir.

http://en.wikipedia.org/wiki/Object-oriented_programming

Endişelerin bu şekilde ayrılması, polimorfizm, kalıtım, mesaj geçirme, ayırma ve kapsülleme gibi Nesne Yönelimi'nin diğer özellikleri ile birlikte, büyük programların karmaşıklığının oldukça etkili bir şekilde yönetilebileceği mantıklı ve kavramsal bir çerçeve sağlar.


2

Yazılım geliştirmenin birçok karmaşıklığı vardır. Programlama düzeyinde, OOP, problem etki alanını modellemek için nesneler ve sınıflar kullanarak karmaşıklığı gidermeyi amaçlamaktadır. Tanınmış bir guru, problem çözmenin sadece problemi temsil ettiğini, böylece çözümün temsilin kendisi olduğunu söyledi. Bu nedenle, sınıfları kullanarak soyutlama, erişim değiştiricileri ve yöntemlerini kullanarak kapsülleme, ilişki ve yeniden kullanımın belirlenmesi için miras, sınıflar arasında ilişki ve işbirliğinin oluşturulmasında kompozisyon, benzer nesnelerdeki farklı davranışların belirlenmesini basitleştirmenin bir yolu olarak polimorfizm, karmaşıklık yönetilebilir.

Yazılım karmaşıklığını yönetmenin başka yolları da vardır, örneğin Mantık (Prolog) ve Fonksiyonel (Haskell) programlama.

Programlamadan daha yüksek bir seviyede, OOP'ye rehberlik etmek için Tasarım Desenlerine ve İlkelerine ihtiyacımız var. Bu nedenle OOP, karmaşıklığı düşük (kodlama) düzeyde yönetirken, Tasarım Kalıpları ve İlkeleri gibi bu metodolojiler, çözümün tasarımını daha yüksek (sistem ve uygulama) düzeyde yönlendirir ve yazılım geliştirme ve işleme karmaşıklıklarını daha yönetilebilir hale getirir.

Sorunuzu cevaplamak için, evet, OOP sadece diğer birçok çözüm arasında karmaşıklığı ele almak için bir çözümdür. Düşük seviyede bir çözümdür. OOP'u daha üst düzeyde yönlendirmek için Tasarım Desenlerine ve İlkelerine ihtiyacımız var.


3
Tasarım örüntülerine "ihtiyacımız" olduğunu söylerken çok dikkatli olurdum. İyi OO tasarımının doğal eserleridir - onu sürmek için kullanılmamalıdır. "Ah, bunun için bir modelimiz yok, bu yüzden yapamayız." Bunlar tasarımı iletmenin bir yoludur.
Michael K

2

Nesneye yönelik programlama , temel ve isteğe bağlı karmaşıklığı yönetir , ancak ikisini de azaltmaz.

Unix Programlama Sanatı'nda Eric Steven Raymond tarafından sağlanan tanımı tercih ediyorum , çünkü temel, isteğe bağlı ve kazara karmaşıklık arasında bir tasarıma sahip. http://www.faqs.org/docs/artu/ch13s01.html#id2964646

OOP, temel veya isteğe bağlı karmaşıklık için hiçbir şey yapmaz, programın gereksinimlerinin bir işlevidir. Yanlışlıkla karmaşıklık üzerinde bir etkisi olabilir, çünkü bazen OOP ile daha zarif bir tasarım yaratabilirsiniz. Ancak bazen OOP kullanılırken tasarım daha kötüdür.


2

Karmaşık problemler teknoloji ile daha basit hale getirilemez, sadece teknoloji ile yönetilebilir .

OOP bir teknoloji, kavram ve bir probleme yaklaşmanın bir yoludur.

OOP size karmaşıklığı yönetmeyi kolaylaştıracak bir tasarım uygulamak için araçlar sunar , ancak karmaşıklığınızı artıran kötü bir tasarıma kolayca sahip olabilirsiniz. Başka bir deyişle, düzgün kullanılmazsa, sorunlarınızda teknolojiye bağlı karmaşıklığa sahip olabilirsiniz.

Projenizin ne kadar başarılı olacağını belirleyecek başka birçok yönün olduğunu unutmayın (örn. Proje yönetimi stili, problem tanımı, değişiklik yönetimi, vb.). Kullandığınız teknoloji yalnızca sorunu yönetmenize ne kadar yardımcı olacağı ile ilgilidir .

Sonuçta, nesne yönelimli programlama karmaşıklığa bir çözüm olamaz ; sadece yönetmek için bir araç. (düzgün kullanılırsa)


+1 Sonuçta, nesne yönelimli programlama karmaşıklığa bir çözüm olamaz; sadece yönetmek için bir araç. (uygun şekilde kullanılırsa)
Karthik Sreenivasan

2

Nesne Yönelimi (geleneksel olarak kullanıldığı gibi) birçok durumda yararlı bir araçtır, ancak karmaşıklığa yeterli bir çözüm değildir.

Özellikle, çoğu zaman " tesadüfi karmaşıklık " ekler . Örnekler, uygulama mirasını çevreleyen karmaşıklık, equals () ve hashCode () gibi birçok "standart işlevsellik" sağlama ihtiyacıdır. Stuart Halloway'ın bu konuda hoş bir sunumu: " Sadelik Kolay Değil "

Çoğu dilde nesneler, aynı anda bir dünyada giderek zayıf bir tasarım kararı gibi görünmeye başlayan çok sayıda değişebilir durumu kapsama eğilimindedir . Yine Rich Hickey'in ilginç bir videosu, nesne kimliği ve devlet arasındaki ayrımı ve ikisini birleştirmenin nasıl bir hata olabileceğini inceliyor.


1

Nesneye yönelik programlama bir sorunu temsil etmenin bir yoludur, başka bir şey değil, daha az bir şey. Kendi başına, diğer programlama paradigmalarından daha az karmaşık değildir. İyi tasarlanmış bir OOP sistemi karmaşıklığı yönetir ve azaltır, ancak gerekenden çok daha karmaşık ve her şeyin önüne geçen bir sistem tasarlamak da çok kolaydır.

C ++ dediği gibi, OOP kendinizi asmak için yeterli ip verir.


Ancak bu, güçlü bir dil veya paradigma için geçerlidir. Kendinizi asmak için çok kısa bir ip ister misiniz? onunla asla bir dağa kalkamazsın!
Michael K

@Michael, Bazılarından daha fazla. Ama aslında evet. Gümüş mermi yoktur, hangi dili veya paradigmayı kullandığınıza her zaman destek olur.
Dominique McDonnell

1

Bence EVET , karmaşıklığı ayrıntıları gizleyen kendi kendine yeten küçük "yapı taşlarına" dilimlemenize izin verir ve sonra bunları adım adım katman katman ihtiyacınız olan işlevselliği oluşturmak için kullanır.

Böl ve fethet.


1

OOP bir çözüm girişimidir.

Karmaşıklığı yönetmenin en iyi yolu soyutlamalar oluşturmaktır. Verilerimi bu koleksiyonlarda çalışan tanınabilir işlevlerle yararlı koleksiyonlara dönüştürebilirsem koleksiyonları ayrı "şeyler" olarak düşünmeye başlayabilirim. Sınıfların ve yöntemlerin temeli budur. Bu bağlamda, uygun şekilde tasarlanmış OOP karmaşıklığı yönetmeye yardımcı olabilir.

Yol boyunca bir yerlerde, birisi OOP'u kodun yeniden kullanımı sorununu çözmeye yardımcı olabileceğimize karar verdi. Yani, tekerleği neden yeniden icat ettiniz? Birisi bu sorunu çözmek için çok çalışmışsa, yaptıklarından faydalanın, özel projenizin gerektirdiği tweaks'i ekleyin ve işinizi yapın! Sizin açınızdan nispeten az çalışma ile güçlü, sofistike bir uygulama yarattınız. OO programcıları çok verimli programcılar olabilir.

Sonuç olarak, modern OO programcıları "büyücünün çırakları" haline gelir ve burada birkaç satır "yapıştırıcı" ile büyük, hantal kütüphaneleri birbirine bağlar ve işe yarayan bir şey elde ederler. Sorta. Tür. Çoğu zaman. Bu kütüphaneyi bu kütüphaneyle kullanmanın olası yan etkileri var mı? Olabilir. Ama bu kütüphanelerde bulunan kodu gerçekten incelemek için kim vakti var? Özellikle kütüphaneler gelişirken. Sonuç, bir programcının bu kütüphaneden bir avuç sınıf ve yönteme ihtiyaç duyduğu şişirilmiş uygulamalarla sonuçlandığımız, ancak uygulamanın ihtiyaç duymadıkları tüm diğer şeylerin ağırlığını taşıması gerektiğidir.

Sonuçta ihtiyacınız olandan çok daha karmaşık bir sonuç elde edersiniz.

İşlevselliği ayırmak istediğiniz karmaşıklıkla başa çıkmak için başka bir mekanizma. Tüm veri erişim işlevlerinizi tek bir yerde istiyorsunuz. Tüm kullanıcı arayüzü işlevlerinizi tek bir yerde istiyorsunuz. Tüm denetleyicilerinizi tek bir yerde istiyorsunuz. Böylece işlevselliğin farklı bölümlerini yöneten farklı sınıflar yaratırsınız. Çok uzak çok iyi. Ve bu, bir dereceye kadar ölçeklenir; veri erişimine sahip olan geliştiricileriniz bu sınıfları yazabilir, kullanıcı arabirimi çalışanlarınız kullanıcı arabirimi sınıflarını vb. yazabilir. Her şey iyi ve iyidir.

Başka biri tarafından yazılan bir şeyi korumak zorunda kalana kadar.

Evet, tüm veri erişim işlevlerinin burada bulunduğunu bilmek güzel. Ama onlara ne diyor?

Bu yöntem bu yöntemi o sınıfta çağırıyor. Ama sınıf tanımına baktığımda, bu isimle bir yöntem yok. Oh, bu miras zincirinde bir veya iki katman yukarıdan başka bir şeyden miras alınır. Bir dakika bekle; o sınıf bir arayüz uyguladı mı? Bu arayüzü kaç farklı sınıf uygular? Ve biz çalışma zamanında sınıfların "birbirine bağlamak" için bazı karmaşık çalışma zamanı sistemi (size bakıyorum, Bahar) kullanıyoruz? Bu arayüzü uygulayan HERHANGİ BİR sınıf nerede kullanılabilir?

Kesin şeyler yapan çok sayıda küçük, ayrık yöntemle sonuçlanırsınız. Ama bu, bunu başka bir sınıfta çağırıyor. Hangi başka bir sınıfta, bu denir. Hangi hala başka bir sınıfta bu denir. Ek bir sınıfta olanı çağırır. Hangi belirli bir tür sonucu döndürür. Belirli bir şey yapmak için bir yöntem çağırmanız gerekir. Hangi başka bir tür sonucu döndürür. Vb.

Bunun için bir terim var: spagetti kodu.

Sadece kodu oluşturmak için gereken çok karmaşık bir sistemle sonuçlanırsınız. Bu nedenle Visual Studio, Eclipse ve NetBeans gibi IDE'ler. Hepsi önemli bir öğrenme eğrisine sahiptir. Gerçekten de birçoğu, her biri kendi öğrenme eğrileri olan farklı gruplar tarafından geliştirilen çoklu araçları kapsülleyebilir / toplayabilir.

Bu karmaşıklığı mı yönetiyor?

Hata ayıklama kodu yazmaktan iki kat daha zordur. Bazı şeyleri hata ayıklamada iyi şanslar. Özellikle birden fazla kütüphane kullanıyorsa, bir çeşit bağımlılık enjeksiyon sistemi kullanarak çalışma zamanında "birbirine bağlanmış".

Özetle: OOP, karmaşıklığı yönetmeye yardımcı olmak için umut verici bir araç gibi görünüyor. Gerçekte, ortaya çıkan kod korkunç bir şekilde şişirilme eğilimindedir (çünkü sadece bu bağlantılı kütüphanelerden ihtiyacınız olan parçaları çıkaramazsınız) ve sadece kodda gezinmek için gelişmiş araçlara ihtiyacınız vardır. Hızla bir bakım kabusu haline gelir.

IMHO, net bir kayıp; ortadan kaldırdığından daha fazla karmaşıklık katıyor. Onsuz, son derece zor, hatta imkansız olan şeyleri yapmanıza izin verir. Ancak herhangi bir büyük proje hızla sürdürülemez bir karmaşaya dönüşür.

Nasıl çalıştığını zaten biliyorsanız ve bunu hatırlayabiliyorsanız, bunu sürdürme şansınız olabilir.

Eagleson Yasasını uygulamayı unutmayın: altı ay içinde bakmadığınız herhangi bir kod, başka biri tarafından da yazılabilir.


0

Bir dereceye kadar...

Neden? Çünkü çok mantıklı bir modülerliği kolaylaştırıyor. En azından büyük spagetti kod yığınları yazmanın çok cazip olduğu prosedürel programlamaya kıyasla.


0

Nesne yönelimli programlamanın karmaşıklığı ele almamıza yardımcı olmasının nedeni, bizi çok çeşitli yollar yerine belirli bir şekilde kod yazmaya zorlamasıdır. Görev odaklı programlama çok daha sezgiseldir, bu yüzden programlama bu şekilde başlamıştır. Nesne yönelimi, etkili bir şekilde anlamak ve kullanmak için eğitim ve uygulama gerektirir, ancak programlamayı belirli bir yolla sınırlandırarak, eğitimli olanların yazılan kodu etkili bir şekilde sürdürmelerini sağlar.

Diğer yöntemlerden daha mantıklı ya da gerçek dünya değil, sorunumuzu benzer objektiflerden odaklamanın bir yolu. Birçok teknik uzmanlık, görevlerinin karmaşıklığını ele almak için sezgisel olmayan katı bir metodoloji paradigmasını kullanır.

Karmaşıklığı ele almak için üçüncü bir yöntem, işlevsel programlama olacaktır ve gelecekte de yeni yöntemler olacaktır.


1
Yorumlar kaldırıldı; onları sivil tutmaya çalışın.
Fishtoaster

0

Bence bu, sürdürülebilirlik için daha çok bir çözüm, çünkü bir programcı olarak, verilerinizin olduğu yöntemlere koymanız gerekiyor, böylece uygulamanızın nesne modelini oluşturuyorsunuz.

evet, aynı zamanda kodunuzu doğal bir şekilde, özellikleri ve olası eylemleri olan nesneler olarak "görmeniz" için bir model sağlayarak karmaşıklığa bir çözümdür

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.