2010-03-16 13 views
43

In particolare, come si modella un programma funzionale, o uno sviluppato utilizzando lo stile funzionale (senza classi) utilizzando un diagramma, e non la rappresentazione testuale, è del tutto possibile e qualcuno potrebbe per favore indirizzarmi verso l'applicazione più vicina che sarebbe fai questo (open source, gratis come nella birra, se vuoi)È possibile utilizzare UML per modellare un programma funzionale?

+1

Una questione collegata, "C'è una modellazione linguaggio per il paradigma della programmazione funzionale? ": http://stackoverflow.com/questions/1364237/is-there-a-modeling-language-for-the-functional-programming-paradigm (la risposta più votata al momento è "Credo che il linguaggio di modellazione per Haskell sia chiamato 'matematica'") – Chuck

+0

Ecco una buona domanda e risposta: https://softwareengineering.stackexchange.com/questions/30281 1/what-are-functional-programmers-using-in-place-of-uml – Fuhrmanator

risposta

27

Generalmente i programmatori funzionali non hanno molto uso per i diagrammi. Molti programmatori funzionali (ma non tutti) trovano che scrivere tipi è un buon modo per incapsulare le relazioni di progettazione che i programmatori OO inseriscono nei diagrammi UML.

Poiché lo stato mutabile è raro nei programmi funzionali, non ci sono "oggetti" mutevoli, quindi non è solitamente utile o necessario per diagrammare le relazioni tra di essi. E mentre una funzione potrebbe chiamarne un'altra, di solito questa proprietà non è importante per la progettazione generale di un sistema, ma solo per l'implementazione della funzione che esegue la chiamata.

Se sentissi un forte bisogno di diagrammi di un programma funzionale, potrei usare uno concept map in cui tipi o funzioni svolgono il ruolo di concetti.

+0

Grazie a Norman, una domanda ricorsiva, ma penso che tu abbia risposto a ciò che sentivo in modo eloquente. – WeNeedAnswers

+1

revisione di questo, penso che i tipi immutabili possono essere modellati. È quindi possibile passare questi oggetti immutabili in funzioni che agiscono su di essi, producendo un nuovo risultato. Questa domanda che ho postato riguardava un progetto su cui stavo lavorando. Alla fine ho usato UML, ma suddivido gli oggetti in funzioni e tipi immutabili. Ha funzionato a meraviglia. – WeNeedAnswers

+3

Sono curioso di sapere se questa risposta è ancora vera oggi. Come viene gestita la complessità? Ad esempio, UML ha livelli di astrazione pacchetto/classe/metodo che consentono di gestire la complessità (nascondendo i dettagli a diversi livelli di astrazione). I diagrammi consentono di visualizzare quei livelli. La mia esperienza fino ad ora con FP è troppo banale per vedere come ciò sia necessario, ma qualsiasi sistema complesso sarebbe difficile da trovare senza un qualche tipo di diagramma. – Fuhrmanator

11

UML è un compendio di diversi tipi di modellazione. Se stai parlando di Object Diagram (Class Diagram), beh non troverai nulla che si adatti al tuo uso desiderato. Ma se stai parlando di un diagramma di interazione (diagramma di attività) o di un diagramma dei requisiti (Usa il diagramma dei casi), ovviamente ti aiuteranno e faranno parte della base UML.

+3

Un "diagramma dei requisiti" non esiste in UML (è da SysML) –

+1

No, UML è Oggetti completamente. Tutto è un oggetto, i diagrammi di interazione modellano gli oggetti, a meno che non si tratti una funzione come un oggetto? L'ho provato un paio di anni fa con un delegato C# che è un oggetto reale, non ha funzionato. – WeNeedAnswers

+0

Suggerisco gentilmente di leggere. http://www.springerlink.com/content/wwvwbt5wbm35cq1r/ dovrebbe adattarsi ai tuoi interessi. – jpabluz

12

UML non è solo diagrammi di classe, lo sai?

La maggior parte degli altri tipi di diagramma (utilizzare diagrammi di casi, diagrammi di attività, diagrammi di sequenza ...) sono perfettamente applicabili per uno stile di programmazione puramente funzionale. Anche i diagrammi di classe potrebbero essere utili, se semplicemente non si utilizzano attributi e associazioni e si interpreta "classe" come "raccolta di funzioni correlate".

