OOP, doğal olmadığı için zor mu?


86

Bir kişi sıklıkla OOP'un doğal olarak insanların dünya hakkında düşündüklerine karşılık geldiğini duyabilir. Ancak bu ifadeye kesinlikle katılmıyorum: Biz (ya da en azından ben) dünyayı karşılaştığımız şeyler arasındaki ilişkiler açısından kavramlaştırıyoruz , ancak OOP'un odağı bireysel sınıfları ve hiyerarşilerini tasarlıyor.

Günlük yaşamda, ilişkilerin ve eylemlerin çoğunlukla OOP'da ilgisiz sınıfların örnekleri olabilecek nesneler arasında bulunduğunu unutmayın. Bu tür ilişkilerin örnekleri: "ekranım tablonun tepesinde"; “Ben (bir insan) bir sandalyede oturuyorum”; "bir araba yolda"; "Klavyede yazıyorum"; "kahve makinesi suyu kaynatıyor", "metin, terminal penceresinde gösterilir."

İki değerli (örneğin, "Size çiçek verdim" de olduğu gibi üç değerlikli) fiillerin fiilde bir fiil sonuç / eylem üretmek için iki nesne üzerinde işlem yapan eylem (ilişki) olduğu fiilleri olduğunu düşünüyoruz. Odak eylem ve iki (ya da üç) [gramer] nesneleri eşit öneme sahiptir.

OOP ile bir nesneyi (isim) ilk bulmanız ve başka bir nesne üzerinde bir işlem gerçekleştirmesini istemeniz ile zıtlaştırın. Düşünme biçimi, isimler üzerinde çalışan eylemlerden / fiillerden isimler üzerinde çalışan isimlere kaydırılır - sanki her şey pasif ya da yansımalı bir sesle söyleniyormuşçasına, örneğin, "metin terminal penceresi tarafından gösteriliyor". Veya belki de "metin kendini terminal penceresine çekiyor".

Odak sadece isimlere kaydırılmamış, aynı zamanda isimlerden birine (gramer konusu diyelim) diğerinden (gramer nesnesi) daha yüksek "önem" verilmiştir. Bu nedenle birinin terminalWindow.show (someText) veya someText.show (terminalWindow) diyip söylemeyeceğine karar vermesi gerekir. Fakat neden insanlar gerçekten gösterdiği zaman (terminalWindow, someText) işlemsel sonuçlara neden bu kadar önemsiz kararlar yüklüyor? [Sonuçlar operasyonel açıdan önemsiz - her iki durumda da metin terminal penceresinde gösteriliyor - ancak sınıf hiyerarşilerinin tasarımında çok ciddi olabilir ve "yanlış" bir seçim kodlamada zor ve zor olabilir.]

Bu nedenle, OOP'yi (sınıf tabanlı, tek sevkıyatlı) yapmanın ana yolunun zor olduğunu, çünkü UNNATURALAL olduğunu ve insanların dünya hakkında ne düşündüğüne uymadığını iddia ediyorum. CLOS'tan gelen genel yöntemler benim düşünme biçimime daha yakın, fakat ne yazık ki, bu yaygın bir yaklaşım değil.

Bu problemler göz önüne alındığında, şu anda OOP yapmanın ana yolunun bu kadar popüler olması nasıl / neden oldu? Ve ne, eğer bir şey olursa, onu tahttan çıkarmak için yapılabilir mi?


OOP 'programlama' içindir, derleyicilerin eğlenmesi için yapılır. Gerçek dünyayı hiçbir şekilde modellemenin bir yolu değil. OOP öğretimi sırasında hayvan sınıfı ve dikdörtgen sınıfı gibi gerçek dünya örneklerinin kullanılması yaygındır, ancak bunlar sadece kavramları basitleştirmek için örneklerdir. Ne yazık ki, programlama dili ve paradigmalar evrimsel olmayan ve bilimsel olmayan bir biçimde 'gerçekleşir'. Birkaç istisna dışında, dil tasarım süreci genellikle az sayıda insanın en iyi tahmininin çocuğudur!
NoChance

3
“OOP'un odağı bireysel sınıflar ve hiyerarşileri tasarlıyor” iddiasına katılmıyorum. maybie olduğundan, OOP'nin belirli bir uygulamasının (odaklarının) odak noktasıdır, ancak örneğin dinamik OOP dillerinin genellikle büyük hiyerarşilere veya sınıflara sahip olmadığını buldum. Eh, ileride değişebilir cepten tanımı, hatta Nesne biri değiştirmek için bir dene var wcook.blogspot.com/2012/07/proposal-for-simplified-modern.html
Azder

1
OOP sistemdeki nesneleri tanımlamak ve bu nesnelere dayalı sınıflar oluşturmaktır. Diğer yoldan değil. Bu nedenle de “OOP'un odağı bireysel sınıflar ve hiyerarşileri tasarlıyor” duğuna katılmıyorum.
Radu Murzea


1
Bunun son derece öznel bir soru olduğunu düşünüyorum ve OOP hakkında ve “gerçek dünya” nın ne olduğu ve insanların problemler hakkında ne düşündüğü hakkında garip varsayımlarla doludur. Ve nihayet sordu "Peki, tahttan çıkarmak için bir şey yapılabilir mi?" bu da OP'nin bu konuda çok güçlü bir görüşü olduğunu gösteriyor. Programlama paradigmaları hakkında "dindar" iseniz, sanırım herhangi bir cevaba ihtiyacınız yok ... ne duymak istediğinizi zaten biliyorsunuz. İlk sorulduğunda bu soruyu bilseydim, muhtemelen kapatmak için oy kullanırdım ...
Simon Lehmann

Yanıtlar:


97

OOP bazı problemler için doğal değildir. Yani prosedür. Yani işlevsel. Bence OOP gerçekten zor görünecek iki sorunu var.

  1. Bazı insanlar programlamanın Tek Doğru Yolu ve diğer tüm paradigmaların yanlış olduğu gibi davranırlar. IMHO herkes bir çoklu paradigma dili kullanmalı ve üzerinde çalıştıkları alt problem için en iyi paradigmayı seçmelidir. Kodunuzun bazı kısımları bir OO stiline sahip olacaktır. Bazıları işlevsel olacak. Bazıları düz bir prosedür stiline sahip olacaktır. Tecrübe ile neyin paradigmanın neye göre daha iyi olduğu belli oluyor:

    a. OO genel olarak, faaliyet gösterdikleri devlete güçlü bir şekilde bağlı davranışlarınız olduğunda ve devletin gerçek niteliği bir uygulama detayı olduğunda en iyisidir, ancak bunun varlığı kolayca ortadan kaldırılamaz. Örnek: Koleksiyonlar sınıfları.

    b. Prosedür, belirli bir veriye güçlü şekilde bağlı olmayan bir sürü davranışınız olduğunda en iyisidir. Örneğin, belki ilkel veri tipleri üzerinde çalışırlar. Buradaki davranışı ve verileri ayrı varlıklar olarak düşünmek en kolayıdır. Örnek: Sayısal kod.

    c. İşlevsel olarak, herhangi bir devletin varlığının kolaylıkla soyutlanabilecek bir uygulama detayı olacağı şekilde, bildirimsel olarak yazması oldukça kolay bir şeyiniz olduğunda en iyisidir. Örnek: Harita / Paralelliği azaltın.

  2. OOP genellikle, iyi kapsüllenmiş kod parçalarına sahip olmanın gerçekten gerekli olduğu büyük projelerde faydasını gösterir. Bu başlangıç ​​projelerinde çok fazla olmuyor.


