Nesneye Dayalı Programlama Gerçekten Gerçek Dünyayı Modelliyor mu? [kapalı]


52

Nesneye yönelik programlamanın, gerçek dünyayı modellemeye dayandığını sıklıkla tekrarladığımı gördüm, öyle değil mi?

Bana öyle geliyor ki, iş dünyasının dışındaki hiçbir şey için doğru değil. GUI sınıflarım / veri erişim sınıflarım gerçek dünyadaki hiçbir şeyi modellenmiyor. İş katmanımda bile, gerçek dünya nesnesi olmayan gözlemciler, yöneticiler, fabrikalar vb. Sınıflarım var. Sınıflarımı kapsülleme gibi şeylerden yararlanmak için tasarlamaya çalışıyorum ama gerçek dünya kapsüllenmiş mi?

Oluşturduğum bazı nesneler gerçek dünya nesnelerini modellerken, OOP öncesi kod aynı şeyi yapmaz mı? OO’nun Müşteri gibi kavramları kod tabanlarına ekleyen ilk insanlar olduğundan şüpheliyim. Fakat OO gerçekten şeyleri nasıl modelleyeceğiyle ilgili ve bu modelleme yöntemi bana gerçek dünyadan ilham vermiyor gibi görünüyor.

Öyleyse: nesne yönelimli programlama gerçek dünyayı gerçekten modelliyor mu?


85
Gerçek dünya nesnelerini temsil eden OOP objelerinin analojisini kullanma fikri "çocuklar için yalan" kavramının en önemli örneğidir. Temelleri öğrenmenin sezgisel bir yolu olduğu için bu yalanı OOP öğrenmeye yeni başlayan insanlara anlatıyoruz. Bu temel bilgileri öğrenir öğrenmez, bildikleri her şeyin yanlış olduğu gerçeğini emmeye hazırlar; işler aslında ondan daha karmaşık. Tıpkı okuldaki fizik gibidir: yumruk şeyler düşer, sonra işler daha büyük şeylere çekilir, daha sonra büyük şeyler uzayı büker, ve sonunda bize işlerin nasıl yürüdüğü hakkında hiçbir şey bilmediğimiz söylenir.
evilcandybag

4
Buradaki asıl çekişme nedir? OO teknikleriyle hiçbir zaman yeterince modellenemeyen gerçek dünya varlıkları var mı? Yoksa basitleştirilmiş bir anlayışı kullanarak modelleme dünyaya yeterince uymuyor mu, işe yaramayan kötü bir fikir mi?
Dipan Mehta

1
@DipanMehta, çekişme, OO'yu gerçek dünyayı modelleme olarak tanımlamanın nesne yönelimli programlamanın özünü özlüyor olmasıdır. Tüm programlama teknikleri gerçek dünyayı modellenir (bir dereceye kadar), OO'yu benzersiz yapan şey bu değildir.
Winston Ewert

@WinstonEwert Peki, OO'yu gerçekten ayıran modeling the real worldşey olmayabilir . Olabilir. Ama kesinlikle bunu OO'da yapmakta başarısız olacağınıza inanmayacağım. Sence hangi paradigma veya teknik OO'dan daha iyi sonuç verir?
Dipan Mehta

14
Tüm programlama, gerçek dünyadaki bir şeyi modellemeye çalışır. Bazı paradigmalar sadece farklı parçaları diğerlerinden daha iyi modellenir. İşlemsel kod modelleri iş akışı, Fonksiyonel kod modelleri mantıksal problem çözme, Nesneye Yönelik kod modelleri hiyerarşik ilişkiler. Assembly Dili kod modelleri harika .
Jesse C. Dilimleyici

Yanıtlar:


50

Hayır, hiç de değil.

Bununla birlikte, veri yapılarına etki eden bazı yöntemlerle birlikte karmaşık veri yapılarını tutmak için hoş bir soyutlama oluşturmayı sağlayan bir metodolojidir.


Büyük ve özlü cevap. Tanım olarak modeldeki bazı ayrıntıları kaybedersiniz.
MathAttack

Üzgünüm, bu cevabı sevmiyorum. OOP ile gerçek dünyayı büyük ölçüde modelleyebilir (bazı yönlerini).
clime

33

Her türlü model, tamamen değil, gerçek dünyayı modellemez.

Bu modeli seçilen kısımları, mevcut uygulama alakalı olanlardır.

Bahsettiğiniz şey (gözlemciler, yöneticiler, fabrikalar vb.), Soyutlamayı doğru yapmanıza yardımcı olmak ve ısrar gibi gerekli işlevleri desteklemek için orada olan altyapıdır.


