“OOP devleti gizler” ile kastedilen nedir? [kapalı]


11

Gelen cat-v.org birçok anti-cepten rants biri Joe Armstrong tarafından bir geçit bunlardan biri şu oldu, nesne yönelimli programlama karşı çeşitli itirazlarda bulundu:

İtiraz 4 - Nesnelerin özel durumu vardır

Devlet tüm kötülüklerin köküdür. Özellikle yan etkileri olan fonksiyonlardan kaçınılmalıdır.

Programlama dillerinde devlet arzu edilmezken, gerçek dünyada devlet boldur. Banka hesabımın durumuyla çok ilgileniyorum ve bankamdan para yatırdığımda veya çektiğimde banka hesabımın durumunun doğru bir şekilde güncellenmesini bekliyorum.

Devletin gerçek dünyada var olduğu düşünüldüğünde, programlama dili devletle başa çıkmak için hangi olanakları sağlamalıdır?

OOPL'ler “devleti programcıdan sakla” der. Durumlar gizlidir ve yalnızca erişim işlevleri aracılığıyla görünür. Geleneksel programlama dilleri (C, Pascal), durum değişkenlerinin görünürlüğünün dilin kapsam kuralları tarafından kontrol edildiğini söyler. Saf bildirici diller devletin olmadığını söylüyor. Sistemin küresel durumu tüm işlevlere taşınır ve tüm işlevlerden çıkar. Monadlar (FPL'ler için) ve DCG'ler (mantık dilleri) gibi mekanizmalar, durumu programcıdan gizlemek için kullanılır, böylece “durum önemli değil” gibi programlayabilirler, ancak bunun gerekli olması durumunda sistemin durumuna tam erişime sahiptirler.

OOPL'ler tarafından seçilen “durumu programcıdan gizle” seçeneği mümkün olan en kötü seçimdir. Devleti açığa vurmak ve devletin sıkıntısını en aza indirmenin yollarını bulmaya çalışmak yerine devleti gizlerler.

Bununla tam olarak ne kastediliyor? Çok az düşük seviyeli ya da prosedürel deneyime sahibim, çoğunlukla OOP, bu yüzden muhtemelen buna ne kadar aşina olduğumu açıklıyor. Ve daha modern bir bakış açısıyla, şimdi Nesneye Dayalı histerinin çoğu geçtiğine (en azından anlayabildiğim kadarıyla), sizler pasajın ne kadar doğru / alakalı olduğunu düşünüyorsunuz?

Yardımın için teşekkürler.


3
Önerilen okuma: Bu $ {blog} tartışın
tatarcık

1
Bana sorarsanız, bağlantı verdiğiniz makale birkaç zayıf argüman yapar (yazının kalitesinden bahsetmiyorum). Söylemesi gerekenlere fazla stok koyamazdım.
Benjamin Hodgson

1
Bah. Giderek daha fazla bu "değişmez" şeyin dinin kokuşmasına başlayan iyi bir fikir olduğunu düşünüyorum.
Rob

3
Joe Armstrong, OO'ya yönelik itirazlarının OO'nun tam olarak ne olduğunu yanlış anlamaya dayandığını açıkça kabul etti. Şimdi Erlang'ın aslında derinden nesne yönelimli bir dil olduğunu fark etti (aslında, ana kullanımdaki en nesne yönelimli dil olabilir).
Jörg W Mittag

9
Bunu genişletmek için: Joe Armstrong'un rantının archive.org'un ilk yakalanması Nisan 2001'den geldi. Joe tezini 2003'te yazdı. Tezini yazarken OO hakkında çok şey öğrendi ve OO'nun bir şekilde değişebilir durumla ilişkili olduğu ile ilgili yaygın yanlış kanı (değişmez durum tamamen diktir). O zamandan beri, OO eleştirisinin yanlış olduğunu ve ironik bir şekilde Erlang'ın aslında nesne yönelimli bir dil olduğunu (mesajları var, süreçleri çağırdığı nesneleri, kapsüllemesi olduğunu) kabul etti.
Jörg W Mittag

Yanıtlar:


32

Bununla tam olarak ne kastediliyor?

Bu bağlamda, OOP'nin bir programın durumunu programcıdan gizleyerek ancak yine de (sızdıran) erişim yöntemleriyle görünür hale getirerek gizlediği anlamına gelir. Argüman, devleti gizleyerek, çalışmayı daha zor hale getirir ve daha fazla hataya yol açar.

pasajın ne kadar doğru / alakalı olduğunu düşünüyorsunuz?

Alakalı ama yanlış yönlendirilmiş olduğunu hissediyorum. Sınıfınız devlet kavramını dış dünyaya sızdırıyorsa kesinlikle bir sorun vardır. Sınıfınız devleti dış dünya tarafından manipüle edilmesi gerektiğinde gizlemeye çalışırsa kesinlikle bir sorun vardır. Bu bir bütün olarak OOP'un başarısızlığı değil, sınıfın bireysel tasarımı ile. Devletin gizlenmesinin bir sorun olduğunu söyleyemem - monadlar bunu her zaman fonksiyonel programlamada yaparlar.

