Java avanzado y diseño orientado a objetos
Conceptos avanzados de la programación orientada a objetos
1. El tipado de las variables
El tipado consiste en conferir un tipo a todas las variables de un programa. Este tipo denota el conjunto de valores permitidos para esta variable. En Java, toda variable debe estar asociada a un tipo, es decir, debe estar tipada.
Es preciso conocer el tipo de una variable para que el compilador pueda determinar el conjunto de métodos y de atributos accesibles del objeto que está referenciado por la variable. El compilador rechazará compilar todo código que intente acceder a otro método o a otro atributo.
Además del tipo, el compilador tiene también en cuenta los criterios de visibilidad, que no abordaremos aquí.
En Java, las clases constituyen tipos. De este modo, el compilador conoce los métodos y atributos accesibles. Una variable tipada por una clase puede referenciar a las instancias de esta clase, es decir, a sus instancias directas, así como a las instancias de sus subclases.
Una clase abstracta, que no posee instancias directas, constituye también un tipo. El conjunto de instancias de dicha clase estará formado por el conjunto de instancias de sus subclases.
Una interfaz constituye también un tipo. Igual que con una clase, el compilador puede, de este modo, determinar los métodos accesibles. El conjunto de objetos que pueden referenciarse mediante una variable tipada por una interfaz está formado por el conjunto de instancias de clase que implementan directa o indirectamente esta interfaz.
Java dispone de otros tipos, llamados tipos de datos primitivos, a saber: byte, short, int, long, float, double, boolean y char. Conocer el tipo de una variable permite, aquí también, conocer el conjunto de valores posibles. Dicho tipo permite asimismo conocer las operaciones aplicables.
La noción de tipo, tal y como la acabamos de presentar, solo la utiliza el compilador. Desaparece en tiempo de ejecución. Se trata de un tipado estático y, consecuentemente, de una noción de tipo estático.
2. El vínculo dinámico
Cuando se invoca un método de un objeto, el vínculo dinámico consiste en encontrar el código de dicho método recorriendo la jerarquía de clases hacia arriba, a partir de la clase de instanciación del objeto. El punto de partida está...
Los principios del diseño orientado a objetos
1. La reificación
El diseño orientado a objetos de una aplicación empieza por descubrir las entidades del mundo real que intervienen en el dominio de dicha aplicación. Por ejemplo, en el marco de una aplicación de gestión de una red eléctrica, las entidades del mundo real son las máquinas de producción, los transformadores, los puestos eléctricos, las líneas de transporte, los consumidores, las interconexiones con las demás redes, etc. Estas entidades son susceptibles de ser representadas mediante objetos en la aplicación y, por consiguiente, reificadas.
Reificar es representar, durante el diseño de una aplicación, una cosa mediante un objeto. Una cosa puede ser un objeto del mundo real que podemos diseñar. Una cosa también puede ser una entidad abstracta, como un reglamento, una disposición, un evento, un proceso, un escrito, un contexto, un estado, etc.
El diseño orientado a objetos no impone reificar todas las entidades del dominio de una aplicación, sino únicamente las que intervienen en las funcionalidades que debe implementar y que son necesarias para realizar estas funcionalidades.
Tomemos el caso concreto de una contabilidad. El conjunto de entidades del dominio contiene, en particular, las escrituras, el plan general contable y las cuentas de terceros (clientes, proveedores, etc.), las tablas de correspondencia entre las cuentas y las partidas (categorías) del balance y cuenta de resultados.
Una aplicación cuya funcionalidad es la exportación de escrituras contables necesitará la reificación de las escrituras y del plan general contable, así como de las cuentas de terceros (el plan contable sirve para transmitir las etiquetas de estas cuentas).
Una aplicación de edición del informe y cuenta de resultados requiere la reificación de las escrituras y de las tablas de correspondencia entre las cuentas y las partidas del balance y cuenta de resultados.
2. El diseño modular
El diseño modular en los lenguajes orientados a objetos constituye uno de los fundamentos de la construcción de las clases. A diferencia de los lenguajes de programación procedimentales, donde los procesamientos se dividen en procesos independientes de las entidades, en la programación...