15
“Modelleme” nin zaten bazı yönleri taklit etmek anlamına geldiğini (başkalarını dışlarken) savunuyorum. Bu anlamda, OO gerçek dünyayı modellemeye izin verir.
Tamás Szelei

Sorununuzun hangi kısımları OO tarafından iyi modellenmiştir? Bazı problemler bir OO modeliyle iyi eşleşmiyor, iklim modelleri akla geliyor. Birçok işletme sorunu OO ile iyi eşleşmektedir, bu yüzden model yaygın olarak kullanılmaktadır.
Michael Shops,

@MichaelShopsin - Yorumunuzun cevabım yerine soru üzerine olması mı demek istediniz ?
02.02'de

@Oded Cevabınızı beğendim; yorumum "seçilen model bölümleri" nin genişlemesi. OO desenleri pek çok sorunu modelliyor; bu, eldeki sorunla eşleştiklerinden emin olma meselesi.
Michael Shops,

31

Yine de model nedir:
Bir model, gerçek dünya sistemi veya etkinliğinin işleyişini açıklamak için kullanılan basitleştirilmiş bir temsildir.

Nesne yönelimli programlama gerçek dünyayı modellemenize izin veriyor mu?

Kesinlikle evet

Sistemi gerçek dünyayla tam olarak eşleşecek şekilde modellemek neredeyse imkansızdır.

Yazılımı her zaman tam olarak gerçek dünyadan sonra modellemek zorunda mıyım?

HAYIR

Eğer anlamına gelmez her şeyi modelleyebilirsiniz söyledikten zorunda herşeyi modellemek. Aslında, faydalı modellemenin özü basitleştirilmiş bir sunum sunmaktır. Mevcut iş ihtiyacını ifade etmek için ne kadar sadeleştirmenin yeterli olduğu ve neyin ihmal edilmesi gerektiği, tekniğin başarılı bir şekilde kullanılması ile kaybedilme veya hiç kullanılmaması arasında iyi bir denge kurar.

Elbette var olmayan, var olan varlıklar var, ancak yalnızca modelleme yoluyla, aslında iyi bir şekilde kavramsallaştırabiliriz.


9
Model nedir? ” Sefil, küçük bir özel yığın. Ama yeterince kod sana sahip!
Ben Brocka

Sanırım son noktan somut olmayan ilişkileri ele geçiriyor. Bazen nesneler gerçek dünyada var olur, biz onları görmüyoruz.
MathAttack

19

İsimlerle sınıflar arasında bir ilişki olduğunu öğretmenin, daha sonra sabırsız bir mimar veya kıdemli mühendis tarafından ezilmesi gereken rahatsız edici kötü alışkanlıklara neden olduğunu düşünüyorum.

Öğretilmesi gereken, sınıfların beyninizin yaptığı gibi soyut nesneleri modellemesidir. Kafanızda, herhangi bir fiziksel arabaya eşlenmeyen soyut bir "araba" kavramı var, yeniden kullanılabilir, arabanın kendine özgü uygulamaları. Beyniniz bile sizin için kavramlar meta-modeller. Düşüncenin, bir kavramın ne olduğuna dair zihinsel bir modeliniz var.

İnsanlara kafanızda oluşturdukları modelleri tanımlamayı öğretirsek, gerçek bir yazılım oluşturmak için daha hazırlıklı olurlardı.


+1 Böyle harika ve sıra dışı bir bakış açısı. Paylaştığın için teşekkürler! Bunu bir kitap şeklinde alıp almadığınızı merak ediyorum. Kesinlikle bu kitabı okumayı çok isterim.
Mehdi,

8

... Dünya, nesne yönelimli sözdizimi ile ifade edilebilenden daha zengin.

İnsanların evrensel olarak tüm sistemleri anlamak ve tanımlamak için kullandıkları, nesne kalıbına uymayan kavramlar düşünün. “Önce / Sonra” paradigması, “sebep / sonuç” ve “sistemin durumu” kavramı en canlı örneklerdendir. Aslında, 'kahve demleme', 'bir araç montajı' veya 'Mars'a bir gezici iniş' süreci basit nesnelere ayrıştırılamaz. Evet, OO dillerinde bu şekilde muamele görüyorlar, ancak bu kararlı ve karşı sezgisel. Rutinin kendisinin dizisi - hangi nedenden önce hangi koşullar altında ne nedenselliğe bağlı olarak - OO'da anlamlı bir temsili yoktur , çünkü OO'nun sıralama, durum veya sebep kavramı yoktur.

