Come organizzare i programmi funzionali [chiuso]


41

Possibile duplicato:
programmazione funzionale vs. OOP
Come scrivere codice gestibile con programmazione funzionale?

In OOP, l'unità organizzativa di base per il codice è la classe. Una metodologia usata frequentemente in Java, C # e linguaggi simili è quella di organizzare il codice in base al fatto che abbia un file per ogni classe con il nome del file che segue il nome della classe.

Puoi considerare ciascuna di queste classi come un'unità organizzativa per raggruppare un singolo concetto.

Queste classi si trovano negli spazi dei nomi che spesso seguono la struttura delle directory dei file nella soluzione / progetto. Gli spazi dei nomi sono un altro livello di organizzazione.

Come sono generalmente organizzati grandi progetti in linguaggi funzionali?

Come determinare come suddividere le funzioni in file diversi?

Vengono utilizzate altre unità di raggruppamento accanto ai file?

Com'è organizzato il codice in un singolo file?


18
@ S.Lott 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?)
yannis,

13
@ S.Lott: ho sempre programmato in OOP. Di recente ho iniziato a dilettarmi con i linguaggi funzionali per curiosità. Dici: "Perché chiedere qui?". A: Ottenere un po 'di tutoraggio e approfondimenti da persone con esperienza (o esperti come dice il sito) che potrebbero illuminarmi sull'argomento. Non è questo lo scopo di questo sito? Non è possibile rispondere a tutte le domande dei programmatori o SO: "perché non lo scopri tu stesso"? La risposta è sì, puoi. Ma il motivo per porre la domanda è ottenere risultati migliori / più veloci da qualcuno che è un esperto in materia.
Gilles,

5
@ S.Lott: se legge semplicemente un codice casuale, come farà a sapere se le decisioni organizzative che hanno preso sono buone o cattive? E perché sono buoni o cattivi?
Carson63000,


4
@ S.Lott Per riassumere, fare in modo che un esperto nella lingua o nel paradigma identifichi un progetto ben organizzato, identificare eventuali punti deboli / carenze che potrebbero esistere nell'organizzazione e spiegare perché è molto più prezioso che leggere semplicemente il codice e guardare l'organizzazione , con il presupposto che sia ben strutturato.
Thomas Owens

Risposte:


32

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 privatee publicin 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.ParseE 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.Listo 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.Parseche definisce la rappresentazione interna della lingua e come analizzarla, e TPL.Runche gestisce l'interprete e si occupa di variabili e IO. Per compilare ed eseguire effettivamente il codice, c'è generalmente un Mainmodulo 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 Mainmodulo 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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.