Unidad 10 - UTN Fundamentos de Programación
Unidad 10 - UTN Fundamentos de Programación
Unidad 10 - UTN Fundamentos de Programación
PROGRAMACIÓN
MÓDULO 3 - UNIDAD 10
Pilares de la OO
Presentación:
En esta Unidad profundizamos los conceptos, siguiendo con los temas vistos
anteriormente, agregando nuevos contenidos.
Se analizará uno de los principios o pilares más poderosos y que vuelve distintivo al
paradigma OO: la Herencia. Este mecanismo permite la reutilización de clases, siendo
este uno los objetivos de la POO.
Entre otros temas, se verá también el concepto de sobrecarga de métodos, otro de los
componentes distintos de la POO. Con respecto a la sobrecarga de operadores, sólo lo
analizaremos conceptualmente debido a la complejidad que implica representarlo con
pseudocódigo.
Objetivos:
Bloques temáticos:
1. Modificadores de acceso
3. Sobrecarga de operadores
4. Sobrecarga de métodos
En esta Unidad los participantes se encontrarán con diferentes tipos de actividades que,
en el marco de los fundamentos del MEC*, los referenciarán a tres comunidades de
aprendizaje, que pondremos en funcionamiento en esta instancia de formación, a los
efectos de aprovecharlas pedagógicamente:
Es importante que todos los participantes realicen algunas de las actividades sugeridas y
compartan en los foros los resultados obtenidos.
El carácter constructivista y colaborativo del MEC nos exige que todas las actividades
realizadas por los participantes sean compartidas en los foros.
Tomen nota
Las actividades son opcionales y pueden realizarse en forma individual, pero siempre es
deseable que se las realice en equipo, con la finalidad de estimular y favorecer el trabajo
colaborativo y el aprendizaje entre pares. Tenga en cuenta que, si bien las actividades
son opcionales, su realización es de vital importancia para el logro de los objetivos de
aprendizaje de esta instancia de formación. Si su tiempo no le permite realizar todas las
actividades, por lo menos realice alguna, es fundamental que lo haga. Si cada uno de los
participantes realiza alguna, el foro, que es una instancia clave en este tipo de cursos,
tendrá una actividad muy enriquecedora.
Asimismo, también tengan en cuenta cuando trabajen en la Web, que en ella hay de todo,
cosas excelentes, muy buenas, buenas, regulares, malas y muy malas. Por eso, es
necesario aplicar filtros críticos para que las investigaciones y búsquedas se encaminen a
la excelencia. Si tienen dudas con alguno de los datos recolectados, no dejen de consultar
al profesor-tutor. También aprovechen en el foro proactivo las opiniones de sus
compañeros de curso y colegas.
1. Modificadores de acceso
Retomando el concepto de encapsulamiento visto en la Unidad anterior, nos encontramos
con su implementación que son los modificadores de acceso. Estos permiten al creador
de las clases poner un límite a los estados o comportamientos a los cuales puede acceder
otra clase que la invoque.
Por lo tanto, se puede decir que los modificadores de acceso son la implementación
concreta del encapsulamiento.
1.1 Paquetes
Antes de continuar con los tipos de modificadores, tenemos que hacer referencia a los
“paquetes” (o “package”, en inglés), concepto presente en la mayoría de los lenguajes de
programación OO.
Un paquete es un conjunto de clases. Su uso está destinado a agrupar las clases de alguna
forma, o bajo cierto criterio claro, que tenga sentido.
Por coherencia funcional: este tipo de agrupación hace referencia a juntar clases
que tienen una afinidad a nivel de “negocio”, o sea, a partir de qué parte del
problema, funcionalmente hablado, se está resolviendo con ese grupo de clases.
Por ejemplo, si estamos modelando una ferretería, podríamos agrupar las clases
relacionadas a las herramientas mecánicas por un lado, las herramientas manuales
por otro, los artículos de electricidad por otro, etc. Cada uno de estos serían
paquetes, que contendrían clases del estilo “taladro”, “amoladora” en el primer
conjunto, “destornillador” y “llave inglesa” en el segundo, y “alargue” y “enchufe” en
el último grupo, o paquete.
Por coherencia de acción: aquí se separan las entidades modeladas según su
función a nivel lógico. Por ejemplo, las clases que representan una entidad por un
lado, clases que modifican entidades por otro, clases que muestran reportes de las
entidades por otro, etc. Este es el tipo de uso más común en sistemas de pequeña
escala.
Doble combinación: es una combinación de las dos anteriores, pudiendo una
contener a la otra, indistintamente. Este es el tipo de agrupación en paquetes para
sistemas medianos a grandes.
Los paquetes, con los cuales se puede hacer una analogía con los directorios o carpetas
de un sistema operativo, también permiten duplicar los nombres de las clases, de la
misma manera que podemos tener dos planillas de Excel con el mismo nombre, en
carpetas diferentes. Aunque esta práctica no es recomendable dado que se puede prestar
a confusión cuál es la clase que realmente nos interesa usar o modificar, en caso de
haber más de una con el mismo nombre.
Por ejemplo:
- Sistema Tienda
- Paquete Almacén
- …
- Paquete Ferretería
- Paquete Herramientas Mecánicas
Clase Taladro
Clase Amoladora
- Paquete Herramientas Manuales
Clase Destornillador
Clase Llave Inglesa
- Paquete Artículos Electricidad
Clase Enchufe
Clase Alargue
- Paquete Cajas
- …
De esta forma podemos ver cómo se estructura los paquetes: un sistema (una aplicación)
podrá contener paquetes los cuales, a su vez, podrán contener otros paquetes y/o clases.
Esto paquetes también podrán tener paquetes y/o clases y así en forma a priori indefinida.
Los paquetes se suelen identificar en la primera línea de código de cada clase, ya que es
la primera información que un compilador espera encontrar.
miAtributo = “Holas!”
retornar: miAtributo
fin metodo
fin clase
Éstas serán las convenciones y palabras reservadas que utilizaremos en este curso, que
guardan una gran similitud con los lenguajes de programación OO actuales.
Cuando se está creando una clase (o antes, idealmente) debe pensarse para qué y para
quiénes se la está creando, en relación a qué atributos y métodos (sobre todo) se debería
tener acceso y a cuales no; cuáles son las porciones de líneas de código que son parte
interna del problema y es posible (y hasta recomendable) ocultar y a qué nivel. No todo
debería ser público, ya que se agrega complejidad a la programación. Así como tampoco
no todo debería ser privado, porque estaríamos creando entes aislados sin interacción, lo
que tampoco tendría sentido.
fin clase
ACTIVIDAD 1:
¿Cómo se relacionan los conceptos de ENCAPSULAMIENTO, los MODIFICADORES DE
ACCESO y los métodos tipo “GETTER”?
Con respeto a la clase padre se dice que una clase general y su hija
una clase más específica, en el sentido en que la heredera toma el
estado y comportamiento de la otra, aunque agregando su propio
estado y comportamiento específico, de la misma forma que una
persona toma la información genética de sus progenitores, a la cual le suma su
propia estructura genética.
fin clase
fin clase
fin clase
De esta forma tenemos una herramienta poderosísima para crear código de calidad.
Imaginen que por un momento no pudiéramos heredar estado y/o comportamiento, lo que
nos llevaría a tener los atributos y sus correspondientes métodos replicados (copiados,
por triplicado) en estas tres clases.
Probablemente no cambie nunca el tipo de dato del DNI, aunque recordemos las
siguientes situaciones:
En caso de haber tenido objetos que modelaran esas entidades, seguramente el costo de
“refactoring” (re trabajo) hubiera sido menor. Y estamos mencionando grandes cambios,
prácticamente emblemáticos. Cuando a diario nos encontramos con cambios de
resoluciones del BCRA (Banco Central de la República Argentina), la AFIP, regulaciones
provinciales o municipales, por nombrar algunas entidades públicas, aunque sin dejar de
lado modificaciones en el ámbito privado, a través de cambios en estándares
internacionales, tendencias de los mercados, el crecimiento de una organización que le
lleva replantear sus procesos y sistemas, etc.
Este tipo de herencia, en la cual existe una clase padre y n clases hijas, recibe el nombre
de herencia simple, para diferenciarla del caso que analizaremos a continuación. Vale
aclarar que no existe un límite en cuanto a la “profundidad” del árbol de herencia (padre,
hijo, nietos, bisnietos, etc., son permitidos).
ACTIVIDAD 2:
Investigue y exprese su opinión (fundamentada y citando las fuentes consultadas) sobre
la idea de la “reutilización de código en la programación orientada a objetos” en relación
con el concepto de HERENCIA.
¿Qué es la reutilización de código? ¿Es importante o accesoria y porqué? ¿Cómo se
relaciona con la Herencia?
Sin embargo, la herencia múltiple ha sido muy criticada con el correr de los años, debido a
diferencias entre los creadores de los lenguajes que, en cierto punto, terminan siendo
discusiones más filosóficas que tecnológicas. Los que rechazan su uso alegan altas
posibilidades de fallas por conflictos con los nombres de atributos y métodos, lo que
podría generar comportamientos no esperados o controlados.
fin clase
clase publica Herbivoro heredaDe Animal clase publica Carnivoro heredaDe Animal
fin clase
ACTIVIDAD 3:
¿Cuáles podrían ser los problemas, limitaciones o inconvenientes de la utilización de la
herencia múltiple? Investigar sobre los motivos por los cuales lenguajes como Java la han
desestimado.
3. Sobrecarga de operadores
Los operadores son un tipo de identificadores que indican al compilador que una porción
de código va a realizar una serie de operaciones (de distinto tipo) sobre atributos u
objetos.
Esto es posible de hacer sobre prácticamente cualquier operador: “*”, “/”, “+”, “-“, “<<”,
“>>”, “>”, “<”, etc.
Solamente citaremos a modo de ejemplo que una sobrecarga de operador tiene similitud
en cuanto a su sintaxis con la declaración de un método, con la diferencia de colocar un
operador en lugar de un nombre de método.
Vale mencionar que es otro aspecto no incluido en todos los lenguajes de programación
OO, como Java o Smalltalk, aunque sí es aceptado por el histórico C++ y el moderno C#
(parte de la plataforma .NET).
4. Sobrecarga de métodos
La sobrecarga de métodos se refiere a la creación de varios métodos con el mismo
nombre pero con distintas firmas, concepto similar a la sobrecarga de operadores.
Por ejemplo:
Este concepto está íntimamente relacionado con otro de los grandes principios de la OO:
el polimorfismo que analizaremos en la próxima Unidad.
fin clase
Otro ejemplo de sobrecarga estaría dado por parte de lo visto en la Unidad anterior,
cuando definimos más de un constructor para una clase. A esto se denomina sobrecarga
de constructores.
Punto 1: Escribir una clase “Automovil” que tenga por los menos 5 atributos (1 de
ellos privado) y 3 métodos (todos públicos), que tenga sentido y coherencia con el
modelado de un vehículo
Punto 2: Escribir una clase “Persona” que tenga 2 métodos sobrecargados
Punto 3: Escribir una clase “Escuela” que tenga 3 constructores sobrecargados
Punto 4: Escribir las clases necesarias para modelar a través del uso de la
herencia las siguientes entidades: “Perro”, “Mamífero”, “Hombre”. Cada clase debe
tener al menos 1 atributo y al menos 1 método.
Pueden optar por resolverlos o plantear mejoras/correcciones a los que vayan posteando.
Lo que vimos
Concepto paquetes y modificadores de acceso para clases, métodos y atributos
Concepto de Herencia, uno los pilares de la POO
Concepto de sobrecarga, tanto de operadores como de métodos
Lo que viene:
Conceptos de interfaces y clases abstractas.
Conceptos de casting, o transformación de tipos de datos.
El mecanismo del Polimorfismo.
El concepto de clases internas.