Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Módulo 2 - Modelado Orientado A Objetos
Módulo 2 - Modelado Orientado A Objetos
Contenido
Creando Modelos en el Diseño de Software ................................................... 2
Abstracción .................................................................................................... 11
Encapsulación ................................................................................................ 13
Descomposición ............................................................................................. 15
Generalización ............................................................................................... 16
Abstracción .................................................................................................... 18
Encapsulación ................................................................................................ 21
Descomposición ............................................................................................. 22
Generalización ............................................................................................... 26
Al finalizar este módulo, podrá:
Ahora que comprende los roles que juegan los modelos en el diseño y la
relación entre los modelos y los lenguajes de codificación, la próxima lección
se centrará en la revisión de la historia de los lenguajes de programación.
¿SABÍAS?
Lenguaje de Periodo Soluciones que ofrece el Lenguaje de Programación Cuestiones no resueltas del
Programación de tiempo lenguaje de programación
COBOL 1960s COBOL y Fortran siguieron un paradigma imperativo que dividía los programas Si se realizan cambios en los
Fortran grandes en programas más pequeños llamados subrutinas. datos, es posible que las
subrutinas se encuentren con
Como el tiempo de procesamiento de la computadora era costoso, era importante casos en los que los datos
maximizar el rendimiento del procesamiento. Para resolver este problema, se usaron globales no sean los
datos globales para que los datos se ubicaran en un solo lugar en la memoria de la esperados. Se necesita una
computadora y fueran accesibles desde cualquier lugar para un programa. Esto mejor gestión de datos para
significaba que las subrutinas solo tenían que ir a un lugar para acceder a las evitar estos problemas.
variables.
Subprograma
Subprograma B
Subprograma
A
C
Datos
Globales
Lenguaje de Periodo Soluciones que ofrece el Lenguaje de Programación Cuestiones no resueltas del
Programación de tiempo lenguaje de programación
Algol 68 Principios En la década de 1960, se utilizaron datos globales. Sin embargo, cualquier cambio en Hacia mediados de la década
Pascal de la los datos puede generar problemas para las subrutinas. de 1970, el tiempo de
década de La solución introdujo la idea de ámbitos y variables locales: las subrutinas o los procesamiento de la
1970 procedimientos podían tener cada uno sus propias variables. computadora se volvió menos
costoso. Al mismo tiempo, la
mano de obra humana era
más costosa y se convirtió en
el factor que consumía más
tiempo en el desarrollo de
software. Los avances en el
procesamiento informático
permitieron plantear
problemas más complejos a
las computadoras. Pero
Estos lenguajes admitían el uso de tipos de datos abstractos, definidos por el también significaba que el
programador y no integrados en el lenguaje. Esta es una agrupación de información software estaba creciendo
relacionada que se denota con un tipo. Esto permite que la información sea organizada rápidamente y tener un
de una manera significativa. archivo para mantener los
Al tener datos agrupados y pasados a diferentes procedimientos mediante el uso de programas era difícil de
tipos de datos, esto significa que un procedimiento puede ser el único que modifica mantener.
una parte de los datos. Ya no es necesario preocuparse de que los datos sean alterados
por otro procedimiento.
Lenguaje de Periodo de Soluciones que ofrece el Lenguaje de Programación Cuestiones no resueltas del lenguaje
Programación tiempo de programación
C Mediados A mediados de la década de 1970, las computadoras eran más rápidas y No es fácil que un tipo de datos
Modula-2 de la capaces de abordar problemas más complejos. Sin embargo, esto significaba abstracto herede de otro en estos
década de que los programas del pasado se estaban volviendo demasiado grandes para lenguajes. Esto significa que aunque
1970 mantenerlos. Esto condujo a nuevos lenguajes, que proporcionaron un se pueden crear tantos tipos de
medio para organizar programas en archivos separados y permitieron a los datos como se desee, no se puede
desarrolladores crear más fácilmente copias múltiples, pero únicas, de tipos declarar un tipo como extensión de
de datos abstractos. otro.
Abstracción
Una abstracción debe seguir la regla del menor asombro. Esta regla sugiere
que los atributos y comportamientos esenciales deben capturarse sin
sorpresas ni definiciones que queden fuera de su alcance. Esto evita que las
características irrelevantes se conviertan en parte de una abstracción y ayuda
a garantizar que la abstracción tenga sentido para el propósito del concepto.
Los datos de un objeto solo deben contener lo que es relevante para ese
objeto. Por ejemplo, un objeto león “sabe” qué comida caza pero no sabe qué
animales viven en un continente diferente, porque esos no son datos
relevantes. Por lo tanto, una clase solo sabe qué atributos o datos son
relevantes para ella.
Implementación modificable
Caja negra
Descomposición
Cada tipo diferente de parte dentro de un todo puede prescribir una clase,
por lo que podemos mantener nuestras partes mejor organizadas y
encapsuladas por sí mismas. La clase del objeto completo se relaciona
entonces con las clases de los objetos parciales constituyentes.
Un todo puede tener un número fijo o dinámico de cierto tipo de parte. Si hay
un número fijo, entonces durante la vida útil del objeto completo, tendrá
exactamente esa cantidad del objeto parcial. Piense en un horno con cuatro
quemadores. El número de quemadores es fijo para el objeto del horno.
Algunas partes, por otro lado, pueden tener un número dinámico. Esto
significa que todo el objeto puede obtener nuevas instancias de esos objetos
parciales durante su vida útil. Piense en artículos de comida dentro de un
objeto refrigerador; estos pueden cambiar de un día a otro.
Tenga en cuenta que una parte también puede servir como un todo, que se
compone de otras partes constituyentes. Por ejemplo, una cocina es una parte
de una casa. Pero la cocina puede estar compuesta por otras partes, como un
horno y un frigorífico.
Las cosas enteras también pueden contener partes que se comparten con
otro todo al mismo tiempo. Sin embargo, a veces compartir una parte no es
posible o no es la intención.
Generalización
Es posible que varias clases secundarias hereden de una sola clase principal.
Esas múltiples clases secundarias recibirán todos estos atributos y
comportamientos comunes, aunque es probable que cada clase secundaria
tenga atributos y comportamientos adicionales que les permitan
especializarse más en lo que pueden hacer.
Nota:
Un buen consejo para recordar al nombrar superclases y subclases:
aunque las clases pueden recibir el nombre que desee, es una buena
práctica nombrarlas según las cosas que está tratando de modelar.
¡Esto hace que el código sea más fácil de entender!
Abstracción
Alimento
idSupermercado: String
nombre: String
fabricante: String
fechaCaducidad: Date
precio: double
esOferta (): boolean
Nombre de la clase
Propiedades
Operaciones
Notará que los diagramas de clases distinguen una diferencia entre las
responsabilidades que se convierten en propiedades y las responsabilidades
que se convierten en operaciones, mientras que las tarjetas CRC las
enumeran juntas. Ayudar a distinguir esta ambigüedad hace que los
diagramas de clases sean más fáciles de traducir a código para un
programador.
}
}
Encapsulación
Estudiante
-promedio: float
-carrera: String
+getPromedio(): float
+setPromedio ( float )
+getCarrera (): String
+setCarrera( String )
Descomposición
• Asociación
• agregación
• composición
La asociación indica una relación suelta entre dos objetos, que pueden
interactuar entre sí durante algún tiempo. No dependen el uno del otro; si se
destruye un objeto, el otro puede seguir existiendo y puede haber cualquier
cantidad de cada elemento en la relación. Un objeto no pertenece a otro y
pueden tener números que no están vinculados entre sí.
Persona Hotel
0..* 0..*
La línea recta entre los dos objetos UML indica que existe una relación entre
los dos objetos UML de persona y hotel, y esa relación es una asociación. El
“cero, punto, punto, asterisco” (0...*) en el lado derecho de la línea muestra
que un objeto Persona está asociado con cero o más objetos Hotel, mientras
que la “cero, punto, punto, asterisco” en el lado izquierdo de la línea muestra
que un objeto Hotel está asociado con cero o más objetos Persona.
En este diagrama, se vuelve a utilizar una línea recta para simbolizar una
relación entre el objeto Avión comercial y el objeto Miembro de la tripulación.
El “cero punto, punto, asterisco” (0..*) se utiliza para mostrar nuevamente
que un objeto puede tener una relación con cero o más del otro objeto. En
este caso, el “cero, punto, punto, asterisco” en el lado derecho de la línea
indica que un objeto Avión comercial podría tener cero o más miembros de la
tripulación. El “cero, punto, punto, asterisco” en el lado izquierdo de la línea
indica que cero o más objetos Avión comercial pueden tener un objeto
Miembro de la tripulación. El rombo vacío indica qué objeto se considera el
todo y no la parte en la relación.
La agregación también se puede representar en código Java.
public AvionComercial () {
tripulacion = new ArrayList<MiembroTripulacion>();
}
public void add( MiembroTripulacion miembroTripulacion) {
…
}
}
Composición
public Casa(){
habitacion = new Habitacion ();
}
}
Generalización
Animal
#numeroPatas: int
#numeroColas: int
#nombre: String
+caminar()
+correr()
+comer()
Leon
+ rugir()
En este diagrama, la clase Leon es la subclase y la clase Animal es la superclase.
La subclase hereda todos los atributos y comportamientos de la superclase.
Como se explicó anteriormente, no es necesario colocar todos los atributos y
comportamientos de la superclase en la subclase del diagrama de clases UML.
También puede notar el uso de un símbolo #. Esto simboliza que los atributos
del Animal están protegidos.
Tipos de herencia
Por ejemplo, la clase Animal podría ser una superclase de varias subclases:
una clase León, una clase Lobo o una clase Ciervo. Cada una de estas clases
puede tener comportamientos o características especializados, por lo que un
objeto León sabe cómo rugir, pero puede no saber cómo aullar, como un
objeto Lobo.
Las subclases también pueden ser una superclase para otra clase. La herencia
puede filtrarse a través de tantas clases como se desee.
Herencia de interfaz
Otros lenguajes como C++ admiten la herencia múltiple. Esto es cuando una
subclase puede tener dos o más superclases. Java aborda la restricción de la
herencia de implementación única al ofrecer herencia de interfaz, otra forma
de generalización. Para entender eso, primero es necesario explicar algunas
nociones de lenguaje de programación y diseño.
Una clase denota un tipo para sus objetos. El tipo indica lo que estos objetos
pueden hacer a través de métodos públicos. Al modelar un problema, puede
ser necesario expresar relaciones de subtipificación entre dos tipos. Por
ejemplo, las instancias de una clase Leon son objetos clasificados como Leon,
que pueden realizar comportamientos de león especializados. Un tipo Leon
también puede ser un subtipo de un tipo Animal. Por lo tanto, un objeto Leon
es de tipo León y de tipo Animal: un objeto Leon se comporta como un león y
como un animal. Por lo tanto, un león “es” un animal.
Una interfaz Java también denota un tipo, pero una interfaz solo declara
firmas de métodos, sin constructores, atributos o cuerpos de métodos.
Especifica los comportamientos esperados en las firmas del método, pero no
proporciona ningún detalle de implementación.
También se puede utilizar una interfaz Java para subtipificar. Si una clase
implementa una interfaz, entonces la clase no solo se comporta como sí
misma, sino que también se espera que se comporte de acuerdo con las firmas
de métodos enumeradas en la interfaz. La clase debe proporcionar los detalles
del cuerpo del método sobre lo que significa implementar la interfaz. Una
interfaz es como un contrato que debe cumplirse mediante la implementación
de clases.
En Java, la palabra clave interface se utiliza para indicar que se está definiendo
una. La letra "l" a veces se coloca antes de un nombre real para indicar una
interfaz.
Para utilizar una interfaz, debe declarar que va a cumplir la declaración tal
como se describe en la interfaz. La palabra clave en Java para esta acción es
implements.
Las interfaces tienen varias ventajas. Comprender cuáles son estas le ayudará
a determinar si debe usar interfaces o herencia al diseñar un sistema.
Al igual que las clases abstractas, que son clases de las que no se pueden crear
instancias, las interfaces son un medio en el que puede lograr el polimorfismo.
En lenguajes orientados a objetos, el polimorfismo es cuando dos clases
tienen la misma descripción de un comportamiento, pero las
implementaciones de ese comportamiento pueden ser diferentes. Un
ejemplo de esto podría ser cómo “hablan” los animales. Un león puede rugir,
pero un lobo aúlla. Ambos animales pueden hablar, pero la implementación
del comportamiento es diferente.
En este ejemplo, un vehículo solo puede viajar a lo largo del eje x o del eje y.
Pero, ¿y si queremos que un tipo de vehículo diferente, como un avión o un
submarino, también pueda moverse a lo largo de un tercer eje? Para evitar
añadir un comportamiento extra a la interfaz, para no afectar a los vehículos
que solo pueden moverse sobre dos ejes, creamos una segunda interfaz que
hereda de la primera.
Las interfaces, sin embargo, no tienen este problema. En Java, una clase puede
implementar tantas interfaces como desee. Esto se debe a que las interfaces
son solo declaraciones y no imponen una forma específica de completar estas
declaraciones, por lo que las firmas de métodos superpuestas no son un
problema. Es aceptable una implementación única para múltiples interfaces
con declaraciones superpuestas. No hay ambigüedad, ya que una clase solo
puede tener una definición de un método específico, y es la misma
implementación sin importar qué interfaz. Java evita la ambigüedad de datos
de esta manera.
Las clases pueden implementar una o más interfaces a la vez, lo que permite
varios tipos. Las interfaces le permiten describir comportamientos sin
necesidad de implementarlos, lo que permite reutilizar esas abstracciones. Las
interfaces permiten la creación de programas con código reutilizable y
flexible. Sin embargo, es importante recordar que no debe generalizar todas
las declaraciones de comportamiento en interfaces. Las interfaces satisfacen
una necesidad específica: proporcionar una forma para que las clases
relacionadas funcionen con consistencia.