Si dovrebbe commentare diversamente nei linguaggi funzionali? [chiuso]


25

Sto appena iniziando con la programmazione funzionale e mi chiedo il modo corretto di commentare il mio codice.

Sembra un po 'ridondante commentare una funzione breve poiché i nomi e la firma dovrebbero già dirti tutto ciò che devi sapere. Anche commentare funzioni più grandi sembra un po 'ridondante poiché sono generalmente composte da funzioni autodescrittive più piccole.

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


7
"poiché sono generalmente composti da piccole funzioni auto-descrittive". - questo, in linea di principio, non è diverso nelle lingue imperative. Tuttavia, spesso non è immediatamente chiaro cosa farà la grande funzione alla fine: si potrebbe sempre dedurla dal codice stesso, ma se ciò richiede molto più tempo rispetto alla lettura di un commento, è necessario fornire uno.
circa il

2
Non sono d'accordo. Poiché le lingue funzionali non hanno effetti collaterali, sai esattamente cosa farà alla fine, restituisci un valore con la firma data
Tom Squires,

8
non tutti i linguaggi funzionali sono puri, alcuni hanno effetti collaterali.
Thanos Papathanasiou,

1
Ma commenta quello che senti di commentare ... Questo è ripensamento
gd1

1
Il tuo progetto corre il rischio di avere altri membri che non hanno familiarità con i linguaggi funzionali? Potrebbero aver bisogno di un aiuto extra.
JeffO,

Risposte:


84

Il nome della funzione dovrebbe dire cosa stai facendo.

L'implementazione ti dirà come lo stai facendo.

Usa i commenti per spiegare perché lo stai facendo.


1
Ottima risposta, mi uccide vedere il codice disseminato di commenti che spiegano cosa e come (che è evidente dal codice stesso) ma mi lascia indovinare il perché.
Eric Wilson,

32
e questo è vero indipendentemente dal paradigma
jk.

2
Questo probabilmente è ovvio, ma dovresti anche aggiungere commenti su cosa e come nel caso in cui il codice sia complicato o contorto e richieda tale spiegazione. Naturalmente, anche questo codice dovrebbe probabilmente essere evitato comunque, ma ciò non è sempre possibile.
user606723

3
Sebbene questa risposta sia molto semplice e la semplicità abbia molto valore, non è del tutto vera. Un nome di funzione spesso non descrive e non può descrivere "cosa" in modo sufficientemente dettagliato, pertanto è spesso necessaria la documentazione (ad esempio per descrivere casi limite). La documentazione viene spesso inserita nei commenti.
luiscubal,

2
Probabilmente, il nome della funzione dovrebbe anche spiegare perché lo sta facendo, quando è possibile.
Yam Marcovic,

14

C'è sicuramente è un punto a questa domanda, come programmi funzionali di solito sono su un livello di astrazione diverso rispetto a quelli imperativi.

Per questo motivo, è necessario un altro stile di documentazione. Nei programmi iterativi un commento può essere utile come nel seguente codice, poiché l'essenza del codice è nascosta dietro il bollettino:

// 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 questa è chiaramente una sciocchezza 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

8
il nonno mi dice sempre di documentare il perché anziché il cosa. Quindi userei anche l'ultima versione per il codice imperativo.
Simon Bergot,

3
Tuo nonno ha ragione. Volevo solo dimostrare che alcuni commenti che hanno senso, tuttavia, nel regno imperativo sono assolutamente inutili nel funzionale.
Ingo,

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 osservandone l'implementazione.


Un buon punto Soprattutto se il lettore utilizza una libreria compilata e può vedere solo le firme delle funzioni esposte e i loro commenti. Non vedranno mai le viscere descrittive del tuo codice.
FrustratedWithFormsDesigner,

3

Le funzioni devono 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 breve, il contratto definisce ciò che la funzione si aspetta e ciò che garantisce. A rigor di termini, se GetEmployeeListrestituisce un elenco ordinato 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 dell'implementazione non documentato e l'autore di GetEmployeeListha la libertà di modificare questo comportamento in qualsiasi momento.


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 per cui il codice è scritto così com'è.

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


1

Adotto lo stesso approccio per documentare tutto il mio codice:

  • Usa nomi descrittivi,
  • Aggiungi commenti prima di qualsiasi logica ragionevolmente complicata se la logica complicata non può essere evitata,
  • Scrivi una panoramica di tutto il sistema,

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


0

A 25 anni tendi a ricordare le cose molto meglio. Man mano che invecchi e sei coinvolto in più sistemi con codice legacy (sì, il codice che scrivi oggi sarà un codice legacy tra 10-15 anni) può essere molto utile se ci sono commenti.

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.