+0

Sto iniziando a vedere il punto dell'autore originale, però. Se stai solo modellando una raccolta di funzioni correlate, non stai davvero "modellando", tanto quanto organizzando.Non sono in disaccordo sul fatto che sia ancora _utile_, ma non è tanto un comportamento di modellazione. –

+1

@Marc: i diagrammi delle classi non riguardano comunque il comportamento di modellazione; ecco a cosa servono i diagrammi di attività e di sequenza. –

+0

UML riguarda le Classi, perché creare un tale linguaggio basato su carta? Ho fatto un sacco di altri metodi e ho usato metodologie che racchiudono le Lingue di tipo procedurale (SSADM per nominarne una). Non ancora visto quello che fa lo stesso per le lingue funzionali. UML è interamente basato su messaggi e collaborazioni con unità descrittive di lavoro chiamate classi. Ma dal momento che una funzione può essere una classe, come si modellerebbe qualcosa senza stato? UML credo sia un martello di troppo per qualcosa che è una spilla. – WeNeedAnswers

2

UML è un approccio ad oggetti perché a livello grafico non è possibile definire la modellazione funzionale. Un trucco è aggiungere direttamente vincoli e note al modello e non ai livelli del diagramma. Voglio dire che puoi scrivere una documentazione funzionale completa su ogni elemento del modello direttamente nel metamodello e visualizzare solo una vista oggetto usando l'editor UML. Questo è forse stupido, ma ho trovato questa demo in lingua francese esattamente sullo stesso argomento e con EclipseUML Omondo: OCL e UML 2.2 (demo in 3mn lingua francese): http://www.download-omondo.com/regle_ocl.swf

Questa demo spiega come aggiungere vincoli direttamente sul metodi a livello di metamodello. Il punto interessante di questa demo è che l'utilizzo di un singolo modello per l'intero progetto consente di essere abbastanza flessibile da estendere UML tradizionale ed evitare modelli SysML, BPMN, DSL aggiuntivi perché tutte le informazioni sono costruite sulla parte superiore del metamodello UML 2.2. Non so se sarà un successo ma questa iniziativa è molto interessante perché riduce la complessità della modellazione e apre nuove frontiere !!

+0

Hey tutte le risposte accolte a braccia aperte, le uniche domande stupide sono quelle non poste. :) Grazie. Ho osservato i vincoli, penso che siano grandiosi, ma se la tua sensazione è più pura di usare un linguaggio come Haskell, diventa molto difficile applicare qualcosa che non ha uno stato. I vincoli diventano guardie, ma le guardie sono molto più che vincoli. – WeNeedAnswers

+0

Non riesco a capire perché i seguenti aspetti (pratici) non si applichino alla programmazione funzionale: 1. Divisione del lavoro per i team 2. Progettazione per il test 3. Progettazione per il riutilizzo. Chiamalo una classe con solo funzioni membro statiche o un modulo o comunque. Oltre il livello delle funzioni, sono necessari livelli organizzativi di livello superiore per motivi pratici. I componenti di sistema in applicazioni non monolitiche (ad es. Client, sever) richiedono anche dichiarazioni su ciò che deve essere costruito per essere fatto e comunicato ai team e ai portatori di interesse. UML offre servizi per esprimere tale struttura, indipendentemente dalla lingua. – BitTickler

0

In realtà non ho provato la modellazione di un sistema di grandi dimensioni in UML e quindi l'implementazione funzionale, ma non vedo perché non dovrebbe funzionare.

Supponendo che l'implementazione sarebbe stata Haskell, vorrei iniziare definendo i tipi e le loro relazioni utilizzando un diagramma di classe. Assegna le funzioni alle classi secondo il loro argomento principale, ma ricorda che questo è solo un artefatto di UML. Se fosse più facile creare un oggetto singleton immaginario solo per contenere tutte le funzioni, anche quello andrebbe bene. Se l'applicazione ha bisogno di stato, non avrei alcun problema con la modellazione in una tabella di stato o in un diagramma di sequenza.Se avessi bisogno di una monade personalizzata per la semantica della sequenziazione specifica per l'applicazione, allora quella potrebbe diventare uno stereotipo; l'obiettivo sarebbe quello di descrivere ciò che l'applicazione fa in termini di dominio.