Süreçler gerçek dünyada ve programlamada oldukça yaygındır. Yıllar geçtikçe işlemleri, iş akışını, düzenlemeyi, konuları, protokolleri ve diğer doğası gereği 'prosedürel' kavramları ele almak için ayrıntılı mekanizmalar geliştirilmiştir. Bu mekanizmalar, OO programlamasının zaman içindeki değişmeyen eksikliğini telafi etmeye çalışırken karmaşıklığı doğurur. Bunun yerine, sorunun nedeni, 'önce / sonra', 'neden / sonuç' ve belki de 'sistem durumu' gibi sürece özgü yapıların dilin temel bir parçası olmasına izin vererek ...

kaynak alıntı: Victoria Livschitz, Programlamadaki Bir Sonraki Hareket


2
Hala aynı fikirde olmadığınız bir şey için yapılmış zorlayıcı bir dava gördüğünüzde garip bir his. Teklif için motivasyon alıyorum ve bunu daha iyi ifade etmek zor olurdu. Sembolik, ilişki odaklı düşünce süreçlerimizde yaptığımız gibi problemlerimizi modellemenin yanlış olduğunu bilmiyorum.
tehditkar bir şekilde

İlginç sanırım… ama hiç kahve demeden bir program yazmak istemedim. Sorunun kendisi belirsiz bir şekilde tanımlanmıştır. Programın donanım aktüatörlerine erişimi var mı, yoksa bu saf bir simülasyon mu? Her iki durumda da, nesne yaklaşımı başlamak için iyi bir yer sağlayacak gibi gözüküyor, ya aktüatörleri modellemek ya da dahil olan aktörlerin ve araçların iç durumunu modellemek.
Mark E. Haase,

13
this.MoveTo(Environment.Find<Bathroom>().OrderBy(b=>b.Distance(this)).First()); this.SitOn(Environment.Find<Toilet>().Where(t=>!t.IsOccupied).OrderBy(t=>t.Distance(this)).First().Component<Seat>()); this.DiscardWaste(HumanWasteType.All);
Adam Robinson,

1
Aşırı derecede dar OO paradigmasına karşı bu kadar çok doğru eleştiri puanı verirken Java'nın savunucusu olduğuna inanmak zor. Ve biraz saçma, onu daha iyi yapan dillerden hiçbirinden bahsetmiyor ("Selefi C ++ 'a göre çok büyük bir gelişme" ... dışında).
leftaroundabout

1
OO sıralama veya durum kavramına sahip değildir . Böyle bir saçmalık. OOP? OO
clime

5

Evet, OO genellikle gerçek dünyadaki varlıkları modellemek için kullanılabilir.

İş katmanımda bile gerçek dünya nesnesi olmayan gözlemciler, yöneticiler, fabrikalar vb.

Nesneye yönelik gelişimi tasarım desenleriyle karıştırmayın. OO analizi ve tasarımı, programlanabilir bakım koduna yaklaşmanın bir yoludur. Bir OO diliyle birlikte, programcılara OO sütunları aracılığıyla yeniden kullanılabilir kod oluşturma gücü verilir: kapsülleme, polimorfizm ve kalıtım.

Bir varlığı kapsüllemek için, bu varlığı gerçek dünyadaki meslektaşı sonrasında modelleyebiliriz. Örneğin, bir gitarımız varsa, o zaman bir gitar sınıfı gerçek dünyadaki bir gitarın davranışlarını ve özelliklerini içine alır. Gitarı, IInventoryItempolimorfizm ve kalıtım yoluyla tekrar kod kullanma potansiyelinden yararlanmak için bir dize olarak soyutlayabiliriz .

Öte yandan, bir gitar fabrikasının bir dizi farklı gitar türünün bakımında bize yardımcı olabileceğini görebiliriz. Bu OO yüzünden değil. Aksine, bir fabrika zamanın testini böyle bir amaç için başarılı bir şekilde oluşturulabilen bir kod oluşturmak için kanıtlanmış bir araç olarak gösteren bir tasarım desenidir. Başka bir deyişle, biz programcılar genellikle benzer problemleri çözüyoruz. Bu yüzden onları çözmek için ortak bir çözüm bulduk (tekerleği yeniden icat etmeyin).

Bu, OO'nun gerçek dünyayı modellemesi gerektiği ve bunun için her zaman en uygun çözüm olmadığı anlamına gelmez. Basitçe, “gerçek dünyayı modelleyen OO” un bir kural olarak mükemmel bir anlamı var.


5

Bahsettiğiniz gerçek dünyaya bağlı.

Jorge Luis Borges, yerleşik halklardan birinin gerçek dünyalarını oldukça farklı algıladığı "Tlön, Uqbar, Orbis Tertius" adlı bir hikaye yazdı:

