Fonksiyonel programlar nasıl organize edilir [kapalı]


41

Olası Kopya:
İşlevsel Programlama - OOP İşlevsel programlama ile
yönetilebilir kod nasıl yazılır?

OOP’da, kod için temel kuruluş biriminiz sınıftır. Java, C # ve benzeri dillerde sıkça kullanılan bir metodoloji, sınıf adınızı izleyen dosya adıyla her sınıf için bir dosya bulundurarak kodunuzu düzenlemektir.

Bu sınıfların her birini, tek bir kavramı gruplandırmak için bir organizasyon birimi olarak düşünebilirsiniz.

Bu sınıflar, çözüm / projedeki dosyaların dizin yapısını sıklıkla takip eden ad alanlarındadır. İsim alanları başka bir organizasyon seviyesidir.

İşlevsel dillerdeki büyük projeler tipik olarak nasıl düzenlenir?

İşlevlerinizi farklı dosyalara nasıl ayıracağınızı nasıl belirlersiniz?

Dosyaların yanında başka gruplama birimleri kullanılıyor mu?

Kod genellikle tek bir dosyada nasıl düzenlenir?


18
@ S.Lott What's stopping you from...Haskell kodunun zihinsel olarak hesaplamadığı noktaya, tamamen farklı bir zihniyetle yıllarca ve yıllar boyunca programlama. Ve elbette, gerçek projelerin her zaman doğru ve özenle organize olduğunu varsayıyorsunuz (belki onlar ama benim bildiğim bir noob nasıl?)
yannis

13
@ S.Lott: Ben her zaman OOP'ta programladım. Merak ettim, çok geçmeden fonksiyonel dillerde dalak kullanmaya başladım. Sen diyorsun ki: "Neden burada soruyorsun?" C: Konuyla ilgili beni aydınlatabilecek deneyime sahip (veya sitenin koyduğu uzmanlar) kişilerden bazı mentorluk ve içgörü kazanma. Bu sitenin amacı bu değil mi? Tüm Programcılar veya SO soruları şu şekilde cevaplandırılamıyor: "neden kendiniz bulmuyorsunuz"? Cevap evet, yapabilirsin. Ancak soruyu sormanın nedeni, konusunda uzman bir kişiden daha iyi / daha hızlı sonuçlar elde etmektir.
Gilles

5
@ S.Lott: sadece rastgele kod okursa, verdikleri organizasyonel kararların iyi mi yoksa kötü mü olduğunu nasıl bilecek? Ve neden iyi ya da kötü?
Carson63000,


4
@ S.Lott Dil veya paradigmada uzman olan, iyi organize edilmiş bir projeyi tanımlamak, kuruluşta bulunabilecek eksiklikleri / eksiklikleri belirlemek ve neden sadece kodu okumaktan ve kuruluşa bakmaktan çok daha değerli olduğunu açıklamak , iyi yapılandırılmış olduğu varsayımıyla.
Thomas Owens

Yanıtlar:


32

Bunun dile bağlı olduğundan şüpheleniyorum. İşlevsel programlama kadarıyla, çoğunlukla Haskell’de çok sıkıldım, bu yüzden orada nasıl çalıştığını açıklayacağım.

Haskell kodu, temelde sadece fonksiyonların ve veri tiplerinin koleksiyonları olan "modüller" halinde düzenlenir. Her modül tek bir dosyadır. Bir modül, bir Java sınıfı ile bir Java paketi arasında bir karışımdır - bir modülün ne tür bir faaliyet gösterdiğinin kapsamı. Bir modül ayrıca, hangi işlevleri ve hangi tür dosyaları dışa aktaracağınıza, hangilerini gizleyeceğinize; bu, Java'ya benzer privateve benzerdir public.

Kendi programlarımda modüllerin anlamsal olarak bir şey yapmasını seviyorum ; bu, birden fazla veri türünü tanımlamaları dışında, onları bir Java sınıfı gibi yapar. Standart kütüphaneden kullandığım modüller Data.Listdaha çok paket gibidir - benzer bir dizi yardımcı işlev sağlarlar. Bu aynı zamanda gibi statik Java sınıflarına çok benzer java.util.Arrays.

Modüller ayrıca Java paketlerine benzerler ve netlik sağlamak üzere yuvalanabilirler (bunun kod üzerinde herhangi bir etkisi olduğunu sanmıyorum). Genel olarak, tek bir proje için, ona bir ad verdim (diyorum Project) ve tüm modüllerimin bunun bir parçası olmasını sağladım (örneğin Project.Parseve Project.Run). Bir uygulamadan daha çok kütüphane gibi bir kod yazıyor olsaydım, ne yaptığını Data.Listya da ne yaptığını temel alarak düzenlerdim Control.Monad. Diğer dillerden büyük bir fark, Haskell'in GÇ'yi sınırlamayı ve hepsini bir yere koymaya teşvik etmesidir. Çok sayıda modül hiçbir IO yapmaz ve herhangi bir proje için, mümkün olduğunca çok sayıda modülün saf olmasını isterim.

Örnek olarak, basit bir programlama dili üzerinde çalışıyorum, TPL olarak adlandırıyorum (sebepsiz). Bunun için iki basit modül yarattım: TPL.Parsedilin içsel temsilini ve nasıl ayrıştırılacağını tanımlayan TPL.Runve yorumlayıcıyı çalıştıran ve değişkenler ve IO ile ilgilenen. Aslında kodun derlenmesi ve çalıştırılması için genellikle Mainprogramın giriş noktası olan bir modül vardır.

Bir dosya içindeki işlevleri düzenlemede önemli bir özgürlük vardır; bu sadece yapmayı sevdiğim şey. Veri tiplerimi, başka yerlerde kullanılmadan önce üstüne doğru tanımlarım. Veri türlerini tanımladıktan hemen sonra, onları uygun tip sınıflarının bir parçası yapmak için ne gerekiyorsa uygularım - bu bir tür arayüz uygulamasına benzer. Sonra uygun şekilde, mantık ve çeşitli yardımcı fonksiyonlar izlerim. Sonunda, tüm GÇ fonksiyonlarımın en altta bittiği yerde olmayı seviyorum main. Bu, herhangi bir IO'nun ne yaptığını ve programın nerede başladığını tam olarak netleştirir.

Yani, özet olarak: fonksiyonlar, her biri tek bir dosyadan oluşan modüllerde bulunur. Birkaç modül bir program veya kütüphane oluşturabilir; eski genellikle Maingiriş noktası olan bir modül içerir . Bir dosyada, organizasyon için farklı seçenekler var, ancak yukarıdan veri tabanını, aşağıdan IO'yu ve ortadaki mantığı gruplandırmayı tercih ediyorum.

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.