Nesneye yönelik programlama paradigması, modüler ve anti-paralel olduğu için modası geçmiş midir? [kapalı]


23

ÇŞB'de profesör olan Robert Harper tarafından yayınlanan birinci sınıf öğrencilere FP Öğretimine ilişkin tartışmalı makaleyi okudum . CMU'nun giriş dersinde artık nesneye yönelik programlama öğretmeyeceğini, “modern bir CS müfredatı için uygun olmadığını” iddia etti.

Ve o iddia etti:

Nesneye yönelik programlama tamamen giriş öğretim programından çıkarılmıştır, çünkü hem modüler hem de doğası gereği anti-paraleldir.

OOP'yi neden anti-modüler ve anti-paralel olarak düşünelim?



14
Buhwaaaah ?! OO, modülerliği ve paralellik işlemine göre daha kolay hale getirir ve FP'ye karşılıklı olarak dahil değildir. Beni karıştırarak renklendirin.
Matt Ellen

4
Müfredatlarını yeniden tasarladılar, bu nedenle yeni programı satmak zorunda kaldı ve kesinlikle hiçbir veri olmadan cesur iddialarda bulundu. Karmaşık fonksiyonel programların OOP emsallerinden daha paralel veya modüler olduğuna dair kanıt yoktur.
davidk01

4
@Matt Ellen: OOP, FP ile kesinlikle karşılıklı olarak dışlanacak. FP, birinin değişebilir durumun olmadığı birkaç temel kavram üzerine kuruludur. OOP, erişimi “nesneler” e sarılarak kontrol edilen değişken durumun varlığına dayanır. Değişken devlet ve değişmez devlet, tanım gereği karşılıklı olarak münhasır değildir. Evet, birçok OOP dili ile fonksiyonel bir tarzda programlayabileceğiniz doğrudur, ancak bu bir FP dili kullanmakla aynı şey değildir. Ve evet, tüm FP dillerinin saf olmadığı doğrudur. Bununla birlikte, FP'nin OOP ile uyumlu olduğu söylenemez.
SADECE MY DOĞRUDAN FAALİYET

2
@JUST: Size farklı bir karşılıklı münhasırlık fikrim var. Saf ve saf olmayan FP'yi FP'nin alt grupları olarak görüyorum ve bu nedenle, değişkenliğin OOP için gerekli olduğunu varsayıyorsanız, OOP FP'den karşılıklı olarak dışlanmaz. Ayrıca değişkenliğin OOP için gerekli olduğu konusunda hemfikir değilim. Mesaj geçişini kullanarak tamamen OO sistemini başarabilir ve hiçbir şeyi değiştiremezsiniz.
Matt Ellen

Yanıtlar:


30

Lütfen Harper'ın tanıtıcı bir CS müfredat sınıfı öğretme ihtiyacının gerçek yaşam projesinin gereksinimlerinden çok farklı olduğunu göz önünde bulundurun . Görevi, birinci sınıf öğrencilere temel kavramları (örneğin modülerlik, paralellik, indüksiyon) öğretmektir. Bu nedenle çok önemlidir, seçilen dilin (ve paradigmanın) bu kavramları mümkün olduğu kadar küçük bir törenle (sözdizimsel ve kavramsal) ifade edebilmesi çok önemlidir. Bilinenlik, araç desteği, mevcut kütüphaneler, yürütme performansı vb. Bu bağlamda tamamen önemsizdir. Lütfen aşağıdakileri göz önünde bulundurarak bunu aklınızda bulundurun ...

OO'nun anti-modüler olduğu görüşü , iyi tasarlanmış sınıfların nesnelerinin bile sona erme eğiliminde olduğu diğer sınıflara olan çok fazla bağımlılıktan kaynaklanmaktadır. Bu bir sorun - OO'nun savunucularının gözünde bile - son yıllarda Bağımlılık Enjeksiyonu çerçevelerinin , makalelerinin, kitaplarının ve blog yazılarının çoğalmasına baktığınızda netleşiyor (alayların ve saplamaların yükselişi de ilginçtir).