4
Bence sorudaki önemli bir nokta, OOP'nin doğal olup olmadığı değil, OOP'a ana yaklaşımın en doğal OOP yaklaşımı olup olmadığıydı. (İyi cevabı zaten.)
Giorgio

11
“OOP genellikle, iyi kapsüllenmiş kod parçalarına sahip olmanın gerçekten gerekli olduğu büyük projelerde faydasını gösterir.”: Ancak bu, OOP'un belirli bir özelliği değildir, çünkü zorunlu, işlevsel, programlama dilleri için de iyi modül kavramları vardır. .
Giorgio

2
OOP gerçekten prosedürel / işlevsel olandan farklı bir eksende; İşlemlerin nasıl tanımlanacağına değil, kodun nasıl organize edileceğine ve kapsülleneceğine bakar. ( OOP'yi her zaman bir yürütme paradigması ile eşleştirirsiniz. Evet, OOP + işlevsel dilleri vardır.)
Donal Fellows

1
OOP'un sadece prosedürel şeyleri koyduğumuz kutular olduğu söylenemez mi?
Erik,

OOP'de hala yöntemler yazabilirsiniz. OOP'yi Prosedürel programlamaya göre daha zayıf kılan şey nedir?
Mert Akcakaya

48

IMHO, kişisel zevkler ve düşünme biçimleri meselesidir. OO ile ilgili fazla sorunum yok.

Biz (veya en azından I) dünyayı karşılaştığımız şeyler arasındaki ilişkiler açısından kavramlaştırıyoruz, ancak OOP'un odağı bireysel sınıflar ve hiyerarşileri tasarlıyor.

IMHO bu pek de öyle değil, ancak ortak bir algı olabilir. OO teriminin mucidi Alan Kay, nesnelerin kendisinden ziyade nesneler arasında gönderilen mesajları her zaman vurgulamıştır . Ve mesajlar, en azından benim için, ilişkileri ifade ediyor.

Günlük yaşamda, ilişkilerin ve eylemlerin çoğunlukla OOP'da ilgisiz sınıfların örnekleri olabilecek nesneler arasında bulunduğunu unutmayın.

Nesneler arasında bir ilişki varsa, tanım başına, o zaman ilişkilidir. OO'da bunu iki sınıf arasında bir ilişkilendirme / toplama / kullanım bağımlılığıyla ifade edebilirsiniz.

İki değerli (örneğin, "Size çiçek verdim" de olduğu gibi üç değerlikli) fiillerin fiilde bir fiil sonuç / eylem üretmek için iki nesne üzerinde işlem yapan eylem (ilişki) olduğu fiilleri olduğunu düşünüyoruz. Odak eylem üzerindedir ve iki (veya üç) [gramer] nesnesi eşit öneme sahiptir.

Ama hala bağlamda iyi tanımlanmış rolleri var: konu, nesne, eylem vb. "Sana çiçek verdim" veya "Bana çiçek verdin" aynı değil ("Çiçek bana vermişti" deme): -)

OOP ile bir nesneyi (isim) ilk bulmanız ve başka bir nesne üzerinde bir işlem gerçekleştirmesini istemeniz ile zıtlaştırın. Düşünme biçimi, isimler üzerinde çalışan eylemlerden / fiillerden isimler üzerinde çalışan isimlere kaydırılır - sanki her şey pasif ya da yansımalı bir sesle söyleniyormuşçasına, örneğin, "metin terminal penceresi tarafından gösteriliyor". Veya belki de "metin kendini terminal penceresine çekiyor".

Buna katılmıyorum. IMHO İngilizce cümle "Bill, cehenneme git" bill.moveTo(hell)yerine program kodunu daha doğal okuyor move(bill, hell). Ve birincisi, asıl aktif sese daha benzer.

Bu nedenle, birinin terminalWindow.show (someText) veya someText.show (terminalWindow) diyip söylemeyeceğine karar vermesi gerekir.

Yine, terminalden bir metin göstermesini istemek veya metinden terminali göstermesini istemek aynı değildir. IMHO hangisinin daha doğal olduğu oldukça açık.

Bu problemler göz önüne alındığında, şu anda OOP yapmanın ana yolunun bu kadar popüler olması nasıl / neden oldu?

Belki de OO geliştiricilerinin çoğunluğu OO'yu sizden farklı görüyor olabilir?


15
Nesneler arasındaki mesajların Alan
Kay'dan

3
@zvrba, aslında, başka OO öncüleri de vardı, ama bu tartışma konusu değil. "En doğal şey, metnin gösterilmesini istemek." - Şimdi, OOP'de "doğal" olduğunu iddia ettiğiniz aynı pasif sesi kullanıyorsunuz.
Péter Török

5
@zvrba, 'her zaman bir şeyler "yapan" ajan "[...] vardır, yine de OO'nun bu ajanları (nesneleri) tanımlayıp adlandırma ve dilde birinci sınıf vatandaş olarak kullanma yaklaşımını protesto ettin. . Bana göre bu, problem alanını modellemenin bir parçası - bu işi yine de yapmanız gerekiyor, o zaman sonuçta elde edilen etki alanı modelini, dilinizin OO olmasına veya olmamasına bağlı olarak farklı bir şekilde kodlamak için eşleştirin.
Péter Török

6
@zvrba, kendi başına OO değil, farklı nesnelerin rolleri ve sorumlulukları hakkında karar veren bir geliştirici / tasarımcıdır. OO yaklaşımını kullanmak, iyi veya kötü etki alanı modelleri ve tasarımları sağlayabilir, tıpkı bir bıçak kullanmak size bir dilim ince ekmek veya kanayan bir parmak verebilir - yine de bıçağı suçlamayız, çünkü bu sadece bir araçtır. Ayrıca, modeldeki kavramların / nesnelerin / ajanların gerçek dünyadaki şeylerin soyutlamaları olduğunu ve yalnızca belirli "ilginç" yönlere odaklanarak her zaman sınırlı ve çarpık olduğunu unutmayın.
Péter Török

6
@zvrba, bir araba aslında kendi iradesiyle başlamaz - tıpkı bir Carnesnenin start()ancak yöntemi açıkça birisi tarafından çağrıldığında.
Péter Török

10

Bazı programcılar OOD'yi zor buluyor, çünkü programcılar, sorunun nasıl çözüleceğini değil, bilgisayarın sorunun nasıl çözüleceğini düşünüyor.

... ancak OOP'un odağı bireysel sınıfları ve hiyerarşilerini tasarlamaktır.

