Dokumentacja dla klas obiektowych często wiąże się z kompromisem między zapewnieniem opiekunom klasy elastyczności w zakresie zmiany projektu, a umożliwieniem konsumentom klasy pełnego wykorzystania jej potencjału. Jeśli niezmienne klasa ma szereg właściwości, które mają pewną dokładnie związek ze sobą (na przykład Left
, Right
iWidth
właściwości prostokąta z wyrównanymi do siatki prostokątami), można zaprojektować klasę do przechowywania dowolnej kombinacji dwóch właściwości i obliczyć trzecią, lub można zaprojektować ją do przechowywania wszystkich trzech. Jeśli nic w interfejsie nie wyjaśnia, które właściwości są przechowywane, programista klasy może być w stanie zmienić projekt w przypadku, gdy byłoby to z jakiegoś powodu pomocne. Dla kontrastu, jeśli np. Dwie właściwości są ujawnione jako final
pola, a trzecia nie, wówczas przyszłe wersje klasy zawsze będą musiały używać tych samych dwóch właściwości jako „podstawy”.
Jeśli właściwości nie mają ścisłego związku (np. Ponieważ są float
lub double
raczej nie int
), może być konieczne udokumentowanie, które właściwości „definiują” wartość klasy. Na przykład, mimo że Left
plus Width
ma być równy Right
, matematyka zmiennoprzecinkowa jest często niedokładna. Na przykład załóżmy, że Rectangle
który używa typu Float
przyjmuje Left
i Width
jako parametry konstruktora są konstruowane z Left
podanymi jako 1234567f
i Width
jako 1.1f
. Najlepsza float
reprezentacja sumy to 1234568.125 [która może być wyświetlana jako 1234568.13]; następny mniejszy float
to 1234568.0. Jeśli klasa faktycznie przechowuje Left
iWidth
, może zgłosić wartość szerokości, tak jak została podana. Jeśli jednak konstruktor obliczane Right
w oparciu o przekazany w Left
i Width
, a później obliczane Width
w oparciu Left
i Right
, byłoby zgłosić szerokość jak 1.25f
zamiast jak przekazany w 1.1f
.
W przypadku klas, które można modyfikować, rzeczy mogą być jeszcze bardziej interesujące, ponieważ zmiana jednej z powiązanych ze sobą wartości spowoduje zmianę co najmniej jednej innej, ale nie zawsze będzie jasne, która z nich. W niektórych przypadkach może to być najlepiej, aby uniknąć konieczności metod, które „zestaw” pojedyncza nieruchomość jako taka, lecz obaj mają metody do np SetLeftAndWidth
albo SetLeftAndRight
, albo wyjaśnić, jakie właściwości są określone i które zmieniają się (np MoveRightEdgeToSetWidth
, ChangeWidthToSetLeftEdge
lub MoveShapeToSetRightEdge
) .
Czasami przydatne może być posiadanie klasy, która śledzi, które wartości właściwości zostały określone, a które obliczone na podstawie innych. Na przykład klasa „moment w czasie” może obejmować czas bezwzględny, czas lokalny i przesunięcie strefy czasowej. Podobnie jak w przypadku wielu takich typów, biorąc pod uwagę dowolne dwie informacje, można obliczyć trzeci. Wiedząc któryczęść informacji została obliczona, jednak czasami może być ważna. Załóżmy na przykład, że zdarzenie zostało zarejestrowane jako „o 17:00 UTC, strefa czasowa -5, godzina lokalna 12:00 pm”, a jeden później odkrywa, że strefa czasowa powinna mieć wartość -6. Jeśli wiadomo, że UTC został zarejestrowany poza serwerem, rekord należy poprawić do „18:00 UTC, strefa czasowa -6, czas lokalny 12:00”; jeśli ktoś wprowadził czas lokalny poza zegarem, powinien to być „17:00 UTC, strefa czasowa -6, czas lokalny 11:00”. Nie wiedząc jednak, czy czas globalny czy lokalny należy uznać za „bardziej wiarygodny”, nie można jednak ustalić, którą korektę należy zastosować. Gdyby jednak zapis śledził, który czas został określony, zmiany strefy czasowej mogłyby pozostawić tę jedną w spokoju, zmieniając drugą.