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
, Right
etWidth
les 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 final
champs 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 float
ou double
plutô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 Left
plus Width
est supposé être égal Right
, les calculs en virgule flottante sont souvent inexacts. Par exemple, supposons que a Rectangle
qui utilise le type Float
accepte Left
et Width
que les paramètres du constructeur soient construits avec Left
donnes comme 1234567f
et Width
comme 1.1f
. La meilleure float
représentation de la somme est 1234568.125 [pouvant afficher 1234568.13]; le prochain plus petit float
serait 1234568.0. Si la classe stocke réellement Left
etWidth
, il peut signaler la valeur de la largeur telle qu’elle a été spécifiée. Si, toutefois, le constructeur calculait en Right
fonction de l'entrée Left
et Width
, et plus tard, en Width
fonction de Left
et Right
, il indiquerait la largeur comme 1.25f
plutô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 SetLeftAndWidth
ou SetLeftAndRight
, ou bien préciser ce que les propriétés sont spécifiées et qui changent (par exemple MoveRightEdgeToSetWidth
, ChangeWidthToSetLeftEdge
ou 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.