Il punto principale è che UML potrebbe essere essere utilizzato per modellare un programma per l'implementazione funzionale. Devi tenere a mente una mappatura all'implementazione (e non sarebbe male documentarla), e l'adattamento è tutt'altro che esatto. Ma potrebbe essere fatto, e potrebbe anche aggiungere valore.

5

I programmatori funzionali hanno una propria versione di UML, si chiama Category Theory.

(C'è una certa verità in questo, ma è pensato per essere letto con un tocco di umorismo).

+3

So che l'hai fatto con un po 'di umorismo, ma per chi non lo sapesse, la modellazione non riguarda solo ... la modellazione. Riguarda la gestione della complessità (in particolare grandi quantità) e la gestione di basi di codice potenzialmente di grandi dimensioni a livelli comprensibili. Sono sicuro che i programmatori FP fanno la loro modellazione su larga scala in vari modi; ci vorranno solo anni per essere formalizzati e standardizzati (ai fini della gestione della complessità, non della correttezza formale.) –

+0

Questa è probabilmente la cosa più divertente che ho letto da mesi. – Darkenor

0

Mi rendo conto che questo è un thread vecchio ma non sto capendo il problema qui.

Una classe è semplicemente un'astrazione di un concetto che lega la funzionalità dei suoi metodi insieme in un modo più umano. Ad esempio, la classe WaveGenerator potrebbe includere i metodi Sine, Sawtooth e SquareWave. Tutti e tre i metodi sono chiaramente correlati alla classe Generator. Tuttavia, tutti e tre sono anche senza stato. Se progettati correttamente, non è necessario memorizzare le informazioni di stato al di fuori del metodo. Questo li rende oggetti stateless che - se ho capito bene - li rendono funzioni immutabili che sono un concetto centrale nel paradigma funzionale.

Dal punto di vista concettuale non vedo alcuna differenza tra

lasciare Busta Sine = ...

e

lasciare Busta Generator.Sine = ...

altro rispetto al fatto che quest'ultimo potrebbe fornire una maggiore comprensione dello scopo della funzione.

+3

Gli oggetti sono tutti sullo stato di incapsulamento. In Programmazione funzionale, come accertare correttamente lo stato non è un problema in quanto tutto dovrebbe essere immutabile. È molto meglio nella programmazione funzionale separare lo stato dalla funzione o anche meglio, ridurre lo stato a una funzione. È questa la differenza nella filosofia di base che è il problema. In OOP si programma per nascondere lo stato e localizzare le modifiche agli oggetti mutabili, mentre in FOP si riduce il problema di stato a strutture immutabili. – WeNeedAnswers

+0

Un buon esempio sarebbe un oggetto persona, con il solito stato di Nome, Età, Indirizzo ecc. In FOP questo tipo sarebbe immutabile, per cambiare un valore, si passerebbe questo in una funzione, dove si produrrebbe una nuova persona oggetto. In OOP si usano i setter/getter della proprietà e lo stato è mutabile. – WeNeedAnswers

+0

Forse non sono stato chiaro nel rendere il mio punto. Il thread originale chiedeva come modellare lo stile di programmazione funzionale. Mentre è vero che OOP è progettato attorno a uno stile imperativo di programmazione, non è limitato alla programmazione imperativa. Una classe che si limita ai metodi statici equivale a un insieme di funzioni incapsulate. Proprio come C non è un linguaggio OOP, non è limitato a uno stile procedurale. –

1

Immagino che potresti creare una classe chiamata noclass e inserire le funzioni come metodi. Inoltre, potresti voler dividere lo noclass in più categorie di funzioni.

2

di modellare un programma funzionale, utilizzando un diagramma, e non rappresentazione testuale, è possibile utilizzare la notazione come quello utilizzato per programmare in Viskell o Luna

enter image description here

Problemi correlati