OOD bununla ilgili değil. OOD, işlerin nasıl davrandığını ve etkileşimde bulunduğunu bulmakla ilgilidir.

İki değerli (örneğin, "Size çiçek verdim" de olduğu gibi üç değerlikli) fiillerin fiilde bir fiil sonuç / eylem üretmek için iki nesne üzerinde işlem yapan eylem (ilişki) olduğu fiilleri olduğunu düşünüyoruz. Odak eylem üzerindedir ve iki (veya üç) [gramer] nesnesi eşit öneme sahiptir.

OOD'ye odaklanma, eylemlerin nesnelerin davranışları olduğu her zaman eylemdedir. Nesneler, davranışları olmadan hiçbir şey değildir. OOD'un tek nesne kısıtı, her şeyin bir şey tarafından yapılması gerektiğidir.

Bir şeyi yapan şeyin o zamandan daha önemli olduğunu düşünmüyorum.

Fakat neden insanlar gerçekten gösterilince (terminalWindow, someText) operasyonel sonuçları olmayan insanlara bu kadar önemsiz kararlar yüklüyor?

Bana göre farklı bir gösterimde aynı şey. Şovun kim ve şovun kim olduğuna hala karar vermelisin. Bunu öğrendikten sonra, OOD'da karar yoktur. Windows metin göster -> Window.Show (metin).

Dışarıda bir sürü şey (özellikle eski alanda), olmadığında OO olduğunu söylüyor. Örneğin, bir OOD inciri uygulamayan çok miktarda C ++ kodu vardır.

OOD, bilgisayarlar için bir problem çözmekte olduğunuz zihniyetten kurtulduğunuzda kolaydır. İş yapan şeyler için problem çözüyorsun.


10
OOD'u tam olarak sevmiyorum çünkü problemi nasıl çözeceğimi düşünmeyi tercih ediyorum. Bir problem alanının doğal dilini yabancı bir nesne dünyasına, mesajlara, mirasa vb. Nasıl çevireceğimi düşünmek istemiyorum. Doğal olarak varolmadıkları hiyerarşik taksonomileri icat etmek istemiyorum. Problemi kendi doğal dilinde tanımlamak ve mümkün olan en kolay şekilde çözmek istiyorum. Ve bu arada, dünya sadece "işleri yapan şeylerden" oluşmuyor. Gerçekliğe ilişkin görüşünüz son derece dar.
SK-mantık

7
@Matt Ellen, “şey” olmayan ve “herhangi bir şey” yapmayan müritlerin davranışını modelleyen programlar yazarım. Değiştirilemez herhangi bir varlık hiçbir şey yapmaz. Herhangi bir matematiksel saf fonksiyon hiçbir şey yapmaz - sadece bir setten diğerine bir haritalamadır ve bu dünya çoğunlukla bu tür fonksiyonlarla tanımlanır. Herhangi bir mantıksal formalizm hiçbir şey "yapmaz". Evet, OOD bana yardımcı olmayacak, çünkü çok, çok daha güçlü soyutlamalar ve modeller kullanabiliyorum. İlkel, sınırlı, sınırlayıcı bir OOD'ye geri dönmek beni ciddi şekilde engelleyecektir.
SK-mantık

2
@Matt Ellen, evet, dünyanın "bir şeyler yapan şeyler" veya "mesajlar aracılığıyla etkileşime giren nesneler" koleksiyonu olarak görülmesi gibi garip iddiaları destekleyen referansları görmek istiyorum. Tamamen doğal değil. Herhangi bir bilimsel teori atın (hepsi bu aşamada mümkün olduğu kadar gerçek dünyayı modellemeye yakın oldukları için) ve terminolojinizi kullanarak yeniden yazmaya çalışın. Sonuç sakar ve garip olacaktır.
SK-mantık

4
@ Antonio2011a'da, tüm olası sorun alanlarını etkin bir şekilde kapsayan tek bir programlama veya modelleme paradigması yoktur. OOP, fonksiyonel, veri akışı, birinci dereceden mantık, başka bir şey - hepsi sorun alanına özgü paradigmalar ve başka bir şey değildir. Ben sadece problem çözmedeki çeşitliliği ve açık fikirli yaklaşımı savunuyorum. Düşüncenizi tek bir paradigmaya indirgemek sadece aptalca. Evrensel bir yaklaşıma yakın şey, tek bir anlamsal çerçeve sizi sınırlayıcı değildir en.wikipedia.org/wiki/Language-oriented_programming
SK-mantık

3
@Calmarius, neden bilgisayarlar için programlamayı kolaylaştırıyor? Bu sadece saçma. Zor işi yapmak zorunda kalan insanlar.
Matt Ellen,

7

Belki, bir şey anlamadım ama:

OOP hakkındaki ilk kitabı okurken (90'ların başında, Borland'ın Pascal için ince el kitabı) Basitliği ve potansiyeli ile şaşırmıştım. (Daha önce Cobol, Fortran, Assembly dili ve diğer tarih öncesi şeyleri kullanıyordum.)

Benim için çok açık: bir köpek bir hayvandır, bir hayvanın yemesi gerekir, köpeğim bir köpektir, bu yüzden yemesi gerekir ...