[...] hayali Tlön halkı [...] dünyanın gerçekliğini inkar ederek aşırı bir Berkele idealizmi biçimine sahipler. Onların dünyası "uzaydaki nesnelerin bir eşleşmesi değil, heterojen bir bağımsız eylemler dizisi" olarak anlaşılıyor. Tlön'ün hayal edilen dillerinden biri isimlerden yoksundur. Merkezi birimleri "zarf kuvveti olan tek heceli ekler veya ön ekler tarafından nitelendirilen kişisel olmayan fiiller" dir. Borges, "Suyun üstünde ay yükseldi" nin Tlönic eşdeğerini listeliyor: yani axaxaxas mlö kelimesini seslendiriyor. [...] Tlön'ün bir başka dilinde, "temel birim fiil değil, tek heceli sıfattır", iki ya da daha fazlasının kombinasyonları ile isim oluşturmaz: "ay" karanlık "veya"

( kitap hakkındaki wikipedia kitabından kopyalandı )

Benim için mesele, dünyanın klişeleşmiş olduğumuzdan farklı olarak algılanabileceği kadar değil, ama gerçekliğin yapısının algılanması, konuştuğumuz dile, doğal veya programlama diline bağlı. Tlönese, Lisp ile çok mutlu olabilir ve Java'yı (AKA İsimler Krallığı ) çok doğal bulmayabilirken, çoğu terörist programcı, işlevsel diller üzerine odaklanmış nesneler lehine eğilim gösterir. Her iki stilde de hoşuma gidiyor, çünkü bunun çoğunlukla bir perspektif meselesi olduğunu düşünüyorum. Bazı problemler en iyi şekilde işlevsel, bazıları da nesne yönelimli programlama teknikleriyle saldırıya uğrar. İyi bir programcı, çözüme teşebbüs etmeden önce her zaman farklı açılardan zor bir soruna bakar. Veya Alan Kay'ın dediği gibi: Bakış açısı 80 IQ puan değerindedir .

Öyleyse, sorunuza cevabım: Hangi gerçek dünyadan bahsediyorsunuz? Ve nasıl?


“Gerçekliğin yapısının bu algısı, konuştuğumuz dile, doğal mı yoksa programlama dili mi olduğuna bağlı”. Bu çok doğru!
clime

4

Yarattığım bazı nesneler gerçek dünya nesnelerini modellerken, OOP öncesi kod aynı şeyi yapmaz mıydı?

Öyle olmaz derdim. OOP, işler (özellikler / nesneler) ile ne yapabileceğini / ne yapabileceğini / ne yapabileceğini (yöntemler) arasındaki ilişkiyi bağlar, oysa prosedürel programlama bunu yapmaz (katı tipleme kullanırken küçük bir dereceye kadar). Bir model sadece ayrık parçaları ve işlemleri tanımlamakla ilgili değildir, aynı zamanda nasıl bir araya geldiklerini tanımlamakla da ilgilidir ve OOP bu konuda özellikle iyidir.


Bence işlemsel değil işlevsel değil demek istiyorsun.
Winston Ewert

evet, doğru. Ben onu değiştireceğim
Mart'ta

3

Nesne yönelimli programlamanın gerçek dünyayı modellemeye dayandığını sık sık tekrarladım, değil mi?

Evet. Burada vurgu dayanmaktadır . OOP gerçek dünyayı modellemiyor (eğer öyleyse, tesadüfen) ve yapmaması gerekiyor. OOP'nin yaptığı şey, programlama problemlerini gerçek dünyayı modelleme şeklimizde modellememize izin vermek: davranışlarını soyutlama yoluyla tanımlanan bir varlık sistemi olarak.


3
Evet - bu yüzden oluyor değil tabanlı , doğru, gerçek dünya modelleme üzerine?
leftaroundabout

3

OO kodu genellikle gerçek dünyayı modellemez - en azından amaç bu değil, sadece gerçek dünyadaki şeyler hakkında düşündüğünüz gibi daha doğal bir şekilde kodunuzu düşünmenizi sağlar. Bu, teklifin söylemeye çalıştığı şeydir.


3

Dünyamızı modellemiyor, ama dünyamızın insan yorumunu modelliyor. İnsanlar doğal olarak şeyleri nesne olarak ayırırlar. OO etkilidir çünkü insanların düşündükleri şekilde programlanmasına izin verir.


2

OOP, gerçek dünyanın ve içinde yer alan nesnelerin kusursuz bir modeli olmayabilir, ancak gerçek yaşam yazılımının artan karmaşıklığı ile baş etmeye yardımcı olan bir metodolojidir. Ayrıca, mantıksal olarak ilişkili parçalara bölünerek daha iyi kod yazılmasına yardımcı olur.

Daha eski prosedür odaklı yöntemler de kesinlikle sonuç verirken, OOP büyük ve karmaşık projelerle uğraşırken bile oraya daha hızlı ve göreceli bir şekilde ulaşmanıza yardımcı olur.

