Joe Armstrong'dan Muz Maymun Ormanı problemini açıklayan örnek kod [kapalı]


14

İşyerinde Kodlayıcılar kitabında Joe Armstrong şunları söyledi:

Yeniden kullanılabilirlik eksikliği işlevsel dillerde değil, nesne yönelimli dillerde geliyor. Çünkü nesne yönelimli dillerin sorunu, yanlarında taşıdıkları tüm bu dolaylı ortama sahip olmaları. Muz istedin ama sahip olduğun şey, muzu ve tüm ormanı tutan bir gorildi.

Burada tam anlamıyorum. Sorun bir muz almaksa, 'getBanana' fonksiyonunun arkasındaki tüm mantığı kapsülleyebiliriz. Maymun ve orman bu bağlamda nasıl yer alır. Birisi sorunu daha kolay anlatan bir kod parçacığı yazabilir mi, örneğin Banananesnenin Monkeyve Junglenesnelerin başlatılmasını gerektirdiğini gösterebilir mi, lütfen?



Yazık bu kapalı - bazı iyi tartışmalar veriyordu. Birinci sınıf fonksiyonlara başlangıç ​​olarak bakın.
Robbie Dee

1
@Eophoric Tartışma türü sorulara aslında izin verilir, ancak hangi soruların öznel olduğu ... öznel olabilir.
Robbie Dee

2
Bu röportajın Joe Armstrong doktora tezini yazmadan önce yapıldığına inanıyorum. Doktora tezini yazarken Armstrong, OO'nun gerçek tanımını öğrendi ve Erlang'ın aslında mevcut tüm ana dillerden tamamen nesneye yönelik olduğunu fark etti, Erlang muhtemelen en nesneye yönelik dil! Erlang'ın aslında bir OO dili olduğunu bilseydi bu ifadeyi bu şekilde yapmazdı. Onun hakkında konuştuğu şey, OO ile kesinlikle hiçbir ilgisi olmayan ortam otoritesidir .
Jörg W Mittag

1
Merhaba, sorum bana (ve diğerlerine) sorunu daha iyi anlamamıza yardımcı olan bazı örnek kodlar sağlamakla ilgili. Sorunu gösteren herhangi bir kod snippet'i yalnızca fikir değil kabul edilebilir.
Kha Nguyễn

Yanıtlar:


16

Gerçek OOP programlarının çoğunun endişelerin ayrılmasına saygı göstermediğini ima ediyor. Örneğin, sınıflarınız olabilir:

public class Banana
{
    public Monkey Owner {get;}
}

public class Monkey
{
    public Jungle Habitat {get;}
}

public class Jungle
{
}

Eğer kullanıyorsanız Banana, Monkeyve bağımlı olmak da geçici olarak gereklidir Jungle.

Ama kesinlikle bunun OOP ile ilgili bir sorun olduğunu ve bu işlevsel tarzın bir şekilde sahip olmadığını kabul etmiyorum. Bu, doğru soyutlamanın getirilmesiyle OOP'de kolayca düzeltilebilir.

Sorun daha çok endişelerin ayrılmasını önemsemeyen geliştiricilerle ilgilidir. Ve OOP programcılarının çoğunun acemi olduğunu iddia etmekten korkmam, işlevsel programcıların da kodlarını düzgün bir şekilde ayırmalarını motive eden bazı deneyimleri var.

Olası soyutlama şunlar olabilir:

public class Banana
{
    public IBananaOwner Owner {get;}
}

public interface IBananaOwner
{
}

public class Monkey : IBananaOwner
{
    public Jungle Habitat {get;}
}

public class Jungle
{
}

Bu şekilde, Bananabunun sahibi olduğunu biliyorsunuz , ancak olması gerekmiyor Monkey. Herhangi bir şey olabilir. Ve sahiple Bananayapabileceklerini sadece tarafından tanımlanan işlemleri sınırlar IBananaOwner, bu da akıl yürütmeyi basitleştirir.


Tersine, işlevsel diller kutunun dışında birinci sınıf işlevleri desteklerken - bu, X fonksiyonunun yan etkiler olmadan Y fonksiyonu tarafından güvenle tüketilebileceği anlamına gelmez.
Robbie Dee

Mükemmel bir noktaya değinseniz de, burada biraz pistten çıkabileceğinizi düşünüyorum. Alıntıda , kodun nasıl tasarlandığı değil çevreden açıkça bahsediliyor .
Robbie Dee

@RobbieDee Monkeyve Jungleiçin bir ortam Banana. IBananaOwnerÇevre gibi soyutlama getirerek çevre belirginleşir. Ve bu ortamın nasıl tasarlandığı probleminin temelini oluşturuyor.
Euphoric

Çok iyi doğru olabilir ama ben yardım yapamam ama okumak zorunda düşünmek bu odaya (başka bir hayvan eklemek için) fil sorunu fonksiyonel programlama, tarihsel olarak, sahip fonksiyonların doğru kompozisyonda olduğunu olduğunu diğer şeyler arasında kendini daha fazlasına ödünç verdi.
Robbie Dee

@RobbieDee Yazdıklarımı basit işlev kompozisyonuyla değiştiremezsiniz. En azından oyuncak örneği problemlerinin dışında değil. Uygulamada, OOP tasarımını tamamen değiştirmek için karmaşık jenerikler, tip sınıfları, monadlar ve diğerleri gibi şeyler gereklidir. Ve bu sadece bir tür karmaşıklığı başka bir tür için değiştiriyor.
Euphoric

13

Goriller maymun değildir!

Bunu bir kenara bırakarak, "getBanana" işlevinin arkasındaki tüm mantığı kapsülleyebiliriz "sorusunu yanıtlıyorsunuz . Tek istediğim bir muz, ama bunu elde etmek getBananaiçin bazı nesneler, örneğin Gorillasınıf örneği çağırmalıyım . Bu muz nesnesi muhtemelen ait olduğu gorile bir referans içerir ve bu goril nesnesinin ait olduğu ormana bir referansı olur. Bu yüzden bir muz istiyorum, ama bunun arkasında kapsüllenmiş tüm orman.

Bu aşırı bir örnek ve her zaman bu kadar kötü olmayacak. Ancak böyle bir OO sistemi ile karşılaşmak nadir değildir. Ve böylece, bu getBananayöntemi test etmek için tüm bir ormanı başlatmam veya alay etmeliyim.


1
Örnek kod olmadığı için bu soruya cevap vermiyor ...
Robbie Dee
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.