En iyi durumda, OOP işlevsel programlama ve prosedürün en iyi karışımı gibi çalışır - insanlar sınıfı "devlet önemli değil" gibi kullanabilirler çünkü sınıfın değişmezlerini korumak için kullanılan özel devlet gizlidir, ancak özgürlüğü vardır ayrıntıları soyutlayan sınıfın iyi tanımlanmış bir kamu devletini kullanmak.

OOP, insanların bu en iyi vakaları başarmasını zorlaştırıyor mu? Muhtemelen. "Java okulları" ve tüm Şekil / Daire / Dikdörtgen veya Araba Tekerlekler okul OO öğretmek muhtemelen yaklaşımın kendisinden daha fazla suç var. Modern OOP, işlevsel programlamadan biraz zaman alır, değişmeyen nesneleri ve saf işlevleri teşvik ederken, iyi çalışan sınıfları tasarlamayı kolaylaştırmak için kalıtımdan vazgeçirir.


3
Bütün "java okulları" biraz yürekten katılıyorum, bunu hiç sevmiyorum heh. Çok teşekkür ederim, yapabilirsem oy verirdim.
Jake

2
Kesin olarak söylemek gerekirse: Monadlar genel olarak devleti gizlemez, bazı monadlar yapar (örn. IO). Diğerleri arasında stackoverflow.com/questions/2488646/…
thSoft

2
+1. Bu, ankete katılan kişinin bağlantılandırdığı makaleden çok daha dengeli ve incelikli bir analizdir
Benjamin Hodgson

2
Joe Armstrong, OO'ya yönelik itirazlarının OO'nun tam olarak ne olduğunu yanlış anlamaya dayandığını açıkça kabul etti. Şimdi Erlang'ın aslında derinden nesne yönelimli bir dil olduğunu fark etti (aslında, ana kullanımdaki en nesne yönelimli dil olabilir).
Jörg W Mittag

2
Jorg - Joe'nun takibine bir bağlantı gönderebilir misin? Okumak gerçekten çok isterdim. Ve @radarbob, hemen!
user949300

2

Tek bir açık "sahip" olmayan değişebilir durum parçaları varsa, bir sistem hakkında akıl yürütmek zor olacaktır. Bu, nesnelerin asla değiştirilebilir bir duruma sahip olmaması gerektiği anlamına gelmez, bunun yerine değişken duruma sahip olan nesnelerin, mülkiyetin belirsiz olabileceği şekillerde kullanılmaması ve tersine, mülkiyeti izlemeden serbestçe aktarılması gereken nesnelerin değişmez olmak.

Pratikte, verimli programlama sık sık bazı nesnelerin değişken duruma sahip olmasını gerektirir; bununla birlikte böyle bir durum paylaşılmayan işçi nesneleri ile sınırlandırılmalıdır . .NET'te IEnumerable/ IEnumeratorarabirimlerini göz önünde bulundurun : bir koleksiyon uygulanırsa IEnumerable, öğelerin tek tek okunmasına izin verir. Bir koleksiyonu okuma işlemi, genellikle hangi öğelerin okunduğunu (değiştirilebilir bir parça) takip etmeyi gerektirir, ancak bu durum bir uygulamanın içinde yer almaz IEnumerable. Bunun yerine, öğelerin koleksiyondan okunmasına izin vermek için yeterli durumu içeren ve içeren bir nesneyi döndürecek IEnumerablebir yöntem sağlar . Ancak nesnenin böyle bir durumu içermesi sorun yaratmaz,GetEnumeratorIEnumeratornesne uygulama IEnumeratorpaylaşılmazsa .

Çoğu durumda en iyi desen, serbestçe paylaşılan ancak asla değiştirilmeyecek (en azından paylaşıldıktan sonra değil) ve net bir sahibi olan ve bu sahip tarafından serbestçe değiştirilebilen nesnelerin bir karışımını kullanmaktır. , ancak hiç kimseyle paylaşılmaz.


Değişmez olması gereken ile değişebilir duruma sahip olabilen arasında mükemmel bir ayrım. Bunu okurken, daha yeni nesne grafiklerimin (eskisinden daha değişmez) temelde bu kılavuzu sizin yaptığınız kadar net bir şekilde belirtmeden takip ettiğini fark ettim. Bu bazen duymak "değişebilir durumu her zaman kötü" hogwash için iyi bir orta panzehir olduğunu.
Mike

@Mike: Asıl sorun, Java ve .NET'teki tüm nesne referanslarının tamamen karışık olmasıdır; bir nesneye referans alan veya bu nesneye referans alan herhangi bir kod, herhangi bir kısıtlama olmaksızın onu başka bir kodla paylaşabilir. Her iki çerçeve de paylaşılamaz bir referans alanı kavramına sahip değildir; .NET'teki yapılar ve byrefs yakınlaşır, ancak yapabilecekleri veya dış kodun yapmasını engelleyebilecekleri açısından oldukça sınırlıdır. Her durumda, değişebilir durumla ilgili temel bir söz söyleyeceğim: 00:
57'de

