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.