Programacion Orientada a Objectos
Todo lo que hemos codificado hasta ahora gira en torno a funciones (es decir, bloques de declaraciones que manipulan datos). Esto se denomina modo de programación orientada a procedimientos. Hay otra forma de organizar tu código, que es combinar datos y funcionalidad, y envolverlo dentro de algo llamado un objeto. Esta forma de codificación es llamada modo de programación orientada a objetos, y es ideal para escribir aplicaciones grandes.
El universo está hecho de diferentes objetos como: el sol, la tierra, la luna, las sillas y los locos. Del mismo modo, podemos imaginar que nuestro automóvil está formado por diferentes objetos, como el volante, el aire acondicionado, el motor, etc. De la misma manera, hay conceptos de programación orientados a objetos que asumen que todo es un objeto e implementan un software para diferentes objetos.
Hay dos tipos de personas en este mundo:
Las 2 mayores ventajas son:
Crear un programa de una forma orientada a objetos puede ser más lento al principio porque tienes que dividir todo tu código en pequeñas partes. Además, existen ciertos escenarios – muy particulares – que pueden complicar tu programa al usar esta práctica.
¡Pero oye!…no necesitas ser una de esas personas que deben "amar" u "odiar" todo. En su lugar, trata de entender que todo tiene sus pros y sus contras. Conviértete en un maestro en esta técnica y úsala sabiamente.
Las clases y los objetos son los dos aspectos principales de la programación orientada a objetos. Una clase crea un nuevo tipo (de objeto) en donde los objetos son instancias particulares de una clase particular.
Ejemplo:
Digamos que tienes un auto nuevo con patente/matrícula XHR-ABM. Ese objeto específico será la instancia de un objeto con la clase auto.
Cada aplicación y sitio web que vayas a construir debe tener su propio conjunto de clases. Las clases dependerán de la lógica de negocios detrás del sitio web (en última instancia, se trata del cliente y las necesidades que están tratando de resolver).
Por ejemplo: Una clase de persona tiene: color de piel, raza, nombre, número de seguridad social, etc. Todas las propiedades tienen un tipo de datos, como: Integer, String, Float, Null, Arrays.
Si queremos almacenar la fecha de nacimiento de la persona utilizando tipos de datos simples, tendremos que definir 3 propiedades: yearBirthDate (año de nacimiento), monthBirthDate (mes de nacimiento) y dayBirthDate (día de nacimiento).
Una mejor solución será usar clases de fecha predefinidas (pre-defined Date Classes) o funciones que vienen con la mayoría de los lenguajes de programación de back-end, por ejemplo PHP Date o Python datetime.
Algunas propiedades son calculadas durante el tiempo de ejecución cada vez que las necesitamos. Por ejemplo: edad. El problema con la edad es que cambia con el tiempo. Por eso no es una buena idea almacenar la edad actual del usuario. En su lugar, es mejor declarar una propiedad calculada llamada "Edad" y declarar una función que calcula la edad actual del usuario en función de su fecha de nacimiento (birthDate).
¡Vamos a hacer nuestro primer diagrama de clase! Digamos que estás diseñando el modelo orientado a objetos de un nuevo sitio web, y tu cliente desea crear un carrito de compras. Esto es fácil porque este tipo de sitios web se hacen todos los días (en realidad, será más inteligente y más eficiente clonar un modelo ya hecho; sin embargo, por el bien de esta lección, vamos a continuar con nuestro ejemplo).
Al crear cualquier Diagrama de Clase de tu aplicación, debes tener en cuenta los siguientes puntos:
☝️ Es importante decir que no hay soluciones correctas o incorrectas para este tipo de problemas. Debes permanecer confiado y atenerte a tu estrategia. Sin embargo, asegúrate de tomarte el tiempo suficiente para diseñar una buena estrategia antes de agregar algún código – de lo contrario, será difícil cambiar las cosas durante el desarrollo de aplicaciones grandes (con muchas clases).
Tenemos un cliente que quiere comenzar a vender autos en internet. ¿Qué hacemos? El sitio web probablemente necesitará tener un archivo/página index con una lista de todos los autos que tiene disponible en este momento. El usuario podrá agregar autos a un carrito de compras y finalizar el pedido cuando esté listo.
Bien, es obvio que los primeros objetos que necesitamos son una clase ShoppingCart y una clase Car.
Ahora que tenemos nuestras primeras 2 clases de objetos, para continuar desarrollando el modelo, puedes preguntarte (o al cliente) lo siguiente:
Los diagramas de clase también deben expresar la forma en que las clases se relacionan entre sí y las funciones que tienen (incluyendo las funciones "getter" y "setter").
Para declarar una clase necesitamos usar la palabra "class" en cualquier lugar de nuestro código, seguido del nombre de la clase que queremos asignarle. Comienza y termina cada clase con corchetes.
Las propiedades se declaran al comienzo de cada clase; globalmente dentro de los corchetes de esa clase en particular.
Justo después de las propiedades, tienes que declarar las funciones.
El "constructor de clase" es la primera función que se llama en toda la clase. Se llama tan pronto como se crea el objeto. Es una buena práctica asignar valores iniciales a las propiedades de la clase dentro de su método de construcción.
Llamamos al constructor una de las "funciones mágicas." Son "mágicas" porque no tienes que llamar a esas funciones tú mismo – el servidor las llama mágicamente según el propósito que tengan (en el caso del constructor, recuerda que el propósito es la inicialización).
Las funciones mágicas siempre comienzan con dos guiones bajos, y el __construct() . Usamos __construct() para hacer algo tan pronto como creamos un objeto fuera de una clase. Una función de este tipo se llama un constructor. Usualmente usamos el constructor para establecer un valor para una propiedad.
El "this" (en JavaScript y PHP) o "self" (en Python) indica que estamos utilizando los métodos y propiedades específicos de la clase, y nos permite tener acceso a ellos dentro del alcance de la clase específica.
Las propiedades se declaran al comienzo de cada clase (globalmente dentro de los paréntesis de esa clase en particular). Justo después de las propiedades, también tiene que declarar las propiedades calculadas.
Todas las propiedades de clase tienen una visibilidad pública por defecto; puedes cambiar su visibilidad a privada si te parece mejor:*
☝️ *JavaScript y Python no tienen propiedades privadas o públicas – todos son públicas por defecto. Es una buena práctica usar el símbolo de guión bajo para simular el mismo comportamiento.
Propiedades a las que se puede acceder desde fuera de la clase usando el operador ->.
No se puede acceder a ellos desde fuera de la clase; la única forma de acceder o usarlos es dentro de las funciones de clase usando el operador $this-> . Para acceder a una propiedad privada necesitas crear dos funciones: una captadora (getter) y una establecedora (setter):
Quizas puedas sentir que no tiene sentido usar "getters" y "setters" para cada propiedad, y probablemente tengas razón en la mayoría de los casos. Pero, incluso si crees que escribir los "getters" y "setters" NO son necesarios para una propiedad en particular, es una muy buena práctica porque nunca se sabe cuándo los necesitarás.
¿Cuándo necesitamos realmente propiedades privadas y un "getter/setter"?
Aquí hay otro ejemplo de un "getter/setter" en la vida real:
Loading... Loading... Loading...
☝️ Algunos lenguajes, como PHP, tienen sus propias funciones mágicas __get y __set para implementar getters y setters. Sin embargo, esto no es una buena idea debido a problemas de rendimiento. Es una mejor idea crear tus propias funciones "get/set" de acuerdo con las necesidades de tu proyecto. Aquí está el razonamiento detrás de esto.
Agrupación es el proceso de combinar datos y funciones en una sola unidad llamada "clase".
Cuando creas un objeto en un lenguaje orientado a objetos, puedes ocultar la complejidad del funcionamiento interno del objeto. Como desarrollador, hay dos razones principales por las que elegirías ocultar la complejidad:
La primera razón es proporcionar una forma simplificada y comprensible de usar tu objeto sin la necesidad de comprender su complejidad interna..
Por ejemplo, un conductor de automóvil no necesita saber cómo funciona un motor de combustión interna. Es suficiente saber cómo arrancar el automóvil, cómo activar la transmisión (si desea moverse), cómo suministrar combustible, cómo detener el automóvil y cómo apagar el motor. Tú sabes cómo usar la llave, la palanca de cambios (y posiblemente el embrague), el pedal del acelerador y el pedal del freno para realizar cada una de estas operaciones. Estas operaciones básicas forman una interfaz para el auto. Piensa en una interfaz como la colección de cosas que puedes hacer con el auto sin saber cómo funcionan cada una de esas cosas.
Al ocultar la complejidad del auto al usuario, cualquier persona, no solo un mecánico, puede conducir un automóvil. De la misma manera, ocultar la compleja funcionalidad de tu objeto al usuario le permite a CUALQUIERA usarlo y encontrar formas de reutilizarlo en el futuro (independientemente de su conocimiento del funcionamiento interno). Este concepto de mantener los detalles de la implementación ocultos del resto del sistema es clave para el diseño orientado a objetos.
En programación orientada a objetos, herencia significa que al definir una clase de objetos, cualquier subclase definida puede heredar las definiciones de una o más clases generales. Esto significa que, para el programador, un objeto en una subclase no necesita llevar su propia definición de datos y métodos que son genéricos para la clase (o clases) de la que forma parte. Esto no solo acelera el desarrollo del programa; también garantiza una validez inherente al objeto de subclase definido (lo que funciona y es consistente acerca de la clase también funcionará para la subclase).
Por ejemplo:
"Car" es una clasificación de "Four-Wheeler." Aquí, "Car" adquiere las propiedades de un "Four-Wheeler." Otras clasificaciones pueden ser un Jeep, Tempo, van etc. "Four-Wheeler" define una clase de vehículos que tiene cuatro ruedas, un rango específico de potencia del motor, capacidad de carga, etc. "Car" (denominado como una subclase) adquiere estas propiedades de "Four-Wheeler" (denominado como una superclase), y tiene ALGUNAS propiedades específicas que son diferentes de otras clasificaciones de "Four Wheeler", como lujo, confort, forma , tamaño, uso, etc.
"Car" puede tener una clasificación adicional como "Open Car," "Small Car," "Large Car," etc, que van a adquerir las propiedades de AMBOS "Four-Wheeler" Y "Car" – pero aún tendrá algunas propiedades específicas. De esta manera, el nivel de jerarquía se puede extender a cualquier nivel.
Loading... Loading... Loading...