Come dovrei avvicinarmi ai commenti di scrittura per le funzioni di callback? Voglio spiegare il "perché" dietro la funzione quando i nomi di funzione e parametro sono insufficienti per spiegare cosa sta succedendo.
Mi sono sempre chiesto perché commenti come questo possono essere così comuni nei documenti delle biblioteche in lingue dinamiche:
/**
* cb: callback // where's the arguments & effects?
*/
func foo( cb )
Forse l'atteggiamento comune è "puoi guardare il codice sorgente da solo dopo tutto" che spinge le persone a lasciare commenti minimalisti come questo.
Ma sembra che ci dovrebbe essere un modo migliore per commentare le funzioni di callback.
Ho provato a commentare i callback in modo Haskell:
/**
* cb: Int -> Char
*/
func foo(cb)
E per essere onesti, di solito è abbastanza pulito.
Ma si mette nei guai quando ho bisogno di passare qualche struttura complessa. Il problema è in parte dovuto alla mancanza di un sistema di tipi:
/**
* cb: Int -> { err: String -> (), success: () -> Char } // too long...
*/
func foo(cb)
Oppure ho provato anche questo:
/**
* cb: Int -> { err: String -> (),
* success: () -> Char } // better ?
*/
func bar(cb)
Il problema è che puoi inserire la struttura da qualche altra parte, ma devi dargli un nome per farvi riferimento. Ma quando nominerai una struttura che stai per utilizzare, l'aspetto è immediatamente ridondante:
// Somewhere else...
// ResultCallback: { err: String -> (), success: () -> Char }
/**
* cb: Int -> ResultCallback // better ??
*/
func foo(cb)
E mi dà fastidio se seguo lo stile di commento di Java-doc poiché sembra ancora incompleto. I commenti non ti dicono nulla che non potresti vedere immediatamente osservando la funzione.
/**
* @param cb {Function} yeah, it's a function, but you told me nothing about it...
* @param err {Function} where should I put this callback's argument ??
* Not to mention the err's own arguments...
*/
func foo(cb)
Questi esempi sono JavaScript come con funzioni generiche e nomi di parametri, ma ho riscontrato problemi simili in altri linguaggi dinamici che consentono richiami complessi.