- Analizar
- Observación
- Entendimiento
- Lectura
- Plasmar
- Diagramas
- Programar
- Lenguajes de programación
La programación Orientada a Objetos nace de los problemas creados por la programación estructurada y nos ayuda a resolver cierto problemas como:
- Código muy largo: A medida que un sistema va creciendo y se hace más robusta el código generado se vuelve muy extenso haciéndose difícil de leer, depurar, mantener.
- Si algo falla, todo se rompe: Ya que con la programación estructurada el código se ejecuta secuencialmente al momento de que una de esas líneas fallara todo lo demás deja de funcionar.
Difícil de mantener.
Ejemplos de código espaguetti
La Programación Orientada a Objetos viene de una filosofía o forma de pensar que es la Orientación a Objetos y esto surge a partir de los problemas que necesitamos plasmar en código.
Es analizar un problema en forma de objetos para después llevarlo a código, eso es la Orientación a Objetos.
Un paradigma es una teoría que suministra la base y modelo para resolver problemas. La paradigma de Programación Orientada a Objetos se compone de 4 elementos:
- Clases
- Propiedades
- Métodos
- Objetos
Y 4 Pilares:
- Encapsulamiento
- Abstracción
- Herencia
- Polimorfismo
Paradigma Teoría que suministra la base y modelo para resolver problemas
- Orientado a objetos naturalmente
- Android
- Server side
- Lenguaje interpretado
- Pensado para la web
- Diseñado para ser fácil de usar
- Múltiples usos: Web, Server Side, Anállisis de Datos, Machine Leaning
- Lenguaje interpretado
- Orientado a objetos pero basado en prototipos
- Pensado para la web
- Visual Studio Code
https://code.visualstudio.com/
- OMT: Object Modeling Techniques. Es una metodología para el análisis orientado a objetos.
- UML: Unified Modeling Language o Lenguaje de Modelado Unificado. Tomó las bases y técnicas de OMT unificándolas. Tenemos más opciones de diagramas como lo son Clases, Casos de Uso, Objetos, Actividades, Iteración, Estados, Implementación.
Como ya viste UML significa Unified Modeling Language el cual es un lenguaje estándar de modelado de sistemas orientados a objetos.
En la parte superior se colocan los atributos o propiedades, y debajo las operaciones de la clase. Notarás que el primer caracter con el que empiezan es un símbolo. Este denotará la visibilidad del atributo o método, esto es un término que tiene que ver con Encapsulamiento y veremos más adelante a detalle.
Estos son los niveles de visibilidad que puedes tener:
- private
+ public
# protected
~ default
Una forma de representar las relaciones que tendrá un elemento con otro es a través de las flechas en UML, y aquí tenemos varios tipos, estos son los más comunes:
Como su nombre lo dice, notarás que cada vez que esté referenciada este tipo de flecha significará que ese elemento contiene al otro en su definición. La flecha apuntará hacia la dependencia.
Con esto vemos que la ClaseA está asociada y depende de la ClaseB.
Siempre que veamos este tipo de flecha se estará expresando la herencia. La dirección de la flecha irá desde el hijo hasta el padre.
Con esto vemos que la ClaseB hereda de la ClaseA
Este se parece a la asociación en que un elemento dependerá del otro, pero en este caso será: Un elemento dependerá de muchos otros. Aquí tomamos como referencia la multiplicidad del elemento. Lo que comúnmente conocerías en Bases de Datos como Relaciones uno a muchos.
Con esto decimos que la ClaseA contiene varios elementos de la ClaseB. Estos últimos son comúnmente representados con listas o colecciones de datos.
Este es similar al anterior solo que su relación es totalmente compenetrada de tal modo que conceptualmente una de estas clases no podría vivir si no existiera la otra.
Los Objetos son aquellos que tienen propiedades y comportamientos, también serán sustantivos.
- Pueden ser Físicos o Conceptuales
Las Propiedades también pueden llamarse atributos y estos también serán sustantivos. Algunos atributos o propiedades son nombre, tamaño, forma, estado, etc. Son todas las características del objeto.
Los Comportamientos serán todas las operaciones que el objeto puede hacer, suelen ser verbos o sustantivos y verbo. Algunos ejemplos pueden ser que el usuario pueda hacer login y logout.
- Tienen propiedades y comportamientos
- Físicos o Conceptuales
- Sustantivos
Una Clase es el modelo por el cual nuestros objetos se van a construir y nos van a permitir generar más objetos.
Analizamos Objetos para crear Clases. Las Clases son los modelos sobres los cuales construiremos nuestros objetos.
Abstracción es cuando separamos los datos de un objeto para generar un molde.
La modularidad va muy relacionada con las clases y es un principio de la Programación Orientado a Objetos y va de la mano con el Diseño Modular que significa dividir un sistema en partes pequeñas y estas serán nuestros módulos pudiendo funcionar de manera independiente.
La modularidad de nuestro código nos va a permitir
Beneficios de modularizar
- Reutilizar
- Evitar colapsos
- Hacer nuestro código más mantenible
- Legibilidad
- Resolución rápida de problemas
Una buena práctica es separando las clases en archivos diferentes.
Tener una clase promueve
- Modularidad
- Divide el programa en diferentes partes o módulos / clases
- Separar las clases en archivos
Declaración de una clase en varios lenguajes
Javascript usa prototipos
Don’t repeat yourself es una filosofía que promueve la reducción de duplicación en programación, esto nos va a inculcar que no tengamos líneas de código duplicadas.
Toda pieza de información nunca debería ser duplicada debido a que incrementa la dificultad en los cambios y evolución
La herencia nos permite crear nuevas clases a partir de otras, se basa en modelos y conceptos de la vida real. También tenemos una jerarquía de padre e hijo.
Los objetos nos ayudan a crear instancia de una clase, el objeto es el resultado de lo que modelamos, de los parámetros declarados y usaremos los objetos para que nuestras clases cobren vida.
Los métodos constructores dan un estado inicial al objeto y podemos añadirle algunos datos al objeto mediante estos métodos. Los atributos o elementos que pasemos a través del constructor serán los datos mínimos que necesita el objeto para que pueda vivir.
El Encapsulamiento es hacer que un dato sea inviolable, inalterable cuando se le asigne un modificador de acceso.
Para python
_ Protegido __Privado
Setters y getters
Polimorfismo: Muchas formas. Poli = muchas, morfismo = formas. NO es Poliformismo
Es construir métodos con el mismo nombre pero con comportamiento diferente
Hay 3 conceptos
Sobrecarga -> Principalmente con los métodos Sobre-escritura -> Debe haber herencia, Cuando le cambias el comportamiento a un método que definió la super-clase Polimorfismo de Subtipado -> Centrado en usar el mimos nombre de método en diferentes clases, cuando se llamen se ejecutara
Sobrecarga Según algunos autores se le llamaría polimorfismo de sobrecarga, algunos ni si quiera lo llaman polimorfismo así que lo dejare:
Como pueden ver puede ser productivo en algunos casos, pero empieza a ser contraproducente cuando se usa demasiado(en el segundo caso por ejemplo).
Sobre-Escritura Un caso puro de polimorfismo, busca alterar el método de la súper-clase, ya que el comportamiento es diferente
Realmente muy útil, es l a mejor practica ya que la herencia podrá extender el proceso y si se quiere generar una particularidad se hace una clase
Polimorfismo de sobrecarga
Mala prática
Este ultimo me parece algo innecesario pero que también se puede hacer sin necesidad de heredar.
Otra cosa que de pronto se me escapo pero es porque python al ser débilmente tipado puede hacer de forma natural y es el termino llamado Cohersion, algo que en Java puede compilarse un poco mas.
Esta clase Trip poseerá la lógica más fuerte del negocio aquí será donde se concentrarán la mayor cantidad de clases.
Esto es todo nuestro diagrama de clases, que quedó totalmente expresado en nuestro proyecto.