Diğer taraftan, programlamanın kendisi doğal değil (yani yapay). İnsan konuşması yapaydır (beni suçlama, hepimiz dillerimizi başkalarından öğrendik, hiç kimse İngilizce'yi icat eden kişiyi bilmiyor). Bazı bilim adamlarına göre, insanın zihni ilk önce öğrendiği dil tarafından oluşturulmaktadır.

Kabul ediyorum, modern OO dillerinde bazı yapılar biraz garip, ama bu evrim.


1
Koboldan fortrana, sonra montaja (ve geri kalanına) geçmek için işin tam olarak neydi?
Rook

1
Yanlış sıra Aslında, Basic ile başlamıştım, sonra Fortran'a, ardından Assembly ve Cobol'a taşındım (evet, doğru sıra budur: ilk önce montaj). Hayatımdaki ilk bilgisayar “devasa” bir ana bilgisayardı, 256kB bellek, konsolunu daktilo yazdı, delikli kartlarla besledi, çünkü onun operatörüydüm. Sistem programcısı olacak kadar yükseldiğimde, PC-AT denilen şüpheli bir şey masama indi. Böylece GW-Basic, Turbo-Pascal, vb. Gibi yerlere dalmıştım.
Nerevar

1
Bununla ilgili değildim. İş alanınız için daha fazlası; çünkü COBOL (iş odaklı), fortran (bilimsel alan), assembler (daha fazla cs odaklı) ve daha sonra diğerleriyle uğraşan birçok insanı tanımıyorum. Yine de onların profesyonel programcılar olmaları ya da olmamaları.
Rook

1
Gizem yok: daha önce laguage yaklaşımıyla ilgili karar verilen takımlara ve projelere katılmak. Ve kullandıkları araçlarla ilgili önemsiz bir merak düzeyi.
Nerevar

6

Benim için zorlaştıran şeylerden biri, OOP'nin dünyayı modellemekle ilgili olduğunu düşünmekti. Bunu doğru yapmazsam, bir şey gelip kıçımda beni ısırır diye düşündüm (bir şey ya doğru ya da değil). Herşeyi taklit etmenin bir nesne ya da varlık olduğu sorunların farkındaydım. Bu beni OOP'ta programlama konusunda çok geçici ve güvende hissettirdi.

Sonra SICP'yi okudum ve veri tipleriyle ilgili olduğunu ve bunlara erişimi kontrol ettiğini anladım. Çözdüğüm tüm problemler, yanlış bir öncüllere dayanıyorlardı, OOP'da dünyayı modelleniyorsunuz.

Hala bu sahte öncülün bana verdiği (ve kendime nasıl bakmamı sağladığımı) verdiği büyük zorluklara hayret ediyorum.


Dünyayı modellemeye çalışmanın tehlikesine dikkat çektiğiniz için teşekkür ederiz.
Sean McMillan

4

Evet, OOP'un kendisi çok doğal değil - gerçek dünya tamamen hiyerarşik taksonomilerden oluşmuyor. Bazı küçük parçaları bu şeylerden oluşur ve bu kısımlar OO açısından yeterince ifade edilebilecek tek şeylerdir. Geri kalan her şey doğal olarak bu kadar önemsiz ve sınırlı bir düşünce tarzına uygun olamaz. Doğa bilimlerine bakın, gerçek dünyanın karmaşıklığını en basit veya en azından anlaşılabilir şekilde ifade etmek için kaç farklı matematik dilinin icat edildiğini görün. Neredeyse hiçbiri kolayca nesnelerin ve mesajların diline çevrilemez.


5
Bu, gerçek dünyayı tam olarak tanımlamaya çalışan her türlü biçimsel gösterim için de aynı şekilde geçerlidir.
Péter Török

1
@ Péter Török, kesinlikle benim açımdan. Her şeyi kapsayan tek bir formalizm yok. Hepsini korkutucu çokluklarında kullanmak zorundasınız. Dil odaklı bir programlamaya inanmamın nedeni bu - çeşitli, çoğu zaman uyumsuz formalitelerin sağlam bir kod varlığına adapte edilmesine izin veriyor.
SK-mantık

1
Her şey hiyerarşik taksonomilere ayrılabilir. Hile mantıklı olan şemalarla geliyor. Çoklu kalıtım çoğu zaman söz konusudur. Yazılım ve gerçek dünya arasındaki büyük fark, gerçek dünyada, kategorizasyon şemalarını sık sık çıkarmamız veya keşfetmemiz gerektiğidir; yazılımda onları icat ettik.
Caleb

1
"Hiyerarşik taksonomi" gibi bir terim kullanarak, miras almayı düşündüğünüzü düşünüyorum. Kalıtım hakkında gerçekten mantıklı olmak zordur. Bu yüzden insanlar miras üzerine kompozisyon kullanmayı öneriyor.
Frank Shearar

1
@ Frank: Mirasın sadece bir olduğu gerçek dünyada birçok hiyerarşik taksonomi türü vardır. Bunların hepsini doğru bir şekilde yapmak, OOP'den daha iyi araçlar gerektirir (örneğin, ontolojik akıl yürütme) ve bin yıl
yaratmasına

4

Biz (veya en azından I) dünyayı karşılaştığımız şeyler arasındaki ilişkiler açısından kavramlaştırıyoruz, ancak OOP'un odağı bireysel sınıflar ve hiyerarşileri tasarlıyor.

(IMO) 'dan sahte bir öncülden başlıyorsunuz. Nesneler arasındaki ilişkiler tartışmalı olarak nesnelerin kendisinden daha önemlidir. Nesneye yönelik program yapısı veren ilişkiler. Kalıtım, sınıflar arasındaki ilişki elbette önemlidir çünkü bir nesnenin sınıfı o nesnenin ne yapabileceğini belirler. Ancak, nesnenin sınıf tarafından tanımlanan sınırlar içinde gerçekte ne yaptığını belirleyen bireysel nesneler arasındaki ilişkiler ve dolayısıyla programın nasıl davrandığıdır.

Nesne yönelimli paradigma ilk başta zor olabilir, çünkü yeni nesne kategorilerini düşünmek zor değildir, ancak nesnelerin grafiğini düşünmek ve aralarındaki ilişkilerin ne olması gerektiğini anlamak zor, çünkü özellikle bu ilişkileri tanımlamanın yolu. Bu yüzden tasarım desenleri çok faydalı. Tasarım desenleri neredeyse tamamen nesneler arasındaki ilişkilerle ilgilidir. Desenler bize hem nesne ilişkilerini daha yüksek düzeyde tasarlamak için kullanabileceğimiz yapı taşlarını hem de bu ilişkileri tanımlamak için kullanabileceğimiz bir dil verir.

Aynısı, fiziksel dünyada çalışan yaratıcı alanlarda da geçerlidir. Herkes bir sürü odayı bir araya getirip bina diyebilirdi. Odalar bile en son düzenlemelerle tamamen döşenmiş olabilir, ancak bu binanın çalışmasını sağlamıyor. Bir mimarın görevi, bu odaları kullananların ve binanın çevresinin gereksinimlerine göre bu odalar arasındaki ilişkileri optimize etmektir. Bu ilişkileri doğru yapmak, bir binanın hem işlevsel hem de estetik açıdan çalışmasını sağlayan şeydir.

OOP'a alışmakta sorun yaşıyorsanız, nesnelerinizin nasıl bir araya geldiği ve sorumluluklarının nasıl düzenlendiği hakkında daha fazla düşünmenizi tavsiye ederim. Henüz yapmadıysanız, tasarım kalıplarını okuyun - muhtemelen okuduğunuz kalıpları gördüğünüzü fark edersiniz, ancak onlara ad vermeniz yalnızca ağaçları değil, aynı zamanda stantları, polisleri, çalılıkları görmenizi sağlar. ormanlar, korular, ormanlıklar ve nihayetinde ormanlar.


3

Bu sadece OOP ile ilgili sorunların bir kısmı.

Temel olarak, işlevler ikinci sınıf vatandaş olur ve bu kötüdür.

Modern diller (ruby / python) bu sorunla karşılaşmaz ve birinci sınıf nesneler olarak işlevler sağlar, ayrıca herhangi bir sınıf hiyerarşisi oluşturmadan programlar yapmanıza izin verir.


OOP benim için çok doğal görünüyor, aslında programlama görevlerini başka şekilde düşünmek benim için zor. Yine de yıllar geçtikçe, OOP'nin fiiller üzerindeki isimleri fazla vurgulama eğiliminde olduğunu anladım. 2006'daki bu rant, bu ayrımı anlamama yardımcı oldu: steve-yegge.blogspot.com/2006/03/…
Jim In Texas

3

OOP zor değil. İyi kullanılmasını zorlaştıran şey, programcıların rastgele makbuzlar duydukları ve ilahi Çetenin kutsamaları Martin Fowler’ın kutsamalarını almak için kendilerine, nefeslerinin altında kendilerine tekrar ettikleri, başka kim okuyorlarsa.


3

DÜZENLENMİŞ

Öncelikle, OOP'yi hiçbir zaman zor veya başka programlama paradigmalarından daha zor bulmadığımı söylemek isterim. Programlama doğası gereği zordur çünkü gerçek dünyadaki sorunları çözmeye çalışır ve gerçek dünya son derece karmaşıktır. Öte yandan, bu soruyu okuduğumda kendime şunu sordum: OOP diğer paradigmalardan “daha ​​doğal” mı? Ve bu nedenle daha etkili?

Bir keresinde bir makaleyi buldum (keşke tekrar bulabilseydim referans olarak gönderebilseydim), zorunlu programlama (IP) ve nesne yönelimli programlama (OOP) arasındaki karşılaştırmalı bir çalışma hakkında. Farklı projelerde IP ve OOP kullanan profesyonel programcıların verimliliğini temelde ölçtüler ve sonuçta büyük farklılıklar görmediler. Dolayısıyla iddia, iki grup arasında verimlilik açısından büyük bir fark olmadığı ve gerçekte önemli olan şeyin deneyim olduğu idi.

Öte yandan, nesne yönelimi savunucuları, bir sistemin ilk gelişmesi sırasında OOP'nin zorunlu olmaktan daha fazla zaman alabildiğini, uzun vadede kodun veriler arasındaki sıkı entegrasyon nedeniyle sürdürülmesinin ve genişletilmesinin daha kolay olduğunu iddia ediyor. operasyonlar.

Genelde OOP dilleri (C ++, Java) ile çalıştım, ancak bunları büyük projeler için hiç denememiş olmama rağmen, Pascal veya Ada kullanarak üretken olabileceğimi hissediyorum.

OOP ile bir nesneyi (isim) ilk bulmanız ve başka bir nesne üzerinde bir işlem gerçekleştirmesini istemeniz ile zıtlaştırın.

[kesmek]

Bu nedenle, OOP'yi (sınıf tabanlı, tek sevkıyatlı) yapmanın ana yolunun zor olduğunu, çünkü UNNATURALAL olduğunu ve insanların dünya hakkında ne düşündüğüne uymadığını iddia ediyorum. CLOS'tan gelen genel yöntemler benim düşünme biçimime daha yakın, fakat ne yazık ki, bu yaygın bir yaklaşım değil.

Bu son paragrafı daha dikkatli okuduğumda nihayet sorunuzun ana noktasını anladım ve cevabımı sıfırdan yeniden yazmak zorunda kaldım. :-)

