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.
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?)