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 private
ve 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.List
daha ç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.Parse
ve Project.Run
). Bir uygulamadan daha çok kütüphane gibi bir kod yazıyor olsaydım, ne yaptığını Data.List
ya 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.Parse
dilin içsel temsilini ve nasıl ayrıştırılacağını tanımlayan TPL.Run
ve 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 Main
programı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 Main
giriş 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.
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?)