Soyutlama ve Kapsülleme, gerçekte olayların gerçekleşmesini sağlayan tüm tesisatı gizlerken, sorunun özüne odaklanmaya yardımcı olur. Kalıtım ve kodunuzun çeşitli yönleri arasında anlamlı ve mantıklı bir ilişki kurmanıza olanak sağlar. Polimorfizm, kodun yeniden kullanılmasını teşvik eder ve varyasyonları (bu " mevcut nesneyle neredeyse aynı davranış" kategorisi) bu kadar sık ​​karşılaşılan sorunların kategorisini kolayca yönetmenizi sağlar ve bir nesneyle ilişkili semantikleri genişleterek kodu genişletir.

OOP'un, gerçek yaşam sisteminin tüm karmaşıklıklarını etkili bir şekilde ele almanıza izin veren kanıtlanmış bir yardım aracı olduğunu düşünüyorum . Bu nedenle, gerçek dünyanın çok kapsamlı bir modeli olmasa da, yeterince yakındır ve sonunda IMHO'nun önemli olan şeyleri yapmanıza yardımcı olur.


2

Nesne yönelimli programlamanın gerçek dünyayı modellemeye dayandığını sık sık tekrarladım, değil mi?

Bana öyle geliyor ki, iş dünyasının dışındaki hiçbir şey için doğru değil.

Hayır. Sizin de belirttiğiniz gibi, bir OOP dilinde "modellenen" şeylerin çoğu, mesaj kuyrukları ve kontrolörleri ve yığınları gibi soyut kavramlardır.

İş katmanınızda bile, hala “gerçek dünyayı” modellenmiyorsunuz. Bir çalışan sınıfınız olduğunu varsayın. Çalışanlar ayrıca İnsanlar, aynı zamanda Memeliler, aynı zamanda Hayvanlar, aynı zamanda… Kısacası, gerçek dünyada çoğu programda yakalamaya çalışmadığımız çok fazla karmaşıklık var.

Modellemede, modelin yalnızca eldeki göreve anlamlı olan yönlerine odaklanıyoruz. Bir zaman giriş sistemi tasarlıyorsak, muhtemelen bir tür Çalışan sınıfı istiyoruz, ancak bu sınıf çalışanın en sevdiği rengi ifade etmek için bir özelliğe ihtiyaç duymuyor.

Bu nedenle, modeller “Gerçek Dünya” yı tamamen temsil etmeyi denememeli (ya da taklit etmemelidir).

Yarattığım bazı nesneler gerçek dünya nesnelerini modellerken, OOP öncesi kod aynı şeyi yapmaz mıydı? OO’nun Müşteri gibi kavramları kod tabanlarına ekleyen ilk insanlar olduğundan şüpheliyim.

Haklısın. OOP olmayan büyük programlara bakarsanız, genellikle veri yapıları etrafında düzenlenirler. Bir veri yapısı ve manipüle eden tüm fonksiyonlar açıklık sebepleriyle yan yana tanımlanmıştır. ( Subversion projesi buna güzel bir örnektir. Veri yapıları ve fonksiyonlarına modül adları eklenmiştir, böylece hangi yapıların ve fonksiyonların birbirleriyle kullanılması amaçlanmıştır.)

Programlama dillerinin tarihi konusunda uzman değilim, ancak OOP'un bu şekilde düzenlendiğinde kodun daha net ve daha kolay anlaşıldığına dair gözlemden kurtulduğunu hayal ediyorum, bu nedenle dil tasarımcıları bu tür bir organizasyonun bulunduğu dilleri tasarlamaya başladılar. daha sıkı bir şekilde uygulandı.

OOP ve OOP olmayanlar arasındaki en büyük fark, OOP'un verileri kodlara bağlamasıdır. Yani böyle bir kod çağırmak yerine:

verb(noun);

bunun yerine bunu yaparız:

noun->verb();

Bu gramersel bir fark gibi görünse de, fark aslında zihniyette. Nesnelere ne yapılması gerektiğini söyleriz ve genellikle nesnenin içsel durumunun veya çalışmalarının ne olduğu ile ilgilenmeziz. Bir nesneyi tanımlarken, onunla çalışmak için yalnızca kamuya açık arabirimini tanımlamamız gerekir.


2

Nesneye Dayalı Programlama Gerçekten Gerçek Dünyayı Modelliyor mu?

Tam olarak değil.

Gerçek dünyada, gerçek sorunlarla karşı karşıyayız. Bu problemi, inşa etmek istediğimiz sistemi kopyalayan bir paradigma kullanarak çözmek istiyoruz.

