La documentazione per le classi orientate agli oggetti spesso implica un compromesso tra il fatto che i manutentori della flessibilità della classe cambino il proprio design, anziché consentire ai consumatori della classe di sfruttare appieno il proprio potenziale. Se una classe immutabile avrà un numero di proprietà che avrà una certa relazione esatto (ad esempio le proprietà Left
, Right
e Width
di una griglia di coordinate intero- rettangolo allineato), si potrebbe progettare la classe per memorizzare qualsiasi combinazione di due proprietà e calcolare la terza, oppure si potrebbe progettarla per memorizzarle tutte e tre. Se nulla dell'interfaccia rende chiaro quali proprietà sono memorizzate, il programmatore della classe potrebbe essere in grado di modificare il progetto nel caso in cui ciò risultasse utile per qualche motivo. Al contrario, se ad es. due delle proprietà sono esposte come campi final
e la terza no, quindi le future versioni della classe dovranno sempre utilizzare le stesse due proprietà come "base".
Se le proprietà non hanno una relazione esatta (ad esempio perché sono float
o double
anziché int
), potrebbe essere necessario documentare quali proprietà "definiscono" il valore di una classe. Ad esempio, anche se Left
più Width
è uguale a Right
, la matematica a virgola mobile è spesso inesatta. Ad esempio, supponiamo un Rectangle
che utilizza il tipo Float
accetta Left
e Width
mentre i parametri del costruttore sono costruiti con Left
dato come 1234567f
e Width
come 1.1f
. La migliore rappresentazione float
della somma è 1234568.125 [che può essere visualizzata come 1234568.13]; il prossimo più piccolo float
sarebbe 1234568.0. Se la classe memorizza effettivamente Left
e Width
, può riportare il valore della larghezza come è stato specificato. Se, tuttavia, il costruttore ha calcolato Right
in base al valore di Left
e Width
, e in seguito a Width
basato su Left
e Right
, segnalerebbe la larghezza come 1.25f
piuttosto rispetto al passato% di1.1f
.
Con le classi mutabili, le cose possono essere ancora più interessanti, dal momento che una modifica a uno dei valori correlati implicherà una modifica ad almeno un altro, ma potrebbe non essere sempre chiaro quale. In alcuni casi, potrebbe essere meglio evitare di avere metodi che "impostano" una singola proprietà in quanto tale, ma invece hanno metodi per es. SetLeftAndWidth
o SetLeftAndRight
, oppure chiarisci quali proprietà vengono specificate e quali cambiano (ad esempio MoveRightEdgeToSetWidth
, ChangeWidthToSetLeftEdge
o MoveShapeToSetRightEdge
).
A volte può essere utile avere una classe che tenga traccia dei valori delle proprietà che sono stati specificati e che sono stati calcolati da altri. Ad esempio, una classe "momento nel tempo" potrebbe includere un tempo assoluto, un'ora locale e un fuso orario. Come con molti di questi tipi, dati due pezzi di informazione, uno può calcolare il terzo. Sapendo che quale pezzo di informazione è stato calcolato, tuttavia, a volte può essere importante. Ad esempio, si supponga che un evento venga registrato come avvenuto a "17:00 UTC, fuso orario -5, ora locale 12:00 pm" e in seguito si scopre che il fuso orario deve essere stato -6. Se si sa che l'UTC è stato registrato su un server, il record deve essere corretto su "18:00 UTC, fuso orario -6, ora locale 12:00 pm"; se qualcuno ha inserito l'ora locale da un orologio dovrebbe essere "17:00 UTC, fuso orario -6, ora locale 11:00". Senza sapere se l'ora globale o locale debba essere considerata "più credibile", tuttavia, non è possibile sapere quale correzione deve essere applicata. Se, tuttavia, il record tiene traccia di quale tempo è stato specificato, le modifiche al fuso orario potrebbero lasciare quella sola mentre si cambia l'altra.