Birden fazla nesnenin yalnızca bir mesaj yerine bir mesaj aldığı diğer OO önerileri biliyorum, yani bir mesaj alırken birkaç nesne simetrik bir rol oynamaktadır. EVET, bu bana daha genel ve belki daha doğal (daha az kısıtlayıcı) bir OOP yaklaşımı gibi geliyor.

Öte yandan, "çoklu gönderme", "tekli gönderme" kullanılarak kolayca simüle edilebilir ve "tekli gönderme" uygulaması daha kolaydır. Belki de bu, "çoklu gönderme" nin ana akım olmamasının bir nedenidir.


3

Sadece bir OOP paradigması aramayı bırak ve bazı JavaScript'i dene.

Şu anda, UI nesnelerimin olaya dayalı bir arabirim altında çalıştığı yerlerde çalışan bir programım var. Yani, ateş edildiğinde dahili olarak tanımlanmış bir eylemle sonuçlanan tipik bir kamu yöntemine benzeyen bir şeye sahip olacağım. Ancak kovulduğunda, gerçek olan şey, nesnenin kendisinde bir olayı tetiklemem ve o nesnenin içinde önceden tanımlanmış bir işleyicinin yanıt vermesidir. Bu olay ve başka herhangi bir dinleyiciye iletilen özellikleri ekleyebileceğiniz olay nesnesi, dinlemeye önem veren herhangi bir şey tarafından duyulabilir. Doğrudan nesneyi dinleyebilir veya bu olay türünü genel olarak dinleyebilirsiniz (olaylar, fabrika tarafından oluşturulan tüm nesnelerin dinleyebildiği genel bir nesnede tetiklenir). Mesela şimdi, açılan listeden yeni bir öğe seçtiğiniz bir seçimim var.

İsterseniz (ve genellikle istemediğimi keşfettiğimde şaşırdım - bu olayın nereden geldiğini göremediğinizde okunaklı bir meseledir) nesnenin tamamen ayrılmasını ve geçirilmiş bir olay nesnesi aracılığıyla bağlam oluşturabilirsiniz. Yine de, birden fazla yanıtlayıcıyı kaydedebilmeniz için hala tek bir gönderimden kaçıyorsunuz.

Ancak bunu yalnızca OOP ile yapmıyorum ve JS, bazı tanımlamalar ile çok komik bulduğum OOP 'düzgün' bile değil. Doğru, bence uygulama geliştirme seviyelerinin daha yüksek olması için, paradigmayı sizin durumunuz için ne işe yarayacaksa bükme gücüne sahip olmaktır ve eğer ilgilenirsek, sadece sınıfları taklit edebiliriz. Ancak bu durumda, işlevsel yönleri (geçen işleyicileri) OOP ile karıştırıyorum.

Daha da önemlisi, sahip olduklarım oldukça güçlüydü. Bir nesneye diğerine etki eden açıdan düşünemiyorum. Temel olarak nesnelerin neye değer verdiğine, bunları çözmek için ihtiyaç duydukları araçları vererek, sadece bir miksere bırakmalarını ve birbirlerine tepki göstermelerine izin veriyorum.

Sanırım söylediğim şudur: bu bir anahtar ifadesi bir sorun değil. Karıştır ve eşleştir. Sorun şu ki, herkesin aldatıcı bir şey olduğuna inanmanızı isteyen diller ve tuhaflıklar. Örneğin küçük bir java dev, OOP'yi her zaman varsayılan olarak doğru şekilde yaptıklarını düşündüklerinde OOP'yi nasıl gerçekten takdir edebilir?


2

Bana anlatıldığı gibi ekmek kızartma makinesi ve araba ile. Her ikisinde de yaylar var, bu yüzden bir "yay" nesnesine sahip olacaksınız ve farklı boyutlarda, güçlülüklerde ve her neyse, ama her ikisi de "yaylar" olacaktı ve sonra bu metaforu araca genişletecek, çok fazla tekerleğe sahip olsaydınız (Tekerlekler, açıkçası, direksiyon simidi, vb.)

Daha sonra programı bir nesneler listesi olarak düşünebilirsiniz ve daha sonra "Daha önce görmüş olduğunuz şeylerin bir listesi, bu yüzden daha önce gördüğünüz talimatların listesi gibi değil" görselleştirmek çok daha kolaydır.