Başka bir ipucu, Tasarım Paternlerinin önemi ve bunları uygulamanın karmaşıklığı - diğer bazı programlama paradigmalarına kıyasla - örneğin Fabrikalar, Oluşturucu, Adaptör, Köprü, Dekoratör, Cephe, Komuta, İteratör, Arabulucu, Gözlemci, Strateji ve Şablon Yöntemi ve belki de Bileşik, bir şekilde OO kodunun modülerliğini geliştirmekle ilgilidir.

Kalıtım aynı zamanda problemlidir (örneğin Kırılgan Temel Sınıf Sorunu ) ve (alt tip) polimorfizm, değişikliklerin tüm kalıtım zinciri boyunca (yukarı ve aşağı!) Dalgalanabileceği çoklu sınıflar arasında bir algoritmanın uygulanmasını dökmek için birini baştan çıkarır .

Paralel olma suçlaması, hesaplamaya kıyasla devletin vurgusuyla ilgilidir (diğer bir deyişle, değişkenlik ve değişmezlik). İlki , devletin yönettiği yerin (yani, değişken değişkeninin bildirildiği yerin bulunduğu yer) hangi aktörlerin dışındaki aktörlerin (Harper's'ın paralelliğe bürünmesidir !) Bağımlılıklarını ifade etmeyi daha fazla içerir . zamanın hangi noktasında değiştirecek.

Değişmezlik ve hesaplama vurgusu, alt hesapların bağımlılıklarını ifade etmeyi çok daha kolay hale getirir, çünkü devlet yönetimi yoktur, sadece alt hesapların bağımlılıklarını ifade etmek istediğiniz yerde birleştirilen fonksiyonlar / hesaplamalar.


10
İşlevsel kamptan gelen paralellik iddiaları genellikle abartılıyor. İşlevsel diller için derleyiciler daha temiz bir temel teoriyle çalışır, bu nedenle uygulayıcılar makine koduna çevrilmeden önce kodu yeniden düzenlemenin daha fazla yoluna sahiptir, ancak bu, OO programcılarına paralellik için uygun soyutlamaları veremeyecekleri anlamına gelmez temiz paralel kod yazmak için. Şimdiye kadar prosedürel programcılar sadece kilitler ve iplikler kazandılar ve bu araçlarla oldukça iyi yaptıklarını düşünüyorum.
davidk01

2
Burada söylediğiniz her şeye genel olarak katılıyor olsam da, tasarım kalıplarının tüm programlama paradigmalarında geldiğini belirtmek isterim. İşlevsel programlama için, monad ve harita / azaltma gibi şeyleri işaret ediyorum.
Anm

@ davidk01 Örnek alın. Nesne yönelimli programlamayı destekler ve harika eşzamanlılık ilkelerine sahiptir. Daha da önemlisi, tamamen işlevsel olmadan eşzamanlı programlama için gerçekten işe yarıyor.
weberc2

19

Bu muhtemelen yapmak için cesur bir iddia, ancak bir şekilde şüpheliyim, bu Robert Harper hayatında gerçekten gerçek bir yazılım yazmadı. Tek endişe duyduğu tek şey ML ve statik tip sistemler. Olabilecek kadar büyük bir katkı olabilir, OOP ile ilgili iddialarının alaka düzeyine sahip olduğunu görmüyorum.

Bu makale tartışmalı değil. Tartışma inceleme, tartışma ve tartışmayı içerir. Burada sahip olduğunuz, herhangi bir argüman sunmaya zahmet etmeden, oldukça basit iki suçlamayı tek bir ifadeyle ortaya koyan cahil bir akademik.

  1. OOP'un anti-modüler olduğu iddiası tamamen saçma. Hatta, kendisine sadece hiçbir argümanlar verilmiştir nasıl cevap bilmiyorum ama aynı zamanda tasarım gereği OOP olan kapsülleme ve soyutlama yollarla bireysel modülleri arasında çok düşük kavramalı modülerlik kurmak için bir yaklaşım.

  2. OOP'nin anti-paralel olduğunu iddia etmek sadece bir anlayış eksikliği olduğunu gösteriyor. OOP, eşzamanlılık ile ilgili kararları kilitlemez. OOP yalnızca onları gizlemeyi tercih eder: Düzgün bir şekilde oluşturulmuşsa, bir nesnenin uygulamasının paralel olup olmadığını söyleyemezsiniz.
    Böylece sonuçta OOP ve paralel programlama dikeydir. Aktör modeli, eşzamanlılık için doğrudan bir nesne sistemine yansıtılabilen (ancak olması gerekmeyen) zarif bir modeldir ve her ikisinin de zorlu bir kombinasyonunu sağlar.

