La documentación para las clases orientadas a objetos a menudo implica una compensación entre darles a los mantenedores de la clase flexibilidad para cambiar su diseño, en lugar de permitir que los consumidores de la clase hagan pleno uso de su potencial. Si una clase inmutable tendrá una serie de propiedades que tendrán una cierta relación exacta entre sí (por ejemplo Left
, el Right
, yWidth
propiedades de un rectángulo alineado a la cuadrícula de coordenadas enteras), se podría diseñar la clase para almacenar cualquier combinación de dos propiedades y calcular la tercera, o se podría diseñar para almacenar las tres. Si nada sobre la interfaz deja en claro qué propiedades están almacenadas, el programador de la clase puede cambiar el diseño en caso de que hacerlo resulte útil por alguna razón. Por el contrario, si, por ejemplo, dos de las propiedades están expuestas como final
campos y la tercera no, entonces las versiones futuras de la clase siempre tendrán que usar las mismas dos propiedades como "base".
Si las propiedades no tienen una relación exacta (por ejemplo, porque lo son float
o double
no int
), puede ser necesario documentar qué propiedades "definen" el valor de una clase. Por ejemplo, aunque se supone que Left
más Width
es igual Right
, las matemáticas de coma flotante a menudo son inexactas. Por ejemplo, suponga Rectangle
que un que usa el tipo Float
acepta Left
y Width
como los parámetros del constructor se construyen con Left
dado como 1234567f
y Width
como 1.1f
. La mejor float
representación de la suma es 1234568.125 [que puede mostrarse como 1234568.13]; el siguiente más pequeño float
sería 1234568.0. Si la clase realmente almacena Left
yWidth
, puede informar el valor del ancho tal como se especificó. Sin embargo, si el constructor calculó en Right
función de la transferencia Left
y Width
, y luego calculó en Width
función de Left
y Right
, informaría el ancho en 1.25f
lugar de la transferencia 1.1f
.
Con las clases mutables, las cosas pueden ser aún más interesantes, ya que un cambio en uno de los valores interrelacionados implicará un cambio en al menos otro, pero no siempre está claro cuál. En algunos casos, puede ser mejor para evitar tener métodos que "set" una sola propiedad como tal, pero en su lugar o bien tienen métodos para por ejemplo SetLeftAndWidth
o SetLeftAndRight
, o bien dejar claro qué propiedades se están especificados y que están cambiando (por ejemplo MoveRightEdgeToSetWidth
, ChangeWidthToSetLeftEdge
o MoveShapeToSetRightEdge
) .
A veces puede ser útil tener una clase que haga un seguimiento de qué valores de propiedades se han especificado y cuáles se han calculado a partir de otros. Por ejemplo, una clase de "momento en el tiempo" podría incluir una hora absoluta, una hora local y un desplazamiento de zona horaria. Al igual que con muchos de estos tipos, dada cualquiera de las dos piezas de información, una puede calcular la tercera. Saber cualSin embargo, a veces se puede calcular información importante. Por ejemplo, suponga que un evento se registra como ocurrido a las "17:00 UTC, zona horaria -5, hora local 12:00 pm", y luego se descubre que la zona horaria debería haber sido -6. Si se sabe que el UTC se registró en un servidor, el registro debe corregirse a "18:00 UTC, zona horaria -6, hora local 12:00 pm"; si alguien ingresó la hora local de un reloj, debería ser "17:00 UTC, zona horaria -6, hora local 11:00 am". Sin saber si la hora global o local debe considerarse "más creíble", sin embargo, no es posible saber qué corrección debe aplicarse. Sin embargo, si el registro lleva un registro de la hora especificada, los cambios en la zona horaria podrían dejarlo solo mientras se cambia el otro.