Örneğin, eğer bir Alışveriş Sepeti uygulaması eldeki problem ise,

  1. Kitaplar, Gadget'lar, Arabalar gibi birden fazla üyeye sahip olabilen ve yine alt bölümlere ayrılabilen soyut terim olan ürün .

  2. Vergi Kriterleri gibi (Satış Vergisi), yazılımın hükümet politikalarına dayalı olarak değişime tabi tutulduğu yerde uygulandığı yere bağlı olacaktır.

  3. Vergi ürün vergi ölçütleriyle birlikte ithal edilip edilmediği dayalı olarak kabul edilir.

  4. Kullanıcı ürün listesi vb. Olan bir alışveriş sepetine sahip olabilir .

Görebildiğiniz gibi, çözmeye çalıştığımız ancak OOP paradigmasına modülerleştirilmiş olan ve gerçek sisteme mümkün olduğu kadar yakın olması için gerçek sorunlar var.


1
Bu cevabı beğendim. OO sorun alanınızı modellemelidir, bu nedenle bazıları çözmeye çalıştığınız sorunla ilgili olmayacak birçok gerçek dünya kavramı olsa da, içinde tam olarak bir şeyle eşleşmeyen OO yapıları olacak. gerçek dünya, ancak problem alanındaki bir ihtiyacı karşılar.
Andy

2

Bence çok yalancı, tarihi, açık bir ifade olması istenen şeyi çok fazla okuyorsun. OO programlama, sınıflar, polimorfizm, sanal fonksiyonlar, vb. Fikirlerin çoğu 1960'larda (http://en.wikipedia.org/wiki/Simula) Simula dilinde tanıtıldı. Adından da anlaşılacağı gibi Simula, simülasyon yazmak için bir dil olarak tasarlanmıştır. Bu yüzden tarihsel olarak evet, “gerçek dünyayı” modellemek için OO fikirleri tanıtıldı. Diğer stillerden daha fazla başarılı olup olmadıkları tartışma konusudur.


2

Yarattığım bazı nesneler gerçek dünya nesnelerini modellerken, OOP öncesi kod aynı şeyi yapmaz mıydı?

OOP ve OOP öncesi kod arasındaki en büyük fark, eski modellerin, her biri ne yapabileceği konusunda sınırlı "gücü" olan ve aynı zamanda "tepki gösterebilen" güçleri olan birbirleriyle etkileşime giren bir grup farklı varlık olarak gerçek dünya durumunu ortaya koymasıdır. kendi eylemleri ile dış olaylar. Sonuncusu, her şeyi kendi başına bir şey yapmayan büyük bir veri yığını olarak modellerken, hesaplama "gerçekleşen şeyleri" temsil eder ve bunların herhangi birini veya tümünü etkileyebilir.

Gerçek dünyayı daha iyi modelleyip modellememesi, gerçekte dünyanın hangi yönünü modelleyeceğinize bağlıdır. Örneğin, yanan bir yangının surrouding nesnelerinde sahip olacağı etkileri tanımlamak istediğiniz bir fizik simülasyonu, hem ışığın hem de sıcaklığın iyi olması nedeniyle, "geleneksel" bir yaklaşımla daha iyi temsil edilebilir. diğer nesnelerin hem iç hem de dış durumunu etkileyen ve her özel nesnenin davranışına göre değişmeyen, yalnızca özelliklerinden etkilenen tanımlanmış işlemler.

Öte yandan, istenen davranışı üretmek için etkileşime giren farklı bileşenleri modelliyorsanız, bunları pasif şeyler yerine aracılar olarak kullanmak, hiçbir şeyi kaçırmadan doğru şekilde yapmayı kolaylaştırabilir. Televizyonumu açmak istersem, sadece düğmeye basardım, eğer elektrik kablosu çekilirse, TV.turnOnbenim için kontrol eder. Bu yüzden, bir çarkı çevirme ve ona dokunan diğerini çevirmeyi unutma riski yoktur, çünkü çark dişi (eğer doğru programlanmışsa) birincil olanın bir sonucu olarak ortaya çıkan ikincil etkileşimlerle ilgilenecektir.

Fakat OO gerçekten şeyleri nasıl modelleyeceğiyle ilgili ve bu modelleme yöntemi bana gerçek dünyadan ilham vermiyor gibi görünüyor.

Bunun yolu ile yapmak için daha fazla olduğuna inanıyorum biz dünyanın aslında ne kadar daha dünyayı algılıyorum. Bir kişi, her şeyin sadece bir demet atom (veya enerji veya dalgalar) olduğunu iddia edebilir, ancak bu, çevremizdeki çevreyi anlamak ve gelecekteki olayları tahmin etmekle karşılaştığımız problemlerle başa çıkma görevini yerine getirmemize yardımcı olmaz. veya geçmişlerini tanımlamak). Böylece, dünyanın "zihinsel modellerini" yapıyoruz ve bu zihinsel modeller OO ile veri + süreçlerinden daha iyi bir ilişki bulur - ki bu, gerçek dünyanın gerçekte nasıl işlediğini tartışmalı bir şekilde daha iyi modellemektedir.