OOP ile ilgili sorun, çok az insanın Alan Kay'ın tanımladığı anlamda gerçekten anlaması .

  1. OOP bir yaklaşımdır. Bazı dillerde, kalıplar kullanılarak gerçekleştirilir, bazılarında ise yerleşik dil deyimlerini doğrudan kullanabilirsiniz (örn. Ruby, Objective-C, Smalltalk, Io ).
  2. Genel inanışın aksine, OOP sınıflarla ilgili değildir. Nesneler ve nesneler mesaj gönderme veya eşit derecede sızdırmaz bir kapsülleme ve soyutlama yöntemi ile ilgilidir.

Bu yüzden Java sivri uçlu çubukların deniz savaşı için kullandığı OOP'dir. Bu aynı zamanda “OOP dilleri” olarak adlandırılan diğer birçokları için de geçerlidir, ancak Java ile ilgili olan şey, Üniversitelerde Java'nın OOP öğretmek için kullanılması gerektiğine dair yaygın bir inanç olduğu görülmektedir.

Java ile OOP tanıtımı için CS müfredatından çıkarılması gerektiğini düşünenlerin hepsine katılıyorum . Ayrıca, açıkça OOP konusunda temel bir anlayışa sahip olmayan kişilerin bunu öğretmemesi gerektiğini düşünüyorum. Bu yüzden, Bob kurslarına ML'ye yapışırsa ve basitçe neyin sağlam bir anlayışa sahip olduğunu öğretirse daha iyidir.
Şu anda OOP, insanların her şeye bağlı kalmayı sevdiği daha çok modaya uygun bir görgü kuralları. Bu OOP'a zarar verir ve insanlara söyler. OOP modası geçmiş değil. İnsanlar sonunda buna ne olduğu hakkında ne olduğunu anlamak zaman Oop altın çağ, henüz gelmek değil yaklaşık (örneğin anahtar sözcüğünü kullanarak mümkün olan her problem çözme class500 kez).


1
İleti iletimi için +1 ve 'Java ile' için +1. Ne yazık ki, Java'yı kaldırırlarsa, sadece C # ile değiştirir ve eskilerine devam ederler.
gbjbaanb

@ eleştirmenler için back2dos +1, Java için -1. Kuşkusuz, Smalltalk Java'dan "çok daha fazla OO" dür, fakat kim kullanıyor? Objective-C, tıpkı C gibi yeni başlayanlar için zordur.
maaartinus

@maaartinus: Eğer sorunuza cevap veriyorsa, eğitim ve akademik alanda yaygın olarak kullanılacak Squeak bulacaksınız. Ayrıca Java'da olduğu gibi: Hoşunuza gidebilir, beğenmeyebilirim. Kahve gibi, bu kişisel tercih meselesi ve bunu tartışmanın bir anlamı yok. Bununla birlikte, Java'nın OOP'a giriş için uygun olmaması, IMHO’nun Java’nın doğası ve OOP kavramının yadsınamaz bir sonucu olduğunu ve tam olarak söylediğim şey bu. Java'nın popülerliği bunu ortadan kaldırmayacak. C gelince, joelonsoftware.com/articles/ThePerilsofJavaSchools.html sayfasını okumanı öneririm .
back2dos

@ back2dos Squeak bu bölgelerde kullanılabilir, ancak üniversitede ML öğrendim. Her ikisi de sektörde eşit derecede kullanılamaz ve kavramları nedeniyle her ikisi de öğrenmeye değer. Sivri makalesi Joel'in okuduğum en kötü makale, çok uzun ve ilk bakışta mesaj segfaults ile başa çıkmanın önemi gibi görünüyor. : D OOP öğretmek için hala Java'yı önerebilirim.
maaartinus

