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?
risposta
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.
Grazie a Norman, una domanda ricorsiva, ma penso che tu abbia risposto a ciò che sentivo in modo eloquente. – WeNeedAnswers
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
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
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.
Un "diagramma dei requisiti" non esiste in UML (è da SysML) –
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
Suggerisco gentilmente di leggere. http://www.springerlink.com/content/wwvwbt5wbm35cq1r/ dovrebbe adattarsi ai tuoi interessi. – jpabluz
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".
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. –
@Marc: i diagrammi delle classi non riguardano comunque il comportamento di modellazione; ecco a cosa servono i diagrammi di attività e di sequenza. –
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
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 !!
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
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
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.
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).
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.) –
Questa è probabilmente la cosa più divertente che ho letto da mesi. – Darkenor
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.
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
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
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. –
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.
- 1. Come decidere se utilizzare ER o UML per la modellazione?
- 2. Come modellare le proprietà Python nel diagramma UML
- 3. È possibile utilizzare immagini personalizzate per gli oggetti UML in plantUML?
- 4. Come utilizzare quanta più RAM possibile per il mio programma?
- 5. È possibile modellare il nuovo plug-in della pagina Facebook?
- 6. È possibile utilizzare Symbol.species per oggetti semplici?
- 7. È possibile utilizzare Java per creare dll?
- 8. È possibile utilizzare cleanNode() per pulire l'associazione?
- 9. È possibile utilizzare Swagger per SOAP?
- 10. È possibile utilizzare Ajax per caricare file?
- 11. È possibile utilizzare "/" in un nome file?
- 12. È possibile utilizzare unique_lock con un recursive_mutex?
- 13. È possibile utilizzare un MemoryStream con FileStreamResult?
- 14. UML è un linguaggio di programmazione?
- 15. È possibile utilizzare Twitter Bootstrap per creare un sito Magento?
- 16. È possibile utilizzare String.format per un punto decimale condizionale?
- 17. È possibile utilizzare Resharper per rimuovere un inizializzatore di oggetti?
- 18. È possibile utilizzare un oggetto temporaneo per stringhe?
- 19. È possibile utilizzare Core Animation per sfumare un UIBarButtonItem?
- 20. È possibile utilizzare una funzione lambda per un parametro template?
- 21. È possibile utilizzare un progetto di database di Visual Studio in un progetto di test dell'unità per configurare un database vuoto per un test funzionale?
- 22. Objective-C e Modellazione UML
- 23. È possibile scrivere un programma autodistruttivo in C?
- 24. È possibile utilizzare sizeof() per definire una lunghezza dell'array?
- 25. Non è possibile collegare un programma Lua minimo
- 26. È possibile scrivere direttamente un programma con istruzioni bytecode Java?
- 27. È possibile ospitare il CLR in un programma C?
- 28. È possibile compilare un programma scritto in Python?
- 29. È possibile utilizzare javax.interceptor in un ambiente Java SE?
- 30. Esiste un insieme di restrizioni che posso utilizzare per simulare la programmazione funzionale in JavaScript?
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
Ecco una buona domanda e risposta: https://softwareengineering.stackexchange.com/questions/30281 1/what-are-functional-programmers-using-in-place-of-uml – Fuhrmanator