La documentation pour les classes orientées objet implique souvent un compromis entre donner aux responsables de la classe une flexibilité pour changer de conception et permettre aux consommateurs de la classe d'exploiter pleinement son potentiel. Si une classe immuable aura un certain nombre de propriétés qui ont une certaine exacte relation les uns avec les autres (par exemple le Left, RightetWidthles propriétés d’un rectangle à coordonnées entières alignées sur la grille), on peut concevoir que la classe stocke toute combinaison de deux propriétés et calcule la troisième, ou l’utiliser pour stocker les trois. Si rien dans l'interface n'indique clairement quelles propriétés sont stockées, le programmeur de la classe pourra peut-être modifier la conception dans le cas où cela s'avérerait utile pour une raison quelconque. En revanche, si, par exemple, deux des propriétés sont exposées en tant que finalchamps et que la troisième ne l'est pas, les versions futures de la classe devront toujours utiliser les deux mêmes propriétés en tant que "base".
Si les propriétés n'ont pas une relation exacte (par exemple parce qu'elles sont floatou doubleplutôt que int), il peut être nécessaire de documenter quelles propriétés "définissent" la valeur d'une classe. Par exemple, même si Leftplus Widthest supposé être égal Right, les calculs en virgule flottante sont souvent inexacts. Par exemple, supposons que a Rectanglequi utilise le type Floataccepte Leftet Widthque les paramètres du constructeur soient construits avec Leftdonnes comme 1234567fet Widthcomme 1.1f. La meilleure floatreprésentation de la somme est 1234568.125 [pouvant afficher 1234568.13]; le prochain plus petit floatserait 1234568.0. Si la classe stocke réellement LeftetWidth, il peut signaler la valeur de la largeur telle qu’elle a été spécifiée. Si, toutefois, le constructeur calculait en Rightfonction de l'entrée Leftet Width, et plus tard, en Widthfonction de Leftet Right, il indiquerait la largeur comme 1.25fplutôt que comme entrée 1.1f.
Avec les classes mutables, les choses peuvent être encore plus intéressantes, puisqu'un changement à l'une des valeurs interdépendantes impliquera un changement à au moins une autre, mais on ne sait pas toujours laquelle. Dans certains cas, il peut être préférable d'éviter d' avoir des méthodes qui « ensemble » une seule propriété en tant que telle, mais soit avoir des méthodes pour par exemple SetLeftAndWidthou SetLeftAndRight, ou bien préciser ce que les propriétés sont spécifiées et qui changent (par exemple MoveRightEdgeToSetWidth, ChangeWidthToSetLeftEdgeou MoveShapeToSetRightEdge) .
Parfois, il peut être utile d’avoir une classe qui garde en mémoire les valeurs des propriétés spécifiées et celles calculées par d’autres. Par exemple, une classe "moment dans le temps" peut inclure une heure absolue, une heure locale et un décalage de fuseau horaire. Comme avec beaucoup de ces types, étant donné deux informations quelconques, on peut calculer la troisième. Sachant lequelDes informations ont été calculées, cependant, peuvent parfois être importantes. Par exemple, supposons qu’un événement soit enregistré comme s’il s’est produit à "17h00 UTC, fuseau horaire -5, heure locale 12h00", et on découvre plus tard que le fuseau horaire aurait dû être -6. Si l’on sait que l’heure UTC a été enregistrée sur un serveur, l’enregistrement doit être corrigé comme suit: "18 h 00 UTC, fuseau horaire -6, heure locale 12 h 00"; si quelqu'un tape l'heure locale sur une horloge, il devrait s'agir de "17:00 UTC, fuseau horaire -6, heure locale 11:00 am". Sans savoir si l'heure locale ou globale doit être considérée comme "plus crédible", il est toutefois impossible de savoir quelle correction doit être appliquée. Si, toutefois, l'enregistrement garde trace de l'heure spécifiée, des modifications du fuseau horaire peuvent laisser celui-ci seul pendant le changement de l'autre.