¿Qué es un Type Object?
Según Nystrom (2009) los type object “permiten la
creación flexible de nuevas clases al crear una clase en particular, de la cual
cada instancia representa un distinto tipo de objeto”. El propósito de los type
object, según Johnson y Wolf (1996) es: Disociar instancias de sus clases, para
que esas clases puedan ser implementadas como instancias de otra clase.
¿Cuándo usar los type objects?
Según Nystrom (2009), este diseño es “muy útil cada
vez que se requiere definir una variedad o una gran cantidad de distintos tipos
de cosas, pero el sistema de tipos de lenguaje del que se está haciendo uso es
demasiado rígido”. En particular, según Johnson y Wolf (1996) conviene usar los
type objects cuando se cumpla cualquiera de estas condiciones:
- Las instancias de una clase necesitan ser agrupadas de acuerdo a sus atributos y/o su comportamiento en común.
- La clase necesita una subclase para cada conjunto, con el fin de poder implementar los atributos y/o comportamiento de cada grupo.
- La clase requiere de una gran cantidad de subclases y/o la cantidad de subclases requerida es desconocida.
- Se necesita la capacidad de crear nuevos grupos durante el tiempo de ejecución, que no fueron considerados durante el período de diseño.
- Se requiere la capacidad de cambiar la subclase de un objeto, aún después de que ésta ha sido instanciada, sin tener que convertirla en una nueva clase.
- Se necesita de la capacidad de anidar grupos recursivamente, de modo que un grupo sea un ítem en otro grupo. - Se desea la capacidad de poder crear o modificar nuevos tipos sin tener que recompilar o modificar el código.
Estructura
Según Johnson y Wolf (1996):
- Type class: es la clase de type object. Posee una instancia diferente para cada tipo de objeto.
- Type object: es una instancia de type class. Representa un tipo de objeto. Establece todas las propiedades de un objeto que son las mismas para todos los objetos del mismo tipo.
- Clase: es la clase de objeto. Representa instancias de type class.
- Objeto: es una instancia de clase. Representa un ítem único que posee un contexto único. Establece todas las propiedades de ese único ítem que pueden diferir de las propiedades de otros ítems del mismo tipo. Está asociado a un type object que describe su tipo. Delega propiedades que define su tipo a su type object.
Type Object en Python
Type Object en C++
Ventajas
Según Johnson y Wolf (1996), las ventajas de los
type objects son:
Creación de clases en tiempo de ejecución: este
diseño permite que nuevas clases sean creadas en tiempo de ejecución. Estas
nuevas clases no son exactamente clases, son instancias llamadas type objects
que son creadas por la type class, así como cualquier instancia es creada por
una clase.
- Evita la necesidad de muchas clases: el sistema ya no necesitará de numerosas clases para representar diferentes tipos de objetos. En lugar de eso, el sistema puede usar una type class y numerosos type objects.
- Cambio dinámico de tipos: el diseño permite que el objeto cambie dinámicamente su type object, que tiene el efecto de cambiar su clase. Esto es más sencillo que transformar el objeto en una nueva clase.
- Creación de subclases independientes: pueden crearse subclases independientes de typeclass y de clase.
- Type objects múltiples: el diseño le permite al objeto tener múltiples type objects, donde cada uno define alguna parte del tipo de objeto. El objeto entonces debe decidir qué tipo de comportamiento delegar a qué type object.
Desventajas
Según Johnson y Wolf (1996), las desventajas de los type objects son:
- Complejidad de diseño: el modelo factoriza un único objeto lógico en dos clases. La relación entre estas dos últimas clases, el objeto y su tipo, es difícil de comprender. Esto es confuso para los programadores y creadores de modelos que no estén familiarizados con los type objects. Es difícil reconocer o describir la relación entre type object y object. Esta confusión repercute tanto en la simplicidad como en la mantenibilidad. En otras palabras: “usa herencia, es más sencillo”.
- Complejidad de implementación: el modelo extrae las diferencias de implementación de las subclases y las coloca en el estado de las instancias de type object. Donde cada subclase podía implementar un método de distintas formas, ahora la type class sólo puede implementar el método de una única manera y cada estado de los type objects debe hacer que la instancia se comporte de forma distinta.
- Manejo de referencias: cada objeto debe mantener una referencia con su type object. Así como un objeto sabe cuál es su clase, un objeto sabe cuál es su type object. Pero donde sea que el sistema o el lenguaje establezca automáticamente y mantenga la relación clase-instancia, la aplicación debe establecer y mantener por sí misma la relación type object-object.
Este modelo “busca cambiar la
definición de “tipo” desde el imperativo pero rígido lenguaje del código al más
flexible mundo de objetos en la memoria”. El mismo autor se refiere a que la
flexibilidad es buena, pero pierdes ciertas ventajas al alojar tus tipos en la
memoria:
- El seguimiento de los type objects debe ser realizado manualmente: una de las ventajas de usar algo parecido a los tipos del sistema de c++ u otros lenguajes de programación orientados a objetos es que el compilador se encarga de registrar todas las clases automáticamente. Los datos que definen cada clase son automáticamente compilados dentro del segmento de memoria estática del ejecutable y simplemente funciona. Cuando se usa el modelo de type objects, el programador es responsable no sólo de los type objects, sino de las type class es el programador quien debe asegurarse que las type class se registren en la memoria y que los type objects sean correctamente inicializados. En pocas palabras, el programador se libra de algunas limitaciones o restricciones del compilador, pero el costo es que debe reimplementar algunas de las acciones que el compilador suele hacer por el programador.
- Es difícil definir el comportamiento de cada tipo: a través de las subclases, el programador puede sobrescribir un método y hacer lo que desee hacer (llamar otros códigos, calcular valores a través de procedimientos, entre otros.) En cambio, cuando se usa el modelo de los type objects, se reemplaza un método sobrescrito con un miembro variable. Esto hace que sea muy sencillo utilizar type objects para definir datos específicos de un tipo, pero se hace difícil definir el comportamiento específico del mismo tipo. Hay algunas formas en las que se puede eludir esta limitación. Una de las soluciones es contar con un set de comportamientos predefinidos y luego usar los datos en el type object para seleccionar sencillamente uno de esos comportamientos. Una solución más potente es soportar completamente la definición de los comportamientos en la data.
En el siguiente vídeo se explica la implementan del diseño y desarrollo de Type Object
Comúnmente conocemos a la herencia como la mejor opción para reutilizar el código y se dice que es sencilla, sin embargo conlleva ciertos problemas porque pueden haber atributos o métodos que son distintos para algunas clases, así como también hay lenguajes de programación que no nos permiten la herencia múltiple; es por esto que implementar type object ayuda mucho a los programadores , porque se crean clases de clases y el objeto solo debe instanciar la clase que se acople a sus características o atributos. Puede que lo veamos como una estructura un tanto compleja y en principio se haga complicado entender la relación entre clases al momento de programar, pero al comprender correctamente el funcionamiento del type object en mi opinión es una práctica recomendable.
ResponderBorrarBuenas compañeros mi pregunta surge por si se desea incorporar mas características a un objeto en específico, ¿seria necesario crear otro type object o solo se adicionan esas características al ya existente?
ResponderBorrarHasta ahora se presume que una vez que un objeto es creado y unido a su type object, no puede cambiarse esa unión. El tipo con el que un objeto es creado es el mismo con el que un objeto muere. Esto, sin embargo, no es estrictamente necesario. Se puede permitir a un objeto cambiar su tipo en el tiempo, de esta misma forma con respecto a tu pregunta, lo más recomendable seria crear un objeto nuevo con las características que deseas o las nuevas características para así relacionarlo directamente con el type object.
BorrarEs impresionante cómo la evolución de la programación nos permite la realización e implementación de líneas de código de una manera precisa, logrando así la eliminación de la abundancia de datos o de clases (como lo es en éste caso) que permiten un mejor desarrollo sólo si se sabe cómo utilizar las herramientas.
ResponderBorrarHola compañeros!! Es posible utilizar un objeto que contenga ciertas características pertenecientes a una clase o sub-clase en Type Object?
ResponderBorrarEl proceso que conocemos comúnmente de instanciación de objetos. No pueden ser utilizado en las type class, puesto que estas clases son creadas por el propio programador, tanto las type classs como los type object posee un seguimiento manual por parte del programador, por lo tanto solo se puede hacer el llamado o uso en objetos desde las type class creados por el programador.
BorrarA pesar de poco intuitivo al principio este patrón de diseño es sumamente útil al momento de desarrollar código que tenga una gran cantidad de clases y objetos, ya que permite una agrupación mas concreta de estas, agregando mas contexto a la definición de estos objetos, permitiendo el intercambio de datos entre ellos mucho mas sencillo.
ResponderBorrarEs interesante aprender cada día algo nuevo sobre el mundo dela programación, los type object son ideales al momento de ahorrar tiempo y reducir líneas de código, por medio de esta evaluación, recientemente leí acerca de que el modelo de los type object permiten al programador construir su propio tipo de dato, como si estuviera creando su propio lenguaje de programación. La ventaja más importante que puedo mencionar según la información suministrada, es que los type object permiten la modificación de métodos y atributos sin tener que recompilar todo el Código nuevamente, permitiendo así la creación dinámica de clases.
ResponderBorrarSegún la información suministrada y toda la indagación que hicieron para llegar a este contenido, que recomiendan ustedes, ¿encapsular o exponer los type object al momento de su creación?
ResponderBorrarExponer los type object, gracias a las ventajas que presenta el modelo y su ejecución durante el recorrido de un programa, se tiene una mejor interacción con el código abierto del proyecto y una mejor reducción de código...
BorrarYa que se habla que la elaboración de los type objects se realiza de forma dinámica y que se almacenan todas en memoria ¿es posible que se encuentren problemas de un mayor uso de RAM en comparación a utilizar otros patrones de desarrollo?
ResponderBorrarLa ejecución dinámica tanto de type class o type object por la estructura que maneja, no se realiza un mayor uso de memoria debido a que utiliza el mismo espacio de memoria que utilizaría cualquier otra herramienta de desarrollo...
BorrarLa utilización de este patrón de diseño cuenta con unos requerimientos bastante específicos que nos ayuda a determinar con facilidad cuando es útil su aplicación. Particularmente no la usaría en mi proyecto, ya que no preciso tantas instancias ni clases, pero es bueno tenerlo en consideración para futuros proyectos.
ResponderBorrarBuenas, ¿En que tipo de situación sería pertinente utilizar el type object multiple?
ResponderBorrarBuenas, es recomendable cuando se tiene un gran numero de variables o características relacionadas a objetos y sobre todo en proyectos donde pueden llegar a cambiar o agregar funciones en algún determinado tiempo...
BorrarTeniendo en cuenta que es una practica muy útil, ¿Que ventaja tiene la implementacion de los Type object en el desarrollo de software sobre la Herencia? ¿O puedo utilizar los type object dentro de la Herencia?
ResponderBorrarBuenas, los type objecto son una herramienta que trabaja de manera diferente a lo que seria la herencia, por lo tanto no puedes usar los type object dentro de la herencia, pues estos tienen su propia estructura durante la ejecución de un, programa. Mientras que la herencia se realiza de una clase padre a unas clases hijas, el type object proviene de un type object principal, y su correspondiente Type class, los type object se relacionan directamente con la funcionalidad que se desea usar en un determinado tiempo del programa.
Borrar¿Que función tienen la clase y el objeto con respecto al al typeclass y typeobject?
ResponderBorrarlas clases y objetos que conocemos comúnmente en programación no se manejan de la misma forma que los type class y los type object, puesto que cada uno de estos se definen dependiendo de una estructura formada por el programador de forma manual. Por lo tanto no puedes realizar un llamado de un objeto común en una type class y viceversa.
BorrarDesde siempre se ha buscado las buenas prácticas de diseño en el mundo de la programación el type objct no es la excepcion, está técnica según lo estudiado permite crear clases dinámicamente Durante el tiempo de ejecución y capacitación al sistema para establecer sus propias normas o regalas de comprobación guiando a los sistemas para que sean más simples y sin tantas líneas de código.
ResponderBorrar¿El type object se puede aplicar con facilidad en todos los lenguajes de programación? o existen unos en donde sea mas fácil su aplicacion que en otros?
ResponderBorrarC++ y Java, son los lenguajes más factibles para aplicar Type Object, para los demás lenguajes orientados a objetos también se puede pero hay que tomar en cuenta el uso de variantes lo que generar tener un trabajo tedioso a la hora de implementarlos, pero si es posible y a largo plazo genera tener una estructura en el codigo mucho más eficiente.
BorrarTambién se dice que un tipo de objeto (también conocido como objeto de envoltura ) es un tipo de datos que se utiliza en la programación orientada a objetos para envolver un tipo que no es objeto y hacer que se vea como un objeto dinámico, que además facilita la creación de subclases independientes, ya que pueden crearse subclases independientes de typeclass y de clase.
ResponderBorrarSabemos que hay lenguajes de programación que no nos permiten la herencia multiple, por eso usamos type object ya que se crean clases de clases y esas clases a su vez pueden ser implementadas como instancia de otra clase. Dando así una solución a la problematica.
ResponderBorrarSabemos que tenemos ciertas condiciones que cumplir para aplicar el type object según Johnson y Wolf. Pero se podría aplicar type object aún cuando no se cumplan ciertas condiciones? Sería igual de beneficioso ?
ResponderBorrarBuenas, las condiciones son específicamente para obtener un comportamiento coherente a la hora de utilizar esta metodología, por ende si trabajas en un proyecto donde no se cumplen estas condiciones, no se van a obtener los beneficios por la importancia que tiene cada una de las características condicionales, para obtener un funcionamiento armónico del type object es necesario que estas estén presentes...
BorrarInteresante como se puede verificar el tipo de objeto en java, bastante importante cuando se está procesando una colección como una matriz que contiene más de un tipo de objeto.
ResponderBorrarInteresante como el modelo de typeobjects permite al programador construir su propio tipo de dato, como si estuviera creando su propio lenguaje de programación. asingarles ciertas caracteristicas especiasles segun el uso para el que se necesite.
ResponderBorrarPregunta: ¿Rosagela Francisco No intervino en esta actividad?
ResponderBorrar