Bence OOP ile ilgili asıl sorun insanlara nasıl anlatıldığı. Genelde (benim üniversite sınıflarımda) "Çok az şey yapan birçok sınıfla ilgili ve bunun dışında nesneler yaratabilirsin" diyerek açıklandığını görüyorum ve hepsi çok fazla insanın kafasını karıştırıyor, çünkü temelde soyut olanı kullanıyor Bu kavramları açıklamak için terimler, daha ziyade insanların 5 yaşındayken lego ile oynarken yakaladıkları somut fikirler.


2
Yaylar, hepsi benzer işlevleri yerine getiren milyonlarca formda gelir . Bunun işlevsel programlama için mükemmel bir örnek olduğunu söyleyebilirim.
l0b0

2

Kategorizasyonla dünyayı düşünmenin doğal yolu bu. Bu, OO'nun konusu hakkında az ya da çok. OOP zor, çünkü programlama zor.


Ancak, bazı nesnelerin ortak özelliklere mi yoksa ortak davranışlara mı sahip olduğuna göre sınıflandırıyor musunuz? Adı soyadı olan her şey bir insan mıdır? Hayvan yürüyen her şey mi?
zvrba

Sınıflandırma söz konusu olduğunda, belirli bir davranışı gerçekleştirebilmek bir niteliktir. Zebralar ve atlar üreyebilir, fakat yavrular bir melezdir. Aynı sonucu olmadıklarını bilmediğiniz sürece, çiftleşme işlevine sahip olma temelinde bu sonucu tahmin etmek çok zor.
JeffO

1
@zvrba: Yorumda sorulan soruya cevabım şudur it doesn't matter. Bir adı ve soyadı olan her şey, yalnızca insanları önemseyen her program için bir kişidir. İnsan bilgisi olmayan veya insan olmayan herhangi bir program için, bu bir IHasNameAndSurname. Nesneler sadece eldeki sorunu çözmelidir.
Tom W,

@Jeff O Aynı tür / cins / popülasyon içinde bile değişkenlik vardır ve ideal (temel) bir örnek yoktur. Bu yüzden, evet, OO doğanın aslında olduğu gibi değildir, ancak insanların doğal olarak nasıl düşündüğüne çok yakışır.
Tom Hawtin - tackline

2

İnsanların gerçeği temsil etmek için OOP kullanmaya çalıştıklarında bazı zorlukların geldiğini düşünüyorum. Herkes bir arabanın dört tekerleği ve bir motoru olduğunu bilir . Herkes bilir arabalar can olduğunu Start(), Move()ve SoundHorn().

Her zaman bunu yapmaya çalışmaktan vazgeçmem gerektiğini anladığımda kafamda bir ışık tıkladı. Bir nesne, onunla bir isim paylaştığı şey değildir. Bir nesne, problemin kapsamı ile ilgili verilerin yeterince ayrıntılı bir bölümüdür (yani olması gerekir). Bu oughtsorunun çözümü ne fazlası ne de daha az sahip olması ihtiyacı tam olarak ne var. Bazı davranışlardan sorumlu bir nesneyi yapmak, bazı kötü üçüncü şahısların (bazılarına 'poltergeist' diyebilir) aynı davranıştan daha fazla kod satırıyla sonuçlanırsa, poltergeist fişlerini kazanır.


1

Karmaşıklığı yönetmek için işlevselliği modüller halinde gruplamamız gerekir ve bu genel olarak zor bir sorundur. Kapitalizm hakkındaki eski deyişler gibi, OOP, denediğimiz her şey dışında, yazılımı düzenlemek için en kötü sistemdir.

İsimlerin içindeki etkileşimleri gruplandırmamızın nedeni, iki ismin hangisiyle gruplanacağı konusunda sıkça bir belirsizlik olsa da, isimlerin miktarının yönetilebilir büyüklükteki sınıflar için işe yaramadığı, ama fiillerle gruplamanın her iki üründe de üretim yapma eğilimi gösterdiğidir. tek seferlik gibi çok küçük gruplar veya gösteri gibi bir işlev için çok büyük gruplar . Miras gibi yeniden kullanım kavramları da adlara göre gruplanırken daha kolay sonuçlanır.

Ayrıca, pencereyle mi yoksa metinle gösterip göstermeyeceğine karar verme sorunu pratikte teoride olduğundan hemen hemen her zaman daha açıktır. Örneğin, neredeyse tüm GUI araç kitleri grubu kapsayıcı ile ekler , ancak widget ile birlikte gösterilir . Başka bir şekilde kod yazmaya çalışırsanız, neden soyut olarak düşünülse de, iki yöntem birbirinin yerine geçebilir gibi görünse de neden oldukça hızlı bir şekilde görünür.


2
Hiç gördünüz mü uygun modül sistemi? OOP'nin mevcut en iyi şey olduğunu nasıl söyleyebilirsiniz? SML modülleri çok, çok daha güçlü. Ancak, Ada paketleri bile küçük bir OOP ipucu olmasa da çoğu durumda yeterlidir.
SK-mantık

@ SK-mantık, aşırı kesin tanımlara takıldığınızı düşünüyorum. OOP ile sınıfları kastetmiyorum, mantıksal olarak "fiilleri" üzerinde çalıştıkları "isimlerle" gruplandırmayı ve bu fiilleri üzerinde çalıştıkları isimlere göre yeniden kullanıp uzmanlaşmayı kastediyorum. Sınıflar bunun en iyi bilinen uygulamasıdır, ancak tek uygulama değildir . SML modüllerinin cehaletini itiraf ediyorum, ancak baktığımda gördüğüm ilk örnek, işlevsel hale getirmek için sözdizimi değişiklikleri olan herhangi bir OO tasarım kitabından gelebilecek bir kuyruğun uygulanmasıydı.
Karl Bielefeldt

talihsiz bir OOP'a, kendisine ait olmayan bir şey için çok fazla kredi vermek adil olmaz. Modüller harika bir buluş. Birinci sınıf modüller harika. Fakat OOP'un onlarla hiçbir ilgisi yok. Bazı OOP dilleri modül özelliklerinden bazılarını (en önemlisi - ad alanlarını) benimsemiştir, ancak modüller sınıflardan çok daha genel ve güçlü bir konsepttir. Sınıfların gerçeklerden uzak olan "en iyisi" olduğunu söyledin. Birinci sınıf modüller çok daha iyi. Ve elbette, tip sistemleri alt tipleme özelliği ile sadece bir OO'dan çok daha geniş ve daha derindir.
SK-mantık

1
“Kapitalizm hakkındaki eski deyişler gibi, OOP, denediğimiz her şey dışında, yazılımı düzenlemek için en kötü sistemdir.”: Belki de yeterince uzun süredir denemiyoruz. :-)
Giorgio

1
Bence 'demokrasi' demek istiyorsun: quotationspage.com/quote/364.html
nicodemus13

1

Hayır . Problama kullanarak problem çözmenin birkaç yolu vardır: İşlevsel, Prosedürel, mantıksal, OOP, diğer.

Gerçek dünyada, bazen insanlar işlevsel paradigmayı, bazen de prosedürel paradigmayı vb. Kullanırız. Ve bazen karıştırdık. Ve sonunda onları belirli bir programlama stili veya programlama paradigması olarak temsil ediyoruz.