@maaartinus: Üniversitede öğrendiklerin , ne öğretilmesi gerektiği sorusunda çok az önemli . OOP'u öğretmek için neden Java kullanması gerektiğine dair hiçbir neden vermediniz, ben de yapmamam için oldukça sağlam bir neden olduğunu düşündüğüm şeyi verdim. Ayrıca, makalenin özünü açıkça anlamada başarısız oldunuz: C ile benzer derecede zor sorunlarla başa çıkamayan insanlar, CS'yi ilk önce incelememeliler. Bence CS, bilgisayarlardan hoşlanan her çocuğun anlayabileceği şeylere sadık kalmamalı. Bu konuda hemfikir değilsek, daha sonra tartışmak zamanın ve benim zamanından ibaret.
back2dos

12

Her çizgiden zealot alırsın.

Nesneye yönelik programlama gümüş bir kurşun değildir. Asla olmadı. Nedir, bir yutturmaca kurbanı. Kaçınılmaz olarak, insanlar yutturmacadan bıktılar ve (paradigmanın asıl faydası ne olursa olsun) bir boşluk ortaya çıkmaya başladı.

Bundan yirmi yıl sonra hiç şüphesiz fonksiyonel programlamaya karşı başka bir ters tepkimiz olacak.


1
Zaten var!
quant_dev

1
++ "Her çizgiden zealot alırsın." Ben bir akademisyen oldum ve deneyimim buydu . Akademisyenler, belki de öğrencilerini etkilemek için kışkırtıcı görüşlere boyun eğmeyi sever.
Mike Dunlavey

5

Bu soruya tam olarak cevap veremem, çünkü yazarın belirsiz düşüncelerini sadece ikinci bir tahmin edebilir. Bu makalenin, yazarının biraz utanmasına neden olacağı konusunda şüpheliyim. OOP ile ilgili olarak ne modüler ne de paralel olmadığını gösteren hiçbir şey yoktur:

Modülerlik : OOP'nin ana yüzü, aslında modüler olmasıdır (ancak modülerlik, farklı bağlamlarda farklı şeyler ifade eder). Bu nedenle, yazarın genelleme veya statik programlama hakkında konuşup konuşmadığından bağımsız olarak yanlıştır.

Paralelleştirme : Paralel programlama gelince, çoğu çerçeve iş parçacılığını daha sonra kesmeler destekledi ve şimdi .Net framework 4.0 ve üzerine cıvatalanan OOP dillerinde gördüğümüz gibi düzgün paralellik sağladı.

Yazarın, işlevsel programlamanın ve OOP'un kullanımda karşılıklı olarak dışlandığına dair bir yanlışlık olduğu konusunda bir moda kurbanı haline geldiğinden şüpheleniyorum. OOP dillerinde iyi belgelenen fonksiyonel stiller vardır, örneğin Oliver Sturm bu alanda yayınlamıştır.


4

Yazar, OOP’un yeni başlayan programcıların anlayabilmesi için çok zor olduğunu, bunun doğru olabileceğini düşünüyor - buna rağmen, CMU’nun giriş şartlarını göz önünde bulundursam da! Anti-modüler ve anti-paralel ifadeler, tamamen işlevsel dillerle karşılaştırıldığında dar bir bağlamda doğru olabilir, ancak tüm paradigmanın kınanması pek de mümkün değildir (bu, onu kullanmayı bilenler için gayet iyi çalışıyor gibi görünüyor).

Önerilen müfredat bir sınıfta işlevsel programlama, başka bir sınıfta zorunlu (prosedürel) programlama ve başka bir sınıftaki veri yapılarını öğretecektir. Bir birinci sınıf öğrencisi bu 3 konuda ustalaştığında, OOP öğrenmeye hazır olmalıdır.

Şahsen bence bu aşırı, ama akademisyenler yeni ve aşırı şeyler denemekten hoşlanıyor. Karşılaştırma yapmak için MIT, birinci sınıf bir sınıftaki tüm büyük programlama paradigmalarını öğretir (ve hala yapabilir).

İşin garibi, her iki okul da gerçekten iyi programcılar üretti. Git figü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.