Non avere alcuna documentazione e pensare che IntelliSense sia tutto ciò che serve per comprendere i dettagli più fini e più sottili di ciò che ogni classe / metodo fa, è illusorio.
Ci sono naturalmente dei casi molto semplici - per esempio, se una classe List
ha una proprietà Count
, cosa potrebbe restituire quella proprietà tranne l'ovvio. Ma una quantità molto significativa di metodi ha proprietà d'angolo o proprietà comportamentali che devono essere documentate a vantaggio dell'utente API.
Facciamo un esempio:
public static TabPage ContainingTabPage(this Control control);
Pensi che sia ovvio come funziona il metodo? Bene, la sua intenzione è sicuramente chiara, ma ... cosa succede se il controllo non è contenuto in nessun TabPage
? Restituisce null
o getta? Cosa succede se è in più TabPages nidificati? - Fortunatamente, la documentazione risponde a queste domande: Se questo controllo si trova all'interno di TabPage, restituisce il primo TabPage rilevato iterando ricorsivamente attraverso i suoi genitori. Altrimenti restituisce null. Quale sarebbe il metodo da chiamare per rendere ridondante questa documentazione? %codice%? Ciò non contribuisce alla leggibilità del codice.
O prendi qualcosa di simile a questo:
/// <summary>
/// Returns the smaller of the three IComparable values. If two values are
/// equal, returns the earlier one.
/// </summary>
public static T Min<T>(T val1, T val2, T val3) where T : IComparable<T>;
Nella maggior parte dei casi la seconda frase nella documentazione è irrilevante, ma non fa male. Nei pochi casi in cui è importante, può farti risparmiare un sacco di tempo - se non hai il codice sorgente, dovresti trovare la risposta per esperimento. In questo caso l'esperimento è facile, ma immagina che il metodo riguardi la concorrenza e ti stai chiedendo quali siano le condizioni di sicurezza del filo o della razza ...
Un altro esempio: prendi un serializzatore XML. È semplice, potresti pensare, avere solo un InnermostContainingTabPageOrNull()
e un XElement Serialize<T>(T)
metodo ed è assolutamente chiaro che cosa fanno! Uhm, beh, eccetto ... come si serializzano i dizionari? Come gestisce le interfacce? Conserva l'identità dell'oggetto? Fa fronte a riferimenti ciclici senza andare in loop infiniti? Come si comporta di fronte alla sfida di serializzare delegati, risorse native, proxy remoti? Quali tipi di eccezioni generano in quali situazioni?
Solo avere due metodi non significa che il processo di serializzazione dei dati sia semplice. Di conseguenza, il nostro serializzatore XML personalizzato ha un grosso blocco di documentazione sulla classe che descrive, in dettaglio, tutte le sue caratteristiche e tutti i suoi limiti; che tipo di classi può serializzare, quali supposizioni fa e quali eccezioni genera; gli attributi personalizzati che è possibile utilizzare per modificare il suo comportamento; e, forse la cosa più importante, quali sono le idee di progettazione fondamentali che stanno dietro e quali casi d'uso intende coprire (in modo che se il tuo caso d'uso è sufficientemente diverso, sai che potresti scegliere un serializzatore diverso).
Ora, con tutto ciò che ho detto, penso che ci sia qualcosa da dire su qualità vs. quantità . Molte librerie create per hobby sono fornite con file HTML aggiuntivi o altri documenti contenenti un mucchio di documentazione di bassa qualità quando potrebbero essere più utili con la documentazione meno ma migliore . Una buona documentazione deve soddisfare due importanti funzioni:
-
Che cosa fa questa classe / metodo? - Questo è facile, basta documentare ogni classe / metodo.
-
Come faccio a fare X? - Questo è difficile. Potrebbe non essere ovvio all'utente API quale sia il metodo o la classe di cui hanno bisogno. Per coprire questi casi, spesso aiuta se la documentazione di un metodo si collega ad un altro (es. "Se stai cercando di fare X, preferisci usare M") o la documentazione di una classe menziona tutte le altre classi con cui interagisce (ad esempio il nostro serializzatore XML sopra menzionato elenca tutti gli attributi personalizzati che lo influenzano). Alcuni piccoli esempi di codice per scenari comuni possono essere utili, ma solo se non sono banali.
Ci deve essere un piccolo set di posti dove cercare la risposta. Se l'utente dell'API ritiene di dover leggere pagine dopo pagine di materiale irrilevante solo per accertarsi che la risposta che sta cercando non ci sia, la documentazione è troppo strutturata e l'utente dell'API potrebbe anche non preoccuparsi di leggere se è più facile e veloce chiedere su StackOverflow.
Quindi, in sintesi: No, la documentazione estesa non è affatto un codice olfattivo . Certamente non puoi migliorare il codice semplicemente rimuovendo la documentazione. Ma potrebbe essere un odore di documentazione . C'è una buona documentazione e una cattiva documentazione, e in alcuni casi una cattiva documentazione può essere migliorata tagliandola. Aggiungere ulteriore documentazione può peggiorare la documentazione. La qualità della documentazione non è misurata in base al numero di parole, più di quanto la qualità del codice sia misurata da linee di codice.