Ayrıca LISP'de kullanılan "her şey bir liste veya bir öğedir" paradigması da vardır. İşlevsel programlamadan farklı bir şeyden bahsetmeyi seviyorum . PHP, ilişkisel dizilerde bunu kullanır.

OOP ve "Her şey bir liste ya da öğedir" paradigmaları, bazı Yapay Zeka derslerinde hatırladığım gibi , DAHA DOĞAL DOĞAL programlama stillerinin 2'sidir.

Kulağa tuhaf geliyor, "OOP doğal değil", belki de öğrenme şeklin ya da OOP hakkında öğretilme biçimin yanlış, ama OOP'un kendisi değil.


1

Bu problemler göz önüne alındığında, şu anda OOP yapmanın ana yolunun bu kadar popüler olması nasıl / neden oldu? Ve ne, eğer bir şey olursa, onu tahttan çıkarmak için yapılabilir mi?

OOP popüler oldu çünkü programınızı, onu izleyen popüler prosedürel dillerden daha yüksek bir soyutlama düzeyinde organize etmek için araçlar sunuyor. Metotların içinde prosedürel bir yapıya sahip bir dil ve onları çevreleyen nesne yönelimli bir yapı oluşturmak da oldukça kolaydı. Bu, prosedürel olarak nasıl programlanacağını bilen programcıların OO prensiplerini birer birer seçmelerine izin verdi. Bu aynı zamanda bir ya da iki sınıfa sarılmış prosedürel programlar olan birçok isimsiz OO programına yol açtı.

OO'dan kurtulmak için, çoğu programcının bugün bildiği şeylerden (çoğunlukla prosedürle, biraz OO ile) tercih ettiğiniz paradigmaya aşamalı olarak geçişi kolaylaştıran bir dil oluşturun. Ortak görevler yapmak için uygun API'ler sağladığından emin olun ve iyi tanıtın. İnsanlar çok yakında kendi dilinizde yalnızca X-in-programlarını yapacaklar. O zaman, insanların gerçekten X yapma konusunda iyi olmalarının yıllar ve yıllar alacağını bekleyebilirsiniz.


OP, OO'nun genel olarak kötü olduğunu ve tahttan çıkarılmaması gerektiğini, ancak “halihazırda OOP yapmanın ana yolunun” en doğal olan olmadığını (“çoklu gönderim” ile karşılaştırıldığında) savunuyor.
Giorgio

OP ayrıca, en iyi OO programlarının arayüzlere ve kompozisyona daha fazla güvenme eğiliminde olduğu tip hiyerarşisini tanımlamaya aşırı odaklanmış görünmektedir. Birden fazla gönderme X ise, insanların birden fazla gönderme ile ilgili becerileri aşamalı olarak öğrenmelerini sağlayan bir dil yapmak, hala çevreyi değiştirmenin anahtarıdır.
Sean McMillan

1

OOP ve OOP dillerinin de sorunları olduğunu düşünüyorum.

Düzgün bir şekilde anlarsanız, OOP üzerlerinde basılabilen düğmelere (yöntemler) sahip siyah kutular (nesneler) hakkındadır. Sınıflar sadece bu kara kutuların organize edilmesine yardımcı olmak için orada.

Bir sorun, programcının basma düğmeleri yanlış nesneye koymasıdır. Terminal kendi üzerinde metin gösteremez, metin kendi üzerinde terminal gösteremez. Bunu yapabilen işletim sisteminin pencere yöneticisi bileşeni. Terminal penceresi ve metin sadece pasif bir varlıktır. Ancak, bu şekilde düşünürsek, çoğu varlıkların pasif şeyler olduğunun farkındayız ve aslında her şeyi (veya sadece bir tane: bilgisayarı ) yapan sadece çok az sayıda nesneye sahip oluruz . Aslında C'yi kullandığınızda, onu modüller halinde düzenlersiniz, bu modüller bu az sayıda nesneyi temsil eder.

Başka bir nokta, bilgisayarın sadece talimatları sırayla yerine getirmesidir . VCRBir Televisionnesneniz olduğunu varsayalım , nasıl video oynatırsınız? Muhtemelen böyle bir şey yazarsın:

connect(television, vcr);
vcr.turnOn();
television.turnOn();
insert(vcr, yourFavoriteCasette);
vcr.play();
while (vcr.isPlaying()) {} // Wait while the VCR is playing the casette.
vcr.eject();
vcr.turnOff();
television.turnOff();

Bu bu kadar basit olurdu, ama bunun için en az 3 işlemciye ( veya işlem ) ihtiyacınız olacak : biri sizin rolünüzü oynuyor, ikincisi VCR, üçüncüsü TV. Ama normalde sadece bir çekirdeğiniz var (en azından bütün nesneler için yeterli değil). Üniversitede, sınıf arkadaşlarımın çoğu, bir buton pahalı bir işlem yaptığında GUI'nin donma nedenini anlamadı.

Bu yüzden, nesne yönelimli bir tasarımın dünyayı oldukça iyi tanımlayabileceğini düşünüyorum, ancak bilgisayar için en iyi soyutlama bu değil.


0

Bakabilirsiniz DCI MVC deseni mucidi tarafından icat (veriler, içerik ve etkileşim).

