Poiché il linguaggio macchina (ad es. 0110101000110101
) , I linguaggi dei computer si sono generalmente evoluti in forme più elevate di astrazione, rendendo generalmente più semplice la comprensione del codice quando viene applicato a un problema. L'assemblatore era un'astrazione sul codice della macchina, C era un'astrazione sull'assemblatore, ecc.
Il design orientato agli oggetti sembra essere molto bravo nel permetterci di modellare un problema in termini di oggetti, ad esempio, il problema di un sistema di registrazione dei corsi universitari può essere modellato con una Course
classe, una Student
classe, ecc. Quindi, quando scriviamo la soluzione in un linguaggio OO, abbiamo classi simili che assumono responsabilità e che generalmente sono utili per la progettazione, specialmente per la modularizzazione del codice. Se do questo problema a 10 team indipendenti che lo risolvono con un metodo OO, in genere le 10 soluzioni avranno le classi relative al problema in comune. Ci possono essere molte differenze quando inizi a entrare nell'accoppiamento e nelle interazioni di quelle classi, quindi non esiste nulla come "zero gap rappresentazionale".
La mia esperienza con la programmazione funzionale è molto limitata (nessun utilizzo nel mondo reale, solo programmi di tipo Hello World). Non riesco a vedere come tali lingue consentano di mappare facilmente le soluzioni FP ai problemi (con un basso gap rappresentativo) come fanno le lingue OO.
Comprendo i vantaggi di FP rispetto alla programmazione concorrente. Ma mi sto perdendo qualcosa o FP non sta riducendo il gap rappresentativo (rendendo le soluzioni più facili da capire)?
Un altro modo per chiederlo: il codice FP di 10 team diversi che risolvono lo stesso problema del mondo reale avrebbe molto in comune?
Da Wikipedia on Abstraction (informatica) (sottolineatura mia):
I linguaggi di programmazione funzionale mostrano comunemente astrazioni legate a funzioni , come le astrazioni lambda (trasformare un termine in una funzione di una variabile), funzioni di ordine superiore (i parametri sono funzioni), astrazione di parentesi (trasformare un termine in una funzione di una variabile).
Il divario rappresentazionale potrebbe essere potenzialmente aumentato, perché [alcuni] problemi del mondo reale non sono facilmente modellabili con tali astrazioni.
Un altro modo in cui vedo diminuire il divario rappresentativo è nel rintracciare gli elementi della soluzione al problema. Il 0
s e' 1
s in codice macchina è molto difficile da risalire, mentre la Student
classe è facile tornare traccia. Non tutte le classi OO tracciano facilmente nello spazio del problema, ma molti lo fanno.
Le astrazioni FP non devono sempre essere spiegate per scoprire quale parte dello spazio problematico stanno risolvendo (a parte i problemi matematici )?OK - Sto bene in questa parte. Dopo aver esaminato molti altri esempi, vedo come le astrazioni di FP siano molto chiare per parti del problema che sono espresse nell'elaborazione dei dati.
La risposta accettata a una domanda correlata È possibile utilizzare UML per modellare un programma funzionale? - dice "I programmatori funzionali non hanno molto da usare per i diagrammi". Non mi interessa davvero se si tratta di UML, ma mi chiedo se le astrazioni di FP siano facili da capire / comunicare, se non ci sono diagrammi ampiamente utilizzati (supponendo che questa risposta sia corretta). Ancora una volta, il mio livello di utilizzo / comprensione del FP è banale, quindi non capisco la necessità di diagrammi su semplici programmi FP.
Il design OO ha funzioni / classe / livelli di pacchetto di astrazione, con incapsulamento (controllo degli accessi, occultamento delle informazioni) a ciascuno, che semplifica la gestione della complessità. Questi sono elementi che consentono di passare dal problema alla soluzione e viceversa.
Molte risposte parlano di come l'analisi e la progettazione sono fatte in FP in un modo analogo a OO, ma nessuno cita nulla di alto livello finora (Paul ha citato alcune cose interessanti, ma è di basso livello). Ieri ho fatto molte ricerche su Google e ho trovato alcune discussioni interessanti. Quanto segue è tratto da Refactoring Functional Programs di Simon Thompson (2004) (sottolineatura mia)
Nel progettare un sistema orientato agli oggetti, è scontato che il progetto precederà la programmazione. I progetti verranno scritti utilizzando un sistema come UML supportato da strumenti come Eclipse. I programmatori principianti possono imparare un approccio alla progettazione visiva usando sistemi come BlueJ. Il lavoro su una metodologia simile per la programmazione funzionale è riportato in FAD: Functional Analysis and Design , ma esiste poco altro lavoro. Potrebbero esserci diverse ragioni per questo.
I programmi funzionali esistenti hanno una scala che non richiede progettazione. Molti programmi funzionali sono piccoli, ma altri, come il compilatore Haskell di Glasgow, sono sostanziali.
I programmi funzionali modellano direttamente il dominio dell'applicazione, rendendo in tal modo irrilevante il design. Mentre i linguaggi funzionali forniscono una varietà di potenti astrazioni, è difficile sostenere che questi forniscano tutte e solo le astrazioni necessarie per modellare il mondo reale.
I programmi funzionali sono costruiti come una serie in evoluzione di prototipi.
Nella tesi di dottorato sopra citata , i vantaggi dell'utilizzo di Metodologie di analisi e progettazione (ADM) sono delineati indipendentemente dai paradigmi. Ma si sostiene che gli ADM dovrebbero allinearsi al paradigma di implementazione. Cioè, OOADM funziona meglio per la programmazione OO e non è ben applicato a un altro paradigma come FP. Ecco una grande citazione che penso parafrasasse quello che chiamo gap rappresentativo:
si può discutere a lungo su quale paradigma fornisce il miglior supporto per lo sviluppo del software, ma si ottiene il pacchetto di sviluppo più naturale, efficiente ed efficace quando si rimane all'interno di un singolo paradigma dalla descrizione del problema fino all'implementazione e alla consegna.
Ecco la serie di diagrammi proposti da FAD:
- diagrammi di dipendenza delle funzioni che presentano una funzione con quelli che utilizza nella sua implementazione;
- diagramma di dipendenza del tipo che fornisce lo stesso servizio per i tipi; e,
- diagrammi di dipendenza del modulo che presentano viste dell'architettura del modulo del sistema.
C'è un caso di studio nella sezione 5.1 della tesi FAD, che è un sistema per automatizzare la produzione di dati relativi a un campionato di calcio (calcio). I requisiti sono funzionali al 100%, ad es. Immissione di risultati calcistici, produzione di classifiche, tabelle dei punteggi, tabelle delle presenze, trasferimento dei giocatori tra squadre, aggiornamento dei dati dopo nuovi risultati, ecc. , oltre a dichiarare che "le nuove funzionalità dovrebbero essere consentite a un costo minimo", qualcosa che è quasi impossibile da testare.
Purtroppo, a parte FAD, non vedo riferimenti moderni per i linguaggi di modellazione (visivi) proposti per FP. UML è un altro paradigma, quindi dovremmo dimenticarlo.