... gerçek dünyadaki bir nesnenin bugünkü durumu ve nesnenin saat 12: 57'de sahip olduğu durum. Nesnenin gerçek dünya durumu değişirse, bir nesnenin her ikisini de temsil etmesi artık mümkün olmayacaktır. Bazen nesnenin 00: 57'lık durumu ve bazen de mevcut durumu temsil etmeye devam etmesi gerekebilir. Ancak, 12:57 durumu ile mevcut durum arasındaki ilişki, mevcut durum değişirse, bu durumda kalamaz.
supercat

0

Soruyu cevaplamanın ötesine geçme riski altında, OOP fikrindeki kusurları görmek kolaydır, ancak bir fikrin gücünün istismar edilebilme yeteneğine yansıdığını düşünmeye eğilimliyim.

Sonuçta, herkesin "çok çok güçlü" gibi tanımladığı en sevdiği dil var, yani gerçekten çok hoşlanıyorlar . Ancak, hesaplamalı evrensellik harikası, bir dil ne kadar görkemli olursa olsun, gerçekten güçlü olursa montaj dilini simüle edebilir. Ve eğer yapabilirse, birisi bunu görür. (Montaj dili ile ilgili bir sorun olmadığı için değil.)

OOP bandwagonu hakkındaki kişisel hislerim, insanların yazılım mühendisliği / bilgisayar bilimleri eğitimini engellediğini gösteriyor. Veri yapısı ile ilgili olduğunu düşündükleri bir seviyede bodur durumdalar. Sınıflar, kalıtım, kaplar, yineleyiciler, karma haritaları, özellikler, durum gizleme , vb. - tüm veri yapısı hakkında - daha fazla merhamet.

Şahsen insanların dilsel olarak onlara bakarak problemleri çözmeyi öğrenecekleri bir sonraki seviyeyi görmek istiyorum. Etki alanına özgü diller kavramını anlayacakları yerde, bunları nasıl kolayca oluşturabilecekleri ve yaratılmalarının problem çözmenin ayrılmaz bir parçası olmasına izin verecekler. Bu bir veri yapısı olduğunu söylemek yanlış değil ise bir dil. İnsanlar bu dil tasarımı becerisine sahip olmalı, bu yüzden sadece onunla uğraşmıyorlar.

Sonra bir sonraki seviye olarak yapay zekanın yeniden canlandığını görmek istiyorum. Programcıların baytların, iş parçacıklarının ve sanal işlev tablolarının ve CUDA'ların ötesine geçtiğini ve makinelerin akıl yürütme, öğrenme ve yaratma yoluna gitmelerini görmek istiyorum. Bu alanın küçük köşelerinde çok ilerlediğini biliyorum, ama yeterince geniş bir yerde yok.


1
"Eğer gerçekten güçlü ise montaj dilini simüle edebilir" - powerfulorada tanımını takas . Diğerleri söylediğinde powerful, programcıların soyutlamaya ne kadar iyi izin verdiğinden bahsediyorlar , bu da hesaplama gücünden farklı bir hikaye .
Phil

@Phil: Özet bu kelimelerden bir diğeri :)
Mike Dunlavey

Hayır. Sen kelimeler hakkında konuşuyordun. Fikirler hakkında konuşuyordum. Kelimenin 2. ve 3. kullanımınız powerfarklı şeyler ifade eder. Lütfen yanıltmayın.
Phil

Btw, eğer ilgileniyorsanız, 4. paragrafınızda söylediğiniz yaklaşıma biraz yakın olan Racket'e göz atın (programcıların dilini problemlerini dilin sabit yapılar kümesi). Klasik Lisp / Scheme'in ötesine geçer, tıpkı herkes ona ilk bakarken bu izlenime sahip olması durumunda.
Phil

0

Erişilebilirlik OOP'un bir özelliği değildir, Java ve Microsoft dotNET gibi uygulamalara özgüdür. OOP'yi tanımlayan ana özellik polimorfizmdir.

Her neyse, nesne durumunu gizleyerek anlamlı bir API oluşturmanın bir yolu yoktur. Sunum, gerçek dünyadaki OOP'nin hayati bir bileşenidir. Kabul etmeyenler muhtemelen yazılım endüstrisine karşı akıl dışı bir düşmanlığa sahipler, bu da görüşlerini benim görüşümden ilgisiz kılıyor.

Bağladığınız gibi web siteleri, son derece katı düşünceler ve yeni teknolojiyle ilgili eleştirilerle ünlüdür. Bazı insanlar anlamıyor.


Modellediği kavramın değişmezlerini korumak için bir nesne olmalıdır. Sunum tamamen ayrı bir endişe kaynağıdır ve aynı nesne tarafından verimli ve sürdürülebilir bir şekilde ele alınamaz, çünkü bir nesne zaman ve mekan içinde sunulabileceği çeşitli yolları anlayamaz. Hedefiniz çok yönlü ve bakım yapılabilir nesneler olduğunda sunum, olay akışı ve gerçekleşen görünümler gibi başka bir mekanizma yoluyla ele alınmalıdır. Bir nesnenin değişmesi gereken tek zaman, kavramının revize edilmesi veya değişmezlerinin değişmesidir.
Andrew Larsson
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.