DCI hedefi (Wikipedia'dan alıntılanmıştır):

  • Nesnelerin (adların) üstüne sistem davranışını birinci sınıf statüde verin .
  • Her ikisini de bir sınıf arayüzünde birleştirmek yerine, hızla değişen sistem davranışının (sistemin ne yaptığını), yavaşça değişen alan bilgisinin (sistemin ne olduğunu) kodundan temiz bir şekilde ayırmak.
  • Sınıf düşünme tarzından ziyade insanların zihinsel modellerine yakın olan bir nesne düşünme tarzını desteklemek.

İşte yazarlar tarafından iyi bir makale ve bazı kod görmek istiyorsanız işte küçük bir örnek uygulama (.NET) . Kulabileceğinden çok daha basit ve çok doğal hissettiriyor.


0

Bir kişi sıklıkla OOP'un doğal olarak insanların dünya hakkında düşündüklerine karşılık geldiğini duyabilir. Ancak bu açıklamaya kesinlikle katılmıyorum (...)

Onlarca yıldır kitaplarda ve başka yerlerde anlatıldığı için ben de aynı fikirde değilim. Yine de, Nygaard ve Dahl'ın bunu yapanlar olduğunu düşünüyorum ve zamanın alternatifleriyle karşılaştırıldığında simülasyon tasarlamayı düşünmenin ne kadar kolay olduğuna odaklandıklarını düşünüyorum.

(...) ancak OOP'un odağı bireysel sınıfları ve hiyerarşilerini tasarlamaktır.

Bu iddia, OOP'nin popüler yanılgılarının ne olduğu ve OO'nun tanımı için ne kadar hassas olduğu göz önüne alındığında makul bir alana girmektedir. Sahada on yılı aşkın bir süredir hem endüstri çalışması hem de prog üzerine akademik araştırma yapıyorum. diller ve size şunu söyleyebilirim ki, "mainstream OO" yu öğrenmeden yıllarca geçirdim, çünkü önceki yaratıcıların hedeflediklerinden ne kadar farklı (ve aşağı) olduğunu fark etmeye başladım. Konunun modern, güncel bir tedavisi için W. Cook'un son çabasına değineceğim:

"Nesne" ve "Nesneye Yönelik" in Basit, Modern Tanımları için Bir Teklif http://wcook.blogspot.com.br/2012/07/proposal-for-simplified-modern.html

Bu problemler göz önüne alındığında, şu anda OOP yapmanın ana yolunun bu kadar popüler olması nasıl / neden oldu?

Belki aynı sebepten QWERTY klavyelerin popüler olması ya da DOS işletim sisteminin popüler olmasının nedeni aynıydı. İşler, özelliklerine rağmen popüler araçlara biniyor ve kendileri popüler oluyor. Bazen, bir şeylerin benzer ancak daha kötü versiyonları gerçek şey olarak kabul edilir.

Ve ne, eğer bir şey olursa, onu tahttan çıkarmak için yapılabilir mi?

Üstün bir yaklaşım kullanarak bir program yazın. Bir OO yaklaşımı kullanarak aynı programı yazın. Eski olanın önemli olan her yönünden daha iyi özelliklere sahip olduğunu gösterin (hem sistemin kendisinin hem de mühendislik özelliklerinin). Seçilen programın alakalı olduğunu ve önerilen yaklaşımın, diğer program türlerine uygulandığında yüksek kaliteli özellikleri sürdürdüğünü gösterin. Analizinizde titiz olun ve gerektiğinde kesin ve kabul edilen tanımları kullanın.

Son olarak, bulgularınızı bizimle paylaşın.


-1

Java'yı alın: nesneler bir tür soyutlama darboğazıdır, çoğu "şey" nesnelerin kesinlikle alt bileşenleridir veya nesneleri alt bileşenleri olarak kullanırlar. Nesneler, bu iki şey arasında bir soyutlama katmanına yetecek kadar çok amaçlı olmalıdır - muti-amaç, somutlaştırdıkları tek bir metafor olmadığı anlamına gelir. Özellikle Java, kodları çağırdığınız / gönderdiğiniz tek katman nesneler (& sınıflar) yapar. Bu nesnelerin içerdiği şeyler, onları açıkçası çok fazla karmaşık kılar. Herhangi bir faydalı açıklaması bazı özel veya kısıtlanmış formlarla sınırlandırılmalıdır.

Kalıtım ve arayüz hiyerarşileri, nesneleri alt bileşenler olarak kullanan "şeyler" dir. Bu, nesnelerin genel olarak anlaşılmasını sağlamak için değil, nesneleri tanımlamanın uzmanlaşmış bir yoludur.

"Nesneler", "OO Langauge" de çok ya da daha az evrensel olan çok amaçlı bir soyutlama oldukları için birçok şeye sahip oldukları ya da oldukları söylenebilir. Yerel değişken durumu içermek ya da bazı dış dünya durumuna erişmek için kullanılıyorlarsa, o zaman bir "isim" gibi görünürler.

Buna karşılık, bir işlemi temsil eden bir nesne, örneğin "şifrelemek" veya "sıkıştırmak" veya "sıralamak", "fiil" gibi görünüyor.

Bazı nesneler isim alanı gibi rolleri için kullanılır, örneğin Java'da "statik" işlevini yerleştiren bir yer.

Java'nın nesne yöntemi çağrılarında çok ağır olduğu ve nesne üzerinde gönderme olduğu iddiasına katılmaya meyilliyim. Muhtemelen bu, gönderimi kontrol etmek için Haskell'in sınıf sınıflarını tercih etmemden kaynaklanıyor. Bu bir gönderme sınırlamasıdır ve Java'nın bir özelliğidir, ancak çoğu dilde ve hatta çoğu OO dilbilgisinde değildir.


-3

OOP hakkında birçok çevrimiçi tartışmaya tanık oldum ve katıldım. OOP savunucuları genellikle uygun prosedür kodunun nasıl yazıldığını bilmezler. Çok modüler olan prosedür kodunu yazmak mümkündür. Kod ve verileri ayırmak ve işlevlerin yalnızca kendi veri depolarına yazabilmelerini sağlamak mümkündür. Kalıtım kavramını usul kodu kullanarak uygulamak mümkündür. Daha da önemlisi, prosedür kodu daha ince, daha hızlı ve hata ayıklaması kolaydır.

Katı adlandırma kurallarına sahip tek dosya modülleri kurarsanız, prosedür kodu OO'dan daha kolay yazılır ve bakımı yapılır; aynı veya daha fazla ve daha hızlı şekilde yapılır. Unutmayın ki, uygulamanız çalıştığında, komut dosyanızda kaç tane sınıf özelliği olursa olsun, her zaman prosedüreldir.

Öyleyse, gerçekten Nesne Yönelimli olmayan ve çoklu devralma gibi şeyleri taklit etmek için kesmek isteyen PHP gibi diller sorununa sahipsiniz. Dilin yönünü etkileyen büyük çekimler PHP'yi başlangıçta hedeflediği şey için fazla büyük olan tutarsız kurallar ekine dönüştürdü. Geliştiricilere, prosedürel bir şablonlama dili olarak tasarlanan şeyler için devasa tapınak dersleri yazarken, yardım edemem ama gülümsemem.

Doğru yazılmış bir OO kodunu kötü yazılmış bir prosedür koduyla karşılaştırırsanız, her zaman yanlış sonuca varacaksınız. Çok az sayıda proje Nesneye Yönelik bir tasarım gerektirir. IBM iseniz ve birden fazla geliştirici tarafından yıllarca sürdürülmesi gereken büyük bir projeyi yönetiyorsanız, Object Oriented'e gidin. Bir müşteri için küçük bir blog veya alışveriş sitesi yazıyorsanız, iki kez düşünün.

Orijinal soruyu cevaplamak için OOP zordur çünkü gerçek hayattaki programlama ikilemlerini olması gerekenden 100 kat daha karmaşık olan çözümlere başvurmadan çözmez. Birçok programlama problemine en güçlü çözümlerden biri, küresel verilerin makul kullanımıdır. Yine de yeni dalga üniversite mezunları size büyük bir hayır-hayır olduğunu söyleyecektir. Dünya çapında mevcut olan veriler, sadece sakar bir programlama tavşanıysanız tehlikelidir. Sıkı bir kurallar diziniz varsa ve uygun adlandırma kuralları varsa, tüm verilerinizi global olarak elde etmekten kurtulabilirsiniz.

Herhangi bir Nesne Yönelimli programcının, maksimum 16 K hafıza için bir satranç oyunu uygulamasının montajcıya nasıl yazılacağını bilmesi zorunludur. Daha sonra yağın nasıl kesileceğini, tembelliğin nasıl azaltılacağını ve ustaca çözümler üretmeyi öğreneceklerdi.

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.