Unidad 02
Unidad 02
Unidad 02
Programación I
Escuela de Ingeniería de sistemas Informáticos
01/01/2020
Escuela de Ingeniería de Sistemas Informáticos UES/FIA
Programación I
Contenido de la Unidad:
1. Programación Orientada a Objetos.
2. PE frente a POO.
3. Terminología Básica.
4. Técnicas de la POO.
5. El Lenguaje Unificado de Modelado (UML)
6. Diseño dirigido por responsabilidades.
7. Diagrama de clases
8. Diagrama de caso de uso
Introducción.
Los conceptos de la Programación Orientada a Objetos (POO) tienen origen en Simula 67,
un lenguaje diseñado para hacer simulaciones con naves aéreas. La idea surgió al agrupar
los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de
objetos de definir sus propios datos y comportamientos. Fueron refinados más tarde en
Smalltalk, desarrollado en Simula en Xerox PARC (cuya primera versión fue escrita sobre
BASIC) pero diseñado para ser un sistema completamente dinámico en el cual los objetos
se podrían crear y modificar en tiempo de ejecución en lugar de tener un sistema basado
en programas estáticos.
• Abstracción.
• Encapsulamiento y Ocultación de datos.
• Polimorfismo.
• Herencia.
• Reusabilidad o Reutilización de Código
Los programadores que emplean POO, en cambio, primero definen objetos para luego
enviarles mensajes solicitándoles que realicen sus métodos por sí mismos.
Para realizar una comparación, se listarán las ventajas y desventajas de estas dos formas de
programación:
Por ejemplo, para un objeto automóvil, algunos de sus atributos son: propietario, marca,
año de matrícula, potencia etc.
Para un objeto estudiante, algunos de sus atributos podrían ser: carnet, nombre,
carrera, asignaturas aprobadas, etc.
La identidad y estado de los objetos, tienen que ver con los atributos, y estos pueden ser
modificados por el comportamiento de los objetos.
Clase: es la representación de un conjunto de objetos del mismo tipo, es decir que los
distinguen los mismos atributos y las mismas funciones (o comportamiento).
Es la definición (o implantación) de un tipo abstracto de datos; es decir que una clase
describe no sólo los atributos de los objetos que la forman, sino que también incluye sus
procesos (funciones o comportamiento).
Según Luis Joyanes Aguilar, “una clase es una caracterización abstracta de un conjunto de
objetos”.
Métodos: son las operaciones (acciones o funciones) definidas para los objetos, y permiten
crearlos, cambiar su estado o consultar el valor de los atributos. Cuando se llama a una
operación de un objeto se interpreta como el envío de mensaje a dicho objeto. En otras
palabras, un método es una subrutina asociada a una clase.
Algunos de los diferentes tipos de método que existen son los siguientes:
Relaciones entre Clases: los objetos del medio ambiente no permanecen aislados y
separados unos de los otros, todo lo contrario se comunican entre sí para poder apoyarse
y ayudarse entre sí. De la misma forma las clases que forman parte del ambiente de un
problema se relacionan entre sí y con ello se permite que los objetos colaboren entre sí e
intercambien información.
Asociación: Es la relación más importante y común entre clases. Refleja una relación
entre dos clases independientes que se mantiene durante la vida de los objetos de
dichas clases o al menos durante un tiempo prolongado.
Composición: Este tipo de relación entre clases indica dependencia entre ellas, indica
que una clase es parte esencial de otra; es una relación mucho más fuerte que la
agregación ya que de eliminarse una clase, deja de existir la otra. Dicho de otra forma, si
la clase origen “el todo” se elimina o destruye, las otras clases (o “las partes”) también se
destruyen.
Dependencia: Esta relación indica la necesidad de una clase hacia otra, es decir que la
implantación de una clase depende de otra; los métodos u operaciones de una clase
requieren de los atributos de los objetos de la otra clase.
Herencia: Indica que una subclase hereda los métodos y atributos especificados por una
Superclase, por ende la subclase además de poseer sus propios métodos y atributos,
poseerá las características y atributos visibles de la superclase.
Si los miembros de autos o las diferencias entre autos individuales no son relevantes,
entonces se utilizan expresiones y operaciones tales como: se fabrican autos, se usan autos
para trasladarse de un lado a otro, se descompone el auto en sus partes, etc.
4.3 Polimorfismo
Es la capacidad del código de un programa para ser utilizado con diferentes tipos de datos
u objetos. También se puede aplicar a la propiedad que poseen algunas operaciones de
tener un comportamiento diferente, dependiendo del objeto (o tipo de dato) sobre el que
se aplican. Así, en un lenguaje de programación el operador “+” representa la suma de dos
números ( x + y ) de diferentes tipos: enteros, flotantes. Pero también, el mismo operador
puede definir la operación de sumar dos cadenas: concatenación. De modo similar,
suponiendo un número de figuras geométricas que responden todas al mensaje
CalcularArea; cada objeto reacciona a este mensaje haciendo el cálculo correspondiente de
la superficie, el cual difiere de una figura a otra.
Ilustración 1
4.4 Herencia
Se refiere al comportamiento y a las técnicas que garantizan que una parte o la totalidad de
un programa informático existente se puedan emplear en la construcción de otro programa.
De esta forma se aprovecha el trabajo anterior, se economiza tiempo, y se reduce la
redundancia.
La manera más fácil de reutilizar código es copiarlo total o parcialmente desde el programa
antiguo al programa en desarrollo. Pero es trabajoso mantener múltiples copias del mismo
código, por lo que en general se elimina la redundancia dejando el código reusable en un
único lugar, y llamándolo desde los diferentes programas. Este proceso se conoce como
abstracción. La abstracción puede verse claramente en las bibliotecas de software, en las
que se agrupan varias operaciones comunes a cierto dominio para facilitar el desarrollo de
programas nuevos. Hay bibliotecas para convertir información entre diferentes formatos
conocidos, acceder a dispositivos de almacenamiento externos, proporcionar una interfaz
con otros programas, manipular información de manera conocida (como números, fechas,
o cadenas de texto).
Para que el código existente se pueda reutilizar, debe definir alguna forma de comunicación
o interfaz. Esto se puede dar por llamadas a una subrutina, a un objeto, o a una clase.
En la primera mitad de la década de los 90’s, los lenguajes de modelado que imperaban
eran OMT-2 (Object Modeling Technique), creado por James Rumbaugh, OOSE (Object
Oriented Software Engineering), creado por Ivan Jacobson y Booch93, creado por Grady
Booch.
Grady Booch llamó a James Rumbaugh y formaron equipo en una nueva empresa llamada
Rational Corporation (cuyo propietario era Grady) con el objetivo de fusionar sus dos
métodos. En octubre de 1994, Grady y James comenzaron a trabajar en la unificación de
ambos métodos produciendo una versión en borrador llamada 0.8 y nombre “Unified
Method”. A partir de 1995 Jacobson se une. El primer fruto de su trabajo colectivo se lanzó
en enero de 1997 y fue presentado como versión 1.0 de UML. La gran ventaja de UML es
que fue recogiendo aportaciones de los grandes gurús de los objetos: David
Hasel con sus diagramas de estado; partes de la notación de Fusion, el criterio de
responsabilidad-colaboración y los diagramas de Rebeca Wirfs-Brock, y el trabajo de
patrones y documentación de Gamma-Helm-Johnson-Ulissides.
En 1997 OMG aceptó UML como estándar (versión 1.1) y nació el primer lenguaje de
modelado visual orientado a objetos como estándar abierto de la industria. En 1998, OMG
lanzó dos revisiones más, 1.2 y 1.3. En el año 2000 se presentó UML 1.4 con la importante
aportación de la semántica de acción, que describe el comportamiento de un conjunto de
acciones permitidas que se pueden implementar mediante lenguajes de acción. La versión
1.5 siguió a las ya citadas.
Un modelo es una abstracción de cosas reales, es decir es una simplificación del sistema
real; en pocas palabras es la representación gráfica de una situación real, mediante una
simbología que esquematiza clases, objetos, relaciones, etc. Entonces, si un modelo es la
representación gráfica de una situación real; por lo tanto, modelado implica realizar un
esquema (gráfico o dibujo).
Con un lenguaje formal de modelado, el lenguaje es abstracto aunque tan preciso como un
lenguaje de programación. Esta precisión permite que un lenguaje sea legible y que pueda
ser interpretado, ejecutado y transformado entre sistemas.
La siguiente figura presenta una forma de clasificación de los diferentes diagramas UML:
Ilustración 2
Los diagramas estructurados se utilizan para capturar la organización física de las cosas del
sistema. Por ejemplo, cómo se relacionan unos objetos con otros. Mientras que, los
diagramas de comportamiento se centran en el comportamiento de los elementos de un
sistema.
Una vez que se ha establecido la estructura de alto nivel para el modelo mediante la
identificación de las entidades y las relaciones entre , el siguiente paso es identificar las
Finalmente, se describen los patrones esperados del comportamiento del modelo por
medio de gráficos que representan los cambios a lo largo del tiempo en los valores de las
variables del sistema que se consideran más importantes.
En muchos aspectos el desarrollo del modelo conceptual es la etapa del análisis de sistemas
que presenta el mayor desafío intelectual. La mejor base para tomar decisiones (las que a
menudo son subjetivas) acerca de cuáles componentes se deben incluir en el modelo está
dada por el conocimiento acerca del sistema real.
Existen dos estrategias generales para identificar los componentes del modelo: una de ellas
consiste en incluir pocos componentes y posteriormente añadir aquellos componentes
críticos que inicialmente fueron omitidos; la otra consiste en incluir todos los componentes
que podrían ser de importancia en la etapa inicial, para luego descartar aquellos que
parecen superfluos.
Teóricamente el resultado final de las dos estrategias debería ser un modelo conceptual
con el grado mínimo de complejidad que permita abordar el problema. En la práctica es
mejor comenzar con un modelo que sea lo más simple posible.
Un Diagrama de Clases es una representación gráfica de las clases de un sistema. Sirve para
modelar el sistema en términos de sus clases, atributos y las relaciones entre estos
elementos. En el diagrama se representan los requerimientos y la arquitectura general del
sistema en estudio. Se utiliza para capturar las relaciones estáticas del software. Este tipo
de diagramas proporcionan un medio de capturar la estructura física de un sistema.
Este diagrama se utiliza en la etapa de análisis del problema y diseño de la solución. Los
símbolos más utilizados en este diagrama son:
RECTANGULO: representa una clase, dividido en tres partes, una para el nombre de la clase,
otra para los atributos y la última para los métodos o funciones.
Ilustración 3
FLECHAS: indican la relación que existe entre dos clases. Las flechas pueden ser continuas
o punteadas, pueden tener punta o no y puede ser sustituída por rombos, según sea la
relación que indique, como se verá más adelante:
Ilustración 4
Para poder distinguir una clase de otra, siempre es importante y necesario identificarlos con
un nombre que las diferencie entre sí, para los atributos y métodos debe hacerse también
esta distinción. Existen las siguientes reglas básicas o convenciones que guardar para
nombrarlos:
Para poder ejemplificar un diagrama de clases, que incluye las clases y sus relaciones, se va
a ampliar un poco más sobre las relaciones de asociación y agregación, que son las que se
utilizan con frecuencia:
Asociación
Esta relación se establece cuando dos clases tienen una dependencia de utilización, es decir
que una clase utiliza atributos y/o métodos de otra clase para funcionar, ambas clases
tienen la misma jerarquía, es decir que ninguna es parte de la otra. La relación entre clases
conocida como Asociación, permite asociar objetos que colaboran entre sí. Ejemplo:
Agregación
Con este tipo de relación se indica que un objeto forma parte de otro objeto; por ejemplo
si se tiene el objeto: computadora, esta tiene un monitor, que es otro objeto; el monitor
forma parte de la computadora; por lo tanto tienen una relación de agregación. Esta
relación también es conocida como “forma parte de …” Ejemplo:
Aquí las flechas tienen punta ya que están
inclinadas.
Ilustración 6
Un Almacén posee Clientes y Cuentas (los rombos van en el objeto que posee las
referencias, es decir el objeto que está formado por los otros: el todo y las partes). Cuando
se destruye el Objeto Almacén también son destruidos los objetos Cuenta asociados, en
cambio no son afectados los objetos Cliente asociados.
Enunciado: En un juego de dados, un jugador toma dos dados y los lanza. Luego, se suman
los valores de las caras superiores de los dados. Si el valor es 7 gana el juego, de lo contrario
pierde.
Listar clases:
• Juego de Dados
• Jugador
• Dado Atributo de cada Dado: Valor de la cara Resultado es la suma de las caras
Ilustración 7
3. Agregar asociaciones:
Ilustración 8
4. Agregar atributos:
De esta manera el Diagrama de clases, únicamente con atributos y relaciones, queda así:
Ilustración 9
Los conceptos básicos del paradigma OO son clase y objeto. En el modelo OO se combina la
estructura y el comportamiento de los datos en una única entidad, los objetos. Los objetos
son simplemente entidades que tienen sentido en el contexto de una aplicación (dominio
del problema).
Todos los objetos son ejemplares o instancias de alguna clase, los términos instancia y
objeto son intercambiables. Los objetos de una misma clase tienen las mismas
responsabilidades. Los objetos con las mismas responsabilidades pueden ser agrupados en
una clase. Las clases son abstracciones que generalizan dominios de objetos.
La POO se basa en el modelo OO. Los objetos del mundo real son representados como
objetos en el diseño y en la programación. En el modelo OO, toda entidad del dominio del
problema se expresa a través del concepto de objeto y éstos se generalizan a través del
concepto de clase. Entendemos por dominio del problema, al problema que se intenta
resolver en término de complejidades específicas, terminologías, retos, etc.
Comúnmente, como respuesta a este ejemplo se enuncia el peón, el caballo, la torre, etc.,
pero sin dudas estos son conceptos o abstracciones que agrupan a las piezas concretas que
aparecen en el juego de ajedrez, es decir, peón, caballo y torre entre otras, constituyen
clases, que entre sus responsabilidades tienen el color, la posición que ocupan, la forma de
avanzar y comer, etc. Los objetos son entonces los 16 peones (8 negros y 8 blancos), los 4
caballos, las 4 torres, el tablero, etc.
Durante una partida de ajedrez, dos peones negros que hayan sido comidos tienen
exactamente las mismas características y sin embargo son objetos distintos. Precisamente,
una de las características de los objetos que permite su identificación es su identidad.
“Identidad significa que los datos son divididos en entidades discretas y distintas,
denominadas objetos”.
Además los objetos pueden ser concretos o conceptuales, como el método de Gauss para
determinar raíces en sistemas de ecuaciones lineales.
Todo objeto tiene su propia identidad, que le es inherente, significa que los objetos se
distinguen por su propia existencia y no por las propiedades descriptivas que puedan tener.
Es esto lo que lo diferencia de los otros objetos semejantes. En otras palabras, dos objetos
son diferentes, incluso si todos los valores de sus características son idénticos.
Sin dudas que la forma de cada una de las piezas, el color, la manera de avanzar y comer,
en conclusión, las características (forma y color) y funcionalidades (manera de avanzar y
comer) de cada una de las piezas, que no son más que sus responsabilidades, facilitaron
determinar los objetos en el ejemplo anterior.
Podemos concluir que el estado de un objeto viene dado por el valor de sus características
y el comportamiento del objeto por las acciones u operaciones que realiza. Es decir las
responsabilidades podemos dividirlas en dos grupos, aquellas que determinan el estado
(atributos) y las que determinan el comportamiento (métodos).
Los atributos son valores almacenados por los objetos de una clase mientras que los
métodos son secuencias de pasos para determinar un comportamiento. Los métodos
pueden ser llamados (invocados) en principio, solamente desde dentro de la clase o a través
de una instancia u objeto de la misma.
Como se verá en secciones posteriores, es útil distinguir los métodos que tienen efectos
colaterales, es decir, que pueden cambiar el estado del objeto (métodos de
transformación), de los que apenas consultan el valor de algún atributo o realizan un cálculo
funcional sin modificar ningún el estado del objeto (método de consulta o acceso).
Los DCU se utilizan para ilustrar los requerimientos del sistema al mostrar cómo reacciona
a eventos que se producen en su ámbito o en él mismo.
Los diagramas de casos de uso parecen muy fáciles; constan de figuras de línea, líneas y
óvalos. La figura de palillos se llama actor y representa a alguien o algo que actúa sobre
el sistema. En el desarrollo de software, los actores son personas u otro software que actúa
sobre el sistema. Las líneas son punteadas o continuas, con varias flechas o sin ellas,
que indican la relación entre el actor y los óvalos. Estos últimos son los casos de uso y, en
el diagrama de casos de uso, los óvalos tienen algún texto que proporciona una descripción
básica.
Ilustración 10
Que un diagrama de casos de uso sea fácil de crear es un elogio implícito para el uml.
Hallar los casos de uso correctos y registrar sus responsabilidades en forma correcta es la
decepción. Hallar los casos de uso correctos y describirlos de manera adecuada es el
proceso crítico que impide que los profesionales en el desarrollo informático pasen por alto
necesidades críticas y que inventen de manera innecesaria. En pocas palabras, los
diagramas de casos de uso constituyen un macrorregistro de lo que usted quiere
estructurar.
Macro en este contexto sencillamente significa “grande”. Los grandes objetivos, o
macroobjetivos, son los que se mencionan como los argumentos, o razones, poderosos de
las organizaciones para hacer algo. En los diagramas de casos de uso se captan los objetivos
grandes, importantes. En el texto de esos casos se captan los detalles de apoyo.
Esto es lo que se escapa en las imágenes de las figuras de línea de los diagramas
de casos de uso; se perdía de vista que, al registrar lo que el sistema hará y
lo que no hará, se registra y especifica el alcance de lo que se está creando; también se
pierde de vista que el texto que acompaña los diagramas de casos de uso rellena los
espacios en blanco entre los macroúsos y los microúsos, en donde micro significa usos
“menores, de apoyo”. Además de registrar los usos primarios y secundarios, los diagramas
de casos de uso nos proporcionan en forma implícita varias oportunidades significativas
para administrar el desarrollo.
Símbolos de actores.
Casos de uso
El símbolo del caso de uso se utiliza para representar capacidades. Al caso de uso se
le da un nombre y una descripción mediante un texto. Este último debe describir cómo
inicia y finaliza el caso de uso, e incluye una descripción de la capacidad descrita por
el nombre de la misma, así como escenarios de apoyo y requisitos no funcionales
Ilustración 11
Dado que los diagramas de casos de uso tienen múltiples actores y en virtud de que los
casos de uso pueden estar asociados con los actores y con otros casos de uso, se utilizan
los conectores para indicar la manera en que ambos están asociados. Además, los estilos
de conectores pueden cambiar para transmitir más información acerca de la relación
entre los actores y los casos de uso. Por último, los conectores pueden tener adornos y
anotaciones que suministran incluso más información.
Existen tres estilos básicos de líneas para los conectores. Un conector de línea simple se
llama asociación y se usa para mostrar cuáles actores están relacionados con cuáles casos
de uso. Por ejemplo, en la ilustración 10 se mostró que un patrón está asociado con el caso
de uso “Crear lista de trabajos”.
Un segundo estilo de conector es una línea punteada con una flecha direccional (ilustración
12). Este estilo de conector se conoce como dependencia. La flecha apunta hacia el caso de
uso del que depende. Por ejemplo, suponga que a los patrones de www.tecoloco.comse les
debe dar acceso para crear una lista de trabajos. Entonces podemos decir que el caso de
uso “Crear lista de trabajo” depende de un caso de uso “Entrar”. Ésta es la relación que se
ilustra en la ilustración 12.
Ilustración 12
Un tercer estilo de conector es una línea dirigida con un triángulo hueco, al cual se le
conoce como generalización. La palabra generalización en el uml significa “herencia”.
Cuando mostramos una relación de generalización entre dos actores o dos casos de uso,
estamos indicando que el actor o el caso de uso “hijos” son un caso del actor o uso básico
y algo más. En la ilustración 13, se muestra una relación de generalización entre dos actores
y dos casos de uso.
Ilustración 13
Una notación común en los conectores es el estereotipo. Los estereotipos agregan detalles
a la relación entre los elementos en un diagrama de caso de uso. Por ejemplo,
en ilustración 12, donde se introdujo el conector de dependencia. Se puede usar un
estereotipo para ampliar el significado de este conector.
Anteriormente se dijo que un patrón puede crear una lista de trabajos y se ilustró con un
actor patrón, un caso de uso “Crear lista de trabajos” y un conector de asociación; sin
embargo, también se sabe que el patrón debe obtener acceso. Cuando un caso de uso
“Crear lista de trabajos” necesita los servicios de otro caso de uso —“Entrar”— entonces se
dice que el caso de uso dependiente incluye el caso de uso del que depende.
Ilustración 14
Una perspectiva valiosa aquí es quién podría estar interesado en el registro. Es evidente que
al “Solicitante de trabajo” tal vez no le interese cuántas veces se ha visto la lista,
pero un patrón previsor podría estar interesado en cuánto tráfico está generando su lista.
Pasemos ahora por un momento a un dominio diferente. Suponga que el “Solicitante de
trabajo” fuera el comprador de una casa y que la lista lo fuera de residencias. Ahora tanto
el comprador como el vendedor podrían estar interesados en el número de veces que se
ha visto la propiedad. Una casa que ha estado en el mercado durante meses puede tener
Ilustración 15
Inserción de notas
El uml es una taquigrafía para una gran cantidad de texto y de código, pero si lo necesita,
siempre puede agregar texto. Todos los diagramas, incluyendo los casos de uso, permiten
que se les agreguen anotaciones en forma de texto. Las notas se representan como un
trozo de papel con una punta doblada y una línea que une el cuadro de texto al elemento
que se le está haciendo la anotación (ilustración 16). Use las notas con moderación, porque
pueden abarrotar un diagrama y hacerlo difícil de leer.
Ilustración 16
Documentar casos de usos no es una tarea fácil que se pueda dominar de un día para otro,
requiere de tiempo, disciplina y experiencia, sin embargo podemos definir una serie de
pasos identificables para escribir los casos de uso (I, 2003).
Unidad II. Introducción a la POO Página 25 de 28
Escuela de Ingeniería de Sistemas Informáticos UES/FIA
Programación I
Referencias
Chávez, R. P. (2003). Programación orientada a objetos con c#. La Habana: Universidad de Ciencias
Informáticas.