Документація для об'єктно-орієнтованих класів часто передбачає компроміс між наданням керівникам класу гнучкості змінити його дизайн, а також дозволяти споживачам класу повною мірою використовувати його потенціал. Якщо непорушний клас матиме ряд властивостей , які будуть мати певні точно відносини один з одним (наприклад Left
, Right
іWidth
властивості прямокутника, орієнтованого на цілі координати за сіткою), можна створити клас для зберігання будь-якої комбінації двох властивостей і обчислити третій, або можна створити його для зберігання всіх трьох. Якщо нічого про інтерфейс не дає зрозуміти, які властивості зберігаються, програміст класу, можливо, зможе змінити дизайн у випадку, якщо це може виявитися корисним з якоїсь причини. Навпаки, якщо, наприклад, два властивості виставлені у вигляді final
полів, а третій - ні, то майбутнім версіям класу завжди доведеться використовувати ті самі два властивості, що і "основу".
Якщо властивості не мають точного відносини (наприклад , тому що вони float
або double
замість int
), то це може виявитися необхідним документом , які властивості «визначити» значення класу. Наприклад, навіть якщо Left
плюс Width
має бути рівним Right
, математика з плаваючою комою часто не є точною. Наприклад, припустимо, Rectangle
що тип, який використовує, Float
приймає Left
і Width
як параметри конструктора будуються з Left
заданими як 1234567f
і Width
як 1.1f
. Найкраще float
представлення суми - 1234568.125 [яке може відображатися як 1234568.13]; наступний менший float
- 1234568.0. Якщо клас насправді зберігає Left
іWidth
, він може повідомити про значення ширини, як було зазначено. Однак, якщо конструктор обчислюється на Right
підставі переданих Left
і Width
, а потім обчислюються на Width
підставі Left
і Right
було б повідомити ширину, 1.25f
а не переданий 1.1f
.
З мінливими класами все може бути ще цікавішим, оскільки зміна одного із взаємопов'язаних значень передбачає зміну хоча б одне одного, але не завжди може бути зрозуміло, яке саме. У деяких випадках це може бути краще , щоб уникнути методів , які «набір» одна властивість , як такої, але замість того, щоб або мати методи, наприклад , до SetLeftAndWidth
або SetLeftAndRight
, або дати зрозуміти , які властивості уточнюються і які змінюються (наприклад MoveRightEdgeToSetWidth
, ChangeWidthToSetLeftEdge
чи MoveShapeToSetRightEdge
) .
Іноді може бути корисним клас, який відстежує, які значення властивостей були визначені та які були обчислені з інших. Наприклад, клас "момент у часі" може включати абсолютний час, місцевий час та зміщення часового поясу. Як і для багатьох таких типів, з урахуванням будь-яких двох відомостей, один може обчислити третій. Знаючи якийІнформація, яка була обчислена, однак, іноді може бути важливою. Наприклад, припустимо, що подія записана як така, що сталася в "17:00 UTC, часовий пояс -5, місцевий час 12:00 вечора", а одна пізніше виявляє, що часовий пояс повинен був бути -6. Якщо відомо, що UTC був записаний із сервера, запис слід виправити на "18:00 UTC, часовий пояс -6, місцевий час 12:00 вечора"; якщо хтось ввімкнув місцевий час поза годинником, він повинен бути "17:00 UTC, часовий пояс -6, місцевий час 11:00". Не знаючи, чи слід глобальний чи локальний час вважати "більш правдоподібним", однак неможливо знати, яку корекцію слід застосувати. Якщо, однак, записаний запис, який час був визначений, зміни часового поясу могли залишити цей один у спокої, змінивши інший.