Ayrıca, çoğu insanın OOP'yi taksonomik olarak nesnelerin kümelerini ve alt kümelerini yarattığımız ve açıkça nesneleri çok özel bir kümeye koyduğumuz "klasik OOP" ile eşanlamlı olarak düşündüğünü not etmek ilginçtir. Bu , yeniden kullanılabilir yeni türler oluşturmak için çok faydalıdır , ancak modellediğiniz varlık kendi kendine yeterli olduğunda ve diğer nesnelerle etkileşimi başlatırken nadiren bir etkileşimin hedefi olduğu durumlarda çok iyi değildir. Daha da kötüsü, söz konusu ürünün çok az (belki sadece bir) örneği olduğunda veya örnekler kompozisyon, davranış veya her ikisinde de çılgınca değişiklik gösterir.

Bununla birlikte, bir nesnenin benzerini seçerek ve farklı oldukları yönleri sıralayarak tanımladığı "prototipik OOP" da vardır. Bu makaleyi , düşünce sürecinin iyi ve teknik olmayan bir açıklaması için önerebilirim (bütün yazı Steve Yegge standartlarında bile çok büyük, bu yüzden ilgili bölüme işaret ediyorum: P). Yine bu, bilinen örneklerle kıyaslandığında bilinmeyen örnekleri hayal ederken zihinsel modellerimiz için iyi bir eşleşmedir, ancak gerçek dünyanın nasıl işlediğiyle ilgili olmak zorunda değil… birçok yönden "aynı" olmak gibi)


1

Bence "mu" bu sorunun önemli bir parçası. Ben Nesne yönelimli programlama kesinlikle düşünüyorum Can gerçek dünya "nesneler" modellemek, ama bu programlama . Kötüye kullanılamayacak hiçbir metodoloji yok , bu yüzden “OOP gerçek dünyayı modellemiyor” demenin adil olmadığını düşünüyorum, çünkü Nesnelerle aptalca şeyler yapabilirsiniz. İşaretçilerin güvenli olmadığını söylemekten daha adil değil çünkü işaretçilerle aptalca şeyler yapabilirsiniz.

Vikipedi'nin konuyla ilgili yazdığı yazı şöyle:

Gerçek dünya modellemesi ve ilişkiler
OOP, gerçek dünya nesnelerini ve süreçlerini dijital meslektaşları ile ilişkilendirmek için kullanılabilir. Bununla birlikte, herkes OOP'un doğrudan gerçek dünya haritalamasını kolaylaştırdığını (bkz. Olumsuz Eleştiri bölümü) veya gerçek dünya haritalarının bile değerli bir hedef olduğunu kabul etmiyor; Bertrand Meyer, Nesne Yönelimli Yazılım Yapımında [21], bir programın bir dünya modeli değil, dünyanın bir kısmının bir modeli olduğunu; "Gerçeklik iki kez çıkarılmış bir kuzendir".

Mesele şu ki, programınız bir evren simülasyonu olmadığı sürece, yalnızca gerçek dünyanın parçalarını - yani “model” i önemsiyorsunuz . Modeller bunun içindir, size göstermeniz gereken yapıyı ve işlevselliği verir.

Gerçek dünyada bir şeylerimiz (Nesneler) var ve bir şeyler eylemler gerçekleştirebilir (yöntemler). Şeylerin yönlerini ölçebiliriz (Özellikler). OOP, indirgemeci bir şekilde kullanıldığında gerçek dünyadaki şeyleri modellemek için her potansiyele sahiptir; Her karmaşık şey daha küçük veya daha spesifik alt sınıflara sahiptir ve bu şeylerin hepsi yöntemlerle doğal etkileşime sahiptir.

OOP bir soyutlama yöntemidir, bu yüzden pratik olan şey, OOP'un Gerçek Dünyadaki nesneleri gerçekten mantıklı bir şekilde modellemesi olup olmadığıdır , olası her şeyin yapabileceği her şeyi modellememeniz daha az önemlidir . Mümkün olan her şeyi yapmanız gerekiyorsa, gerçekten modellik yapmazsınız .


1

Nesne yönelimini uygun bağlamında düşünmek için, bir soyutlama seviyesini yükselterek genel olarak programlama hakkında konuşalım, tamam mı?

OO veya fonksiyonel yaklaşımlar alsanız da, programınız bir şeyler yapmak zorundadır , değil mi? Programın amacı, belli bir uyaran dizisi verilen belli davranışları sergilemektir . Dolayısıyla programların var olmasının sebepleri, bir şeyler yapmalarıdır . Buradaki anahtar kelime davranış .

