Personalmente vado con l'approccio di prendere in considerazione la documentazione di tutto. Cioè durante la codifica, considero in ogni punto se la documentazione potrebbe aggiungere valore. La maggior parte delle volte la risposta è sì per esattamente i tipi di vincoli e le conoscenze di dominio menzionate nella domanda originale. Per esempio. nullità, vincoli univoci, interpretazione del campo nel dominio più ampio.
Per evitare la duplicazione, tendo a documentare pesantemente le principali classi API con questo tipo di informazioni. Quindi solo implementazioni documentali e internals dove c'è un comportamento non ovvio o incoerente. Trovo che questo funzioni bene poiché sono gli utenti dell'API che hanno bisogno del maggior aiuto e della documentazione, in genere è sicuro che le persone che modificano l'implementazione conoscano l'API, quindi hanno questa conoscenza.
Tendo anche a documentare solo i getter. Non duplo la documentazione su setter, definizioni dei campi e parametri del costruttore. Ho solo documentato comportamenti non ovvi come i default in questi posti. Qualsiasi comportamento che può essere dedotto dalla documentazione getter non è documentato. Ad esempio, se il getter è documentato come null-return, generalmente non documento che non puoi passare null al setter, a meno che non ci sia un default.
Ad alcune persone piace contrassegnare questo atto di "considerare la documentazione" aggiungendo commenti vuoti dove hanno preso in considerazione la documentazione ma non lo hanno trovato necessario. Non mi piace questa pratica in quanto limita il codice e si intromette.