Sospetto che questo dipenda dalla lingua. Per quanto riguarda la programmazione funzionale, mi sono dilettato principalmente in Haskell, quindi ho intenzione di spiegare come funziona lì.
Il codice Haskell è organizzato in "moduli" che sono fondamentalmente solo raccolte di funzioni e tipi di dati. Ogni modulo è un singolo file. Un modulo è una sorta di mix tra una classe Java e un pacchetto Java: l'ambito esatto di ciò che fa un modulo varia. Un modulo ha anche il controllo su quali funzioni e tipi di costruttori esportare e quali nascondere; questo è simile a private
e public
in Java.
Nei miei programmi, mi piace che i moduli facciano una cosa, semanticamente; questo li rende come una classe Java, tranne per il fatto che potrebbero definire più tipi di dati. I moduli che utilizzo dalla libreria standard, ad esempio Data.List
, sono più simili a pacchetti: forniscono una serie di funzioni di utilità simili. Questo è anche molto simile alle classi statiche Java come java.util.Arrays
.
I moduli sono anche come pacchetti Java in quanto possono essere nidificati per chiarezza (non credo che ciò abbia alcun effetto sul codice stesso). In generale, per un singolo progetto, gli do un nome (diciamo Project
) e tutti i miei moduli ne fanno parte (es. Project.Parse
E Project.Run
). Se stavo scrivendo un codice più simile a una libreria che a un'applicazione, lo organizzerei in base a ciò che stava facendo, come Data.List
o Control.Monad
. Una grande differenza rispetto alle altre lingue è che Haskell incoraggia a limitare l'IO e a mettere tutto in un posto. Un gran numero di moduli non ha alcun IO, e per ogni dato progetto, mi piace avere quanti più moduli siano puri possibile.
Ad esempio, sto lavorando a un semplice linguaggio di programmazione che sto chiamando TPL (senza una buona ragione). Per questo ho creato due semplici moduli: TPL.Parse
che definisce la rappresentazione interna della lingua e come analizzarla, e TPL.Run
che gestisce l'interprete e si occupa di variabili e IO. Per compilare ed eseguire effettivamente il codice, c'è generalmente un Main
modulo che è quello che finisce per essere il punto di ingresso del programma.
Vi è una notevole libertà nell'organizzazione delle funzioni all'interno di un file; questo è proprio quello che mi piace fare. Definisco i miei tipi di dati verso l'alto, prima che vengano utilizzati altrove. Subito dopo aver definito i tipi di dati, implemento tutto ciò di cui ho bisogno per renderli parte dei loro caratteri tipografici appropriati - è un po 'come implementare un'interfaccia. Quindi seguo con la logica e varie funzioni di aiuto, a seconda dei casi. Infine, mi piace avere tutte le mie funzioni IO in fondo che finiscono con main
. Questo chiarisce esattamente cosa sta facendo qualsiasi IO e dove inizia il programma.
Quindi, in sintesi: le funzioni sono contenute in moduli, ognuno dei quali è costituito da un singolo file. Diversi moduli possono costituire un programma o una libreria; il primo include generalmente un Main
modulo che è il suo punto di ingresso. All'interno di un file, ci sono diverse opzioni per l'organizzazione, ma preferisco raggruppare i tipi di dati nella parte superiore, I / O nella parte inferiore e la logica nel mezzo.
What's stopping you from...
Anni e anni di programmazione con una mentalità completamente diversa, al punto che il codice Haskell non calcola mentalmente. E ovviamente stai assumendo che i progetti reali siano sempre organizzati in modo corretto e ordinato (forse lo sono, ma come fa un noob come me a saperlo?)