Bir programın hangi davranışları uygulaması gerektiğine ek olarak, programınızın genellikle belirli nitelikleri sergilemesi gerekir. Örneğin, bir kalp monitörü programının gerekli davranışları yapması yeterli değildir - genellikle gerçek zamanlıya yakın bir zamanda çalışması için yeterince hızlı bir şekilde performans göstermesi gerekir. Bir programın sergilemesi gereken diğer "nitelikler": güvenlik, esneklik, modülerlik, genişletilebilirlik, okunabilirlik vb. Bunlara Mimari Kalite Nitelikleri diyoruz . Bu nedenle programımızın belirli davranışsal (işlevsel) hedeflere ulaşmasının yanı sıra belirli nitelikleri (işlevsel olmayan) sergilemesi gerektiğini söyleyebiliriz.

Şimdiye kadar, bunların hiçbiri OO hakkında konuşmadı, değil mi? Şimdi bunu yapalım.

Bir mühendis gereklilikleri (davranışsal, AQA'lar, kısıtlamalar, vb.) Anladıktan sonra, soru ortaya çıkar: Kodumu nasıl kullanmalıyım ki, faydalı bir program olmak için gereken nitelikleri sergilemesinde yapması gereken her şeyi yapmalı mı? Nesneye yönelik programlama, programınızın işlevselliğini birlikte çalışan nesnelerin birleştirici modüllerinde düzenlemek için bir stratejidir. İşlevsel programlama, programınızın işlevselliğini organize etmek için başka bir stratejidir ve bunu farklı bir şekilde yapar. Her iki stratejinin de güçlü ve zayıf yönleri vardır.

İşlevsel kavramlarda son zamanlarda bir yeniden dirilişe tanıklık ediyoruz, çünkü diğer sebeplerin yanı sıra, büyük ölçüde dağılmış işlem için çok çekici olan güçlü yanları var.

Fakat OO'ya geri dönersek, artık “gerçek dünyayı” modellemesinin zorunlu olmadığını görebilirsiniz; Programın davranışını, programınızın herhangi bir sayıda iş hedefine ulaşmak için gereken nitelikleri sergileyebilmesi için organize etmektir. TDD, DDD ve BDD gibi teknikler, nesnelerimizi en iyi şekilde nasıl organize edeceğimizi keşfetme yöntemlerimizdir. İlkeler, Desenler ve Uygulamalar , Testlerle Yönlendirilen Nesneye Yönelik Yazılımların Artırılması , Örneklere Göre Belirleme ve Etki Alanına Dayalı Tasarım gibi kitaplar , nesne yönelimi teorisini ve pratiğini davranış odaklı tasarıma odaklanarak düzenler.

"Gözlemciler, yöneticiler, fabrikalar, vb." Gibi şeyleri okuduğunuzda, programınızın yararlı olması için gerekli olabilecek belirli nitelikleri sergilemesine yardımcı olan OO modellerini uygularsınız. İhtiyaçlarınızın, kalıbın çözdüğü sorunla eşleşmesi koşuluyla, “çalışma eğiliminde” olan “kanıtlanmış tarifler” dir.

Umarım, OO ile işlevsel paradigmalar arasında çok taraflı görünmeden OO'nun ne anlama geldiğini anlamanıza yardımcı olur.


1

OOP programlama açısından güzel bir model yaratır, gerçek dünyayı yansıtmaz.

Ancak, gerçek dünyaya, alana özgü diller ( DSL ) terimi ile bilinen çok daha iyi yaklaşımlar vardır . Mesela Boo size okunaklı kodları neredeyse sade bir İngilizcede yazabilmenizi sağlar ( makaleden örnek ).

apply_discount_of 5.percent:
         when order.Total > 1000 and customer.IsPreferred
         when order.Total > 10000

suggest_registered_to_preferred:
         when order.Total  > 100 and not customer.IsPreferred

Diğer bir örnek, Gherkin diline dayalı otomatik kullanıcı kabul testi çerçeveleridir .

Feature: Some terse yet descriptive text of what is desired
    In order to realize a named business value
    As an explicit system actor
    I want to gain some beneficial outcome which furthers the goal

Scenario: Some determinable business situation
    Given some precondition
        And some other precondition
    When some action by the actor
        And some other action
        And yet another action
    Then some testable outcome is achieved
        And something else we can check happens too

0

Sonunda sana kalmış. Fakat OOP, Yapısal veya Prosedür odaklı programlama gibi diğer metodolojilerden daha fazlasını yapmanın kesin bir yoludur. Prosedürel dokunuş problemlerinizi çözebilir, ancak OOP'yi takip ederek hayatı daha kolay bir hale getirebilirsiniz.

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.