¿Qué es una clase invariante?
En la programación y diseño informático orientado a objetos, una clase invariante es un conjunto de reglas que se pueden usar para definir si una instancia de objeto existe en un estado válido. Desde una perspectiva de diseño, una clase invariante es un conjunto de límites entre los cuales los datos dentro de un objeto deben caer para ser considerados en un estado funcional adecuado. Una clase invariante se puede definir en la documentación de diseño o en los comentarios del código fuente o, en algunos lenguajes de programación, se puede implementar directamente en un código de computadora procesable. Un programa que utiliza invariantes y aserciones codificadas puede hacer que el programa deje de ejecutarse o arroje varios errores cuando no se cumplen las condiciones invariantes. A diferencia de la verificación de errores estándar, los invariantes de clase generalmente se usan solo con el fin de garantizar que la implementación interna de una clase esté funcionando y, por lo general, no figuran en la documentación pública o en las interfaces de programación.
Desde un nivel muy básico, una clase invariante es esencialmente una colección de afirmaciones para una clase. Una afirmación, nuevamente en términos simples, es una declaración que verifica alguna parte del estado de la clase y debe evaluarse como verdadera para que la ejecución del programa continúe. Un ejemplo de una aserción es una declaración que asegura que un entero dado esté siempre entre 1 y 10. Cuando se usa una clase invariante, las aserciones se evalúan para todas las partes relevantes de los datos que posee el objeto, esencialmente validando que todos los datos en el Los objetos están dentro de los rangos definidos.
En muchos casos, el uso de una clase invariante se parece mucho a la comprobación de errores estándar, en la que las variables se miden para garantizar que se encuentren dentro de los límites utilizables o no sean nulos. Sin embargo, la diferencia entre el uso de invariantes de clase y la verificación de errores estándar es que los invariantes y las aserciones se usan predominantemente para capturar errores que no deberían ocurrir a menos que haya un defecto intrínseco en el código. Otra diferencia es que la verificación de errores estándar tiende a involucrar la recuperación y los cambios en el flujo de control del programa, mientras que el resultado de una falla invariable debería ser la finalización del programa. La razón por la cual la mayoría de los programas finalizan cuando falla una verificación de clase invariable es porque el objeto está en un estado comprometido y no puede, desde una vista de diseño, cumplir con sus precondiciones y post-condiciones necesarias para cumplir con su contrato de diseño.
Una de las propiedades de una clase invariante en los lenguajes de programación orientados a objetos en los que se definen implícitamente es que la invariante es un mecanismo heredado por cualquier subclase. Esto evita que una subclase anule las comprobaciones invariables que se realizan en la clase principal. En última instancia, esto significa que una subclase no puede romper el contrato de diseño establecido por la superclase, lo que podría causar resultados impredecibles o errores de programa difíciles de encontrar.