Si dovrebbe commentare in modo diverso nelle lingue funzionali? [chiuso]

25

Ho appena iniziato con la programmazione funzionale e mi sto chiedendo quale sia il modo corretto di commentare il mio codice.

Sembra un po 'ridondante commentare una breve funzione dato che i nomi e la firma dovrebbero già dirti tutto quello che devi sapere. Anche commentare le funzioni più grandi sembra un po 'ridondante dato che generalmente sono composte da funzioni auto-descrittive più piccole.

Qual è il modo corretto di commentare un programma funzionale? Dovrei usare lo stesso approccio della programmazione iterativa?

    
posta Tom Squires 17.11.2011 - 12:22
fonte

7 risposte

84

Il nome della funzione dovrebbe dire cosa stai facendo.

L'implementazione ti dirà come stai facendo.

Utilizza i commenti per spiegare perché lo stai facendo.

    
risposta data 17.11.2011 - 14:38
fonte
14

Sicuramente è un punto in questa domanda, poiché i programmi funzionali di solito si trovano su un livello di astrazione diverso da quelli imperativi.

Per questo motivo è necessario un altro stile di documentazione. Nei programmi iterativi un commento può essere d'aiuto come nel codice seguente, perché l'essenza del codice è nascosta dietro lo standard:

// map 'toUpperCase' over 'container' yielding 'result'
Container result = new Container();
for (int i=0; i < container.size(); i++) { 
             result.addToTail(container.atElement(i).toUpperCase());
}

Ma questo è chiaramente un non senso in un linguaggio funzionale:

-- map 'toUpperCase' over 'list'
let result = map toUpperCase list

Meglio:

-- we need the FooBars in all uppercase for the Frobnitz-Interface
let result = map toUpperCase list
    
risposta data 17.11.2011 - 13:48
fonte
11

Il motivo per cui documentiamo una funzione è che i lettori non vogliono o non possono leggere il corpo della funzione. Per questo motivo, si dovrebbero documentare grandi funzioni, anche in linguaggi funzionali. Non importa se è facile capire cosa fa la funzione osservando la sua implementazione.

    
risposta data 17.11.2011 - 12:46
fonte
3

Le funzioni dovrebbero essere commentate, se il nome della funzione e i nomi dei parametri da soli non sono sufficienti per specificare il contratto .

// returns a list of Employees    <-- not necessary
def GetEmployeeList: ...

// returns a list of Employees sorted by last name    <-- necessary
def GetEmployeeList: ...

In poche parole, il contratto definisce ciò che la funzione si aspetta e ciò che garantisce. In senso stretto, se GetEmployeeList restituisce una lista ordinata ma non lo dice nel nome della funzione o nel commento, un consumatore di questa funzione non deve fare affidamento su questo comportamento. È un dettaglio di implementazione non documentato e l'autore di GetEmployeeList ha la libertà di modificare questo comportamento in qualsiasi momento.

    
risposta data 17.11.2011 - 17:47
fonte
2

Il commento stesso non dovrebbe contenere una descrizione alternativa a ciò che fa il codice (che in realtà è espresso dal codice stesso), ma piuttosto una spiegazione dei motivi perché il codice è scritto così com'è.

Detto questo, non vedo alcun motivo per cui un commento dovrebbe per sé essere diverso in un linguaggio funzionale.

    
risposta data 17.11.2011 - 13:44
fonte
1

Ho lo stesso approccio per documentare tutto il mio codice:

  • Utilizza nomi descrittivi,
  • Aggiungi commenti prima di qualsiasi logica ragionevolmente complicata se non è possibile evitare una logica complicata,
  • Scrivi una panoramica dell'intero sistema,

Se il nome e la firma del tipo non ti dicono esattamente cosa fa la funzione, di solito stai sbagliando.

    
risposta data 17.11.2011 - 13:17
fonte
0

All'età di 25 anni tendi a ricordare le cose molto meglio. Invecchiando e partecipando a più sistemi con codice legacy (sì, il codice che scrivi oggi sarà un codice legacy in 10-15 anni) può essere molto utile se ci sono commenti.

    
risposta data 17.11.2011 - 14:24
fonte

Leggi altre domande sui tag