La programación orientada a objetos (OOP) se refiere a una metodología de programación basada en objetos, en lugar de solo funciones y procedimientos. Los objetos contienen los datos y los métodos (o comportamiento).

en conceptos OOPs, aprenderemos cuatro principios principales: abstracción, encapsulación, herencia y polimorfismo. También se conocen como cuatro pilares del paradigma de programación orientada a objetos.,

  1. La abstracción es el proceso de exponer los detalles esenciales de una entidad, ignorando los detalles irrelevantes, para reducir la complejidad para los usuarios.
  2. La encapsulación es el proceso de agrupar datos y operaciones en los datos en una entidad.
  3. La herencia se usa para derivar un nuevo tipo de un tipo existente, estableciendo así una relación padre-hijo.
  4. El polimorfismo permite que una entidad Tome diferentes significados en diferentes contextos.

¿Qué es la programación orientada a Objetos?,

en los primeros días, los programas se escribieron con código binario y se utilizaron interruptores mecánicos para cargar los programas. Más tarde, a medida que las capacidades de hardware evolucionaron, los expertos trataron de simplificar la programación utilizando lenguajes de alto nivel donde se utilizaron compiladores para generar instrucciones de máquina desde el programa.

con más Evolución, los expertos crearon la programación estructurada que se basó en funciones pequeñas. Estas funciones ayudaron de muchas maneras, por ejemplo, reutilización de código, variables locales, depuración de código y mantenibilidad de código.,

con más avances informáticos y la demanda de aplicaciones más complejas, las limitaciones de la programación estructurada comenzaron a ser visibles. Las aplicaciones complejas necesitaban ser modeladas más de cerca con casos de la vida real y de uso.

entonces los expertos desarrollaron programación orientada a objetos. En el Centro de OOP, tenemos objetos y clases., Al igual que una entidad de la vida real, un objeto tiene dos características principales :

  • data-informa sobre los atributos y el estado del comportamiento del objeto
  • – le da la capacidad de cambiar a sí mismo y comunicarse con otros objetos

1.1. Clase y objeto

un objeto es una instancia de una clase. Cada objeto tiene su propio estado, comportamiento e identidad. Una clase es el plano o plantilla para sus objetos. Los objetos pueden comunicarse con otros objetos llamando a funciones. A veces se denomina paso de mensajes.,

por ejemplo, si estamos trabajando en una aplicación de recursos humanos, entonces consiste en entidades/actores, por ejemplo, empleado, gerente, Departamento, nóminas, vacaciones, objetivos, seguimiento de tiempo, etc. Para modelar estas entidades en programas informáticos, podemos crear clases que tendrán atributos de datos y comportamiento similares a los de la vida real.

por ejemplo, una entidad de empleado se puede representar como Employee Clase:

el anterior Employee actúa como una plantilla. Podemos usar esta clase para crear tantos objetos empleados diferentes como necesitemos en la aplicación.,

Employee e = new Employee(111);e.setFirstName("Alex");....int age = e.getAge();

el campo id ayuda a almacenar y recuperar los detalles de cualquier empleado individual.

la identidad del objeto generalmente es mantenida por el entorno de ejecución de la aplicación, por ejemplo, para aplicaciones Java, su máquina virtual Java (JVM). Cada vez que creamos un objeto Java, JVM crea un hashcode para este objeto y lo asigna. De esta manera, incluso si el programador olvida agregar el campo id, JVM garantiza que todos los objetos estén identificados de forma única.

1.2., Constructor

Los Constructores son métodos especiales sin valor de retorno. Su nombre es siempre el mismo que el nombre de la clase; pero pueden aceptar parámetros que ayudan a establecer el estado inicial del objeto, antes de que la aplicación comience a usarlo.

si no proporcionamos ningún constructor, JVM asigna un constructor predeterminado a la clase. Este constructor predeterminado no acepta ningún parámetro.

recuerde, si asignamos un constructor a cualquier clase, entonces JVM no le asigna el constructor predeterminado. Si es necesario, necesitamos especificar el constructor predeterminado explícitamente a la clase.,

public class Employee { // Default constructor public Employee() { } // Custom constructor public Employee(int id) { this.id = id; }}

cuatro principios de OOP

las cuatro características principales de la programación orientada a objetos son:

  • Abstracción
  • encapsulación
  • herencia
  • polimorfismo
OOP Pillars

2.1. Abstracción

La abstracción es muy fácil de entender cuando la relacionamos con el ejemplo en tiempo real. Por ejemplo, cuando conducimos nuestro automóvil, no tenemos que preocuparnos por el funcionamiento interno exacto del automóvil., Lo que nos preocupa es interactuar con el automóvil a través de sus interfaces como el volante, el pedal del freno, el pedal del acelerador, etc. Aquí el conocimiento que tenemos del coche es abstracto.

en informática, la abstracción es el proceso por el cual los datos y los programas se definen con una representación similar en forma a su significado (semántica) mientras se ocultan los detalles de la implementación.

en términos más simples, abstracción es ocultar información que no es relevante para el contexto o más bien muestra solo información relevante y simplificarla comparándola con algo similar en el mundo real.,

la abstracción captura solo aquellos detalles sobre un objeto que son relevantes para la perspectiva actual.

normalmente la abstracción se puede ver de dos maneras:

  1. abstracción de datos

    la abstracción de datos es la forma de crear tipos de datos complejos a partir de varios tipos de datos más pequeños, lo que se asemeja más a las entidades de la vida real. por ejemplo, una clase Employee puede ser un objeto complejo de tener varias asociaciones pequeñas.,

    public class Employee { private Department department; private Address address; private Education education; //So on...}

    por lo tanto, si desea obtener información de un empleado, pídala desde Employee object – como lo hace en la vida real, pregúntele a la persona en sí.

  2. abstracción de Control

    la abstracción de Control se logra ocultando la secuencia de acciones para una tarea compleja, dentro de una simple llamada a método, por lo que la lógica para realizar la tarea puede ocultarse al cliente y podría cambiarse en el futuro sin afectar el código del cliente.,

    public class EmployeeManager{ public Address getPrefferedAddress(Employee e) { //Get all addresses from database //Apply logic to determine which address is preferred //Return address }}

    en el ejemplo anterior, mañana si desea cambiar la lógica para que cada vez que la dirección doméstica sea siempre la dirección preferida, cambiará la lógica dentro del método getPrefferedAddress(), y el cliente no se verá afectado.

Lea Más : la Abstracción en Java

2.2. Encapsulation

envolver datos y métodos dentro de las clases en combinación con la ocultación de implementación (a través del control de acceso) a menudo se llama encapsulación., El resultado es un tipo de datos con características y comportamientos.

«todo lo que cambie, encapsularlo» – un famoso principio de diseño

La encapsulación esencialmente tiene tanto ocultación de información como ocultación de implementación.

  • la ocultación de información se realiza mediante el uso de modificadores de control de acceso (público, privado, protegido) y implementation hiding se logra mediante la creación de una interfaz para una clase.
  • la ocultación de implementación le da al diseñador la libertad de modificar cómo la responsabilidad es cumplida por un objeto., Esto es especialmente valioso en puntos donde es probable que el diseño (o incluso los requisitos) cambien.

tomemos un ejemplo para dejarlo más claro.

2.2.1. Ocultación de información

class InformationHiding { //Restrict direct access to inward data private ArrayList items = new ArrayList(); //Provide a way to access data - internal logic can safely be changed in future public ArrayList getItems(){ return items; }}
2.2.2. Implementación de ocultar

interface ImplemenatationHiding { Integer sumAllItems(ArrayList items);}class InformationHiding implements ImplemenatationHiding{ //Restrict direct access to inward data private ArrayList items = new ArrayList(); //Provide a way to access data - internal logic can safely be changed in future public ArrayList getItems(){ return items; } public Integer sumAllItems(ArrayList items) { //Here you may do N number of things in any sequence //Which you do not want your clients to know //You can change the sequence or even whole logic //without affecting the client }}

Lea Más : la Encapsulación En Java

2.3. Herencia

herencia es otro concepto importante en la programación orientada a objetos., La herencia en Java es un mecanismo por el cual una clase adquiere las propiedades y comportamientos de la clase padre. Esencialmente está creando una relación padre-hijo entre clases. En Java, usaremos la herencia principalmente para la reutilización y mantenibilidad del código.

La Palabra clave «extends» se usa para heredar una clase en java. La palabra clave»extends » indica que estamos creando una nueva clase que se deriva de una clase existente.

en la terminología de Java, una clase que se hereda se llama superclase. La nueva clase se llama subclase.,

una subclase hereda todos los miembros no privados (campos, métodos y clases anidadas) de su superclase. Los Constructores no son miembros, por lo que no son heredados por subclases, pero el constructor de la superclase puede ser invocado desde la subclase.

2.3.1., La herencia de ejemplo
public class Employee { private Department department; private Address address; private Education education; //So on...}public class Manager extends Employee { private List<Employee> reportees;}

En el código anterior, Manager es la versión especializada de Employee y reutiliza department, address y education de Employee clase así como definir su propio reportees lista.

3.2.2. Tipos de herencia
  • herencia única – una clase hija se deriva de una clase padre.
    class Parent{ //code}class Child extends Parent{ //code}
  • herencias Múltiples – un hijo puede derivar de varios padres. Hasta JDK 1.,7, la herencia múltiple no era posible en java a través del uso de clases. Pero desde JDK 1.8 en adelante, la herencia múltiple es posible a través del uso de interfaces con métodos predeterminados.

    la herencia múltiple a través del uso de interfaces siempre es posible en Java.

    interface MyInterface1{ }interface MyInterface2{ }class MyClass implements MyInterface1, MyInterface2{}
  • herencia multinivel-se refiere a la herencia entre más de tres clases de tal manera que una clase hija actuará como clase padre para otra clase hija.

    en el ejemplo dado, B es clase padre así como clase hijo también.,

    class A{}class B extends A{}class C extends B{}
  • herencia jerárquica: se refiere a la herencia cuando hay una superclase y más de una subclase que extienden la superclase.
    class A{}class B extends A{}class C extends A{}class D extends A{}
  • Híbrido herencia – es una combinación de dos o más tipos de herencia. Así que cuando la relación entre clases contiene herencia de dos o más tipos, entonces decimos clases implementar herencia híbrida.
    interface A{}interface B extends A{}class C implements A{}class D extends C impements B{}

2.4., Polimorfismo

El polimorfismo es la capacidad por la cual, podemos crear funciones o variables de referencia que se comportan de manera diferente en un contexto programático diferente. A menudo se refiere como un nombre con muchas formas.

por ejemplo, en la mayoría de los lenguajes de programación, el operador '+' se usa para agregar dos números, así como para concatenar dos cadenas. Según el tipo de variables, el operador Cambia su comportamiento. Se conoce como sobrecarga del operador.

En Java, el polimorfismo se considera esencialmente en dos tipos:

2.4.1., Polimorfismo en tiempo de compilación

en polimorfismo en tiempo de compilación, el compilador puede enlazar los métodos apropiados a los objetos respectivos en tiempo de compilación porque tiene toda la información necesaria y sabe a qué método llamar durante la compilación del programa.

a menudo se denomina enlace estático o enlace temprano.

en Java, se logra con el uso de métodos de sobrecarga. En la sobrecarga de métodos, los parámetros del método pueden variar con un número, orden o los tipos de parámetro.

2.4.2., Polimorfismo en tiempo de ejecución

en el polimorfismo en tiempo de ejecución, la llamada a un método anulado se resuelve dinámicamente en tiempo de ejecución. El objeto, en el que se ejecutará el método, se determina en tiempo de ejecución, Generalmente dependiendo del contexto impulsado por el usuario.

a menudo se conoce como el enlace Dinámico o el método de sobreescritura. Puede que lo hayamos oído con el nombre de envío de Método dinámico.

en el polimorfismo en tiempo de ejecución, Generalmente tenemos una clase padre y como mínimo una clase hijo. En una clase, escribimos una instrucción para ejecutar un método que está presente en la clase padre y la clase hijo, ambas.,

la llamada al método se da usando la variable del tipo de clase padre. La instancia real de la clase se determina en tiempo de ejecución porque una variable de tipo de clase principal puede almacenar la referencia a la instancia de la clase principal, así como la clase secundaria también.

Leer más : polimorfismo en java

conceptos menores

aparte de los 4 bloques de construcción anteriores de OOP, tenemos algunos conceptos más que juegan un papel importante en la construcción de todo el entendimiento.

antes de profundizar, entenderemos el término módulo., En programación general, un módulo se refiere a una clase o subaplicación que realiza una funcionalidad única. En la aplicación de recursos humanos, una clase puede realizar varias funciones, como enviar correos electrónicos, generar un recibo de sueldo, calcular la edad del empleado, etc.

3.1. Acoplamiento

El acoplamiento es la medida del grado de interdependencia entre los módulos. Acoplamiento se refiere a la fuerza con la que un elemento de software está conectado a otros elementos. Un buen software tendrá acoplamiento bajo.

significa que una clase debe realizar una tarea única o solo tareas que son independientes de otras tareas. E. g., una clase EmailValidator solo validará el correo electrónico. Similarmente, EmailSender class solo enviará correo electrónico.

si incluimos ambas funciones dentro de una sola clase EmailUtils entonces es un ejemplo de acoplamiento apretado.

3.2. Cohesion

Cohesion es el pegamento interno que mantiene unido el módulo. Un buen diseño de software tendrá una alta cohesión.

significa que una clase/módulo debe incluir toda la información que se necesita para realizar su función sin ninguna dependencia., Por ejemplo, una clase EmailSender debería poder configurar el servidor SMTP, aceptar el correo electrónico, el asunto y el contenido del remitente. Básicamente, debe centrarse en el envío de correos electrónicos solamente.

la aplicación no debe usar EmailSender para ninguna otra función que no sea el envío de correo electrónico. La baja cohesión da lugar a clases monolíticas que son difíciles de mantener, comprender y reducen la reutilización.

3.3. Asociación

Asociación se refiere a la relación entre objetos que tienen un ciclo de vida independiente sin propiedad.,

tomemos un ejemplo de un profesor y un estudiante. Varios estudiantes pueden asociarse con un solo profesor, y un solo estudiante puede asociarse con varios profesores, pero ambos tienen sus propios ciclos de vida.

ambos se pueden crear y eliminar de forma independiente, por lo que cuando un profesor abandona la escuela, no necesitamos eliminar a ningún alumno, y cuando un alumno abandona la escuela, no necesitamos eliminar a ningún profesor.

3.4. La Asociación de agregación

se refiere a la relación entre objetos que tienen un ciclo de vida independiente con propiedad., Es entre las clases hijo y padre donde los objetos hijo no pueden pertenecer a otro objeto padre.

tomemos un ejemplo de un teléfono celular y una batería de teléfono celular. Una sola batería puede pertenecer a un solo teléfono a la vez. Si el teléfono deja de funcionar y lo eliminamos de nuestra base de datos, la batería del teléfono no se eliminará porque puede seguir funcionando. Así que en la agregación, mientras hay Propiedad, los objetos tienen su propio ciclo de vida.

3.5. Composición

La composición se refiere a relaciones cuando los objetos no tienen un ciclo de vida independiente., Si se elimina el objeto principal, también se eliminarán todos los objetos secundarios.

Por ejemplo, la relación entre preguntas y respuestas. Las preguntas individuales pueden tener varias respuestas, pero las respuestas no pueden pertenecer a varias preguntas. Si eliminamos una pregunta, todas sus respuestas se eliminarán automáticamente.

mejores prácticas

4.1. Favorezca la composición sobre la herencia

La herencia y la composición, ambos promueven la reutilización del código. Pero el uso de la composición es preferible a la herencia.,

una implementación de composición sobre herencia típicamente comienza con la creación de varias interfaces que representan los comportamientos que el sistema debe exhibir. Las Interfaces permiten el comportamiento polimórfico. Las clases que implementan las interfaces identificadas se crean y agregan a las clases de dominio de Negocio según sea necesario. Por lo tanto, los comportamientos del sistema se realizan sin herencia.

4.2. Programa a una interfaz, no a la implementación

esto conduce a un código flexible que puede funcionar con cualquier nueva implementación de la interfaz., Debemos apuntar a utilizar interfaces como variables, como tipos de retorno de un método o como tipo de argumento de métodos.

Las Interfaces actúan como tipos de superclase. De esta manera, podemos crear más especializaciones de la interfaz en el futuro sin modificar el código existente.

4.3. DRY (no te repitas)

no escribas código duplicado, en su lugar usa Abstracción para abstraer cosas comunes en un solo lugar.

como regla general, si escribe la misma pieza de código en dos lugares, considere extraer en una función separada y llame a la función en ambos lugares.

4.4., Encapsule lo que cambia

todo el software obtiene cambios con el tiempo. Por lo tanto, encapsule el código que espera o sospecha que se cambiará en el futuro.

en Java, use los métodos private para ocultar tales implementaciones de los clientes para que cuando realice un cambio, el cliente no se vea obligado a realizar cambios en su código.

El uso de patrones de diseño también se recomienda para lograr la encapsulación. Por ejemplo, el patrón de diseño de fábrica encapsula el código de creación de objetos y proporciona flexibilidad para introducir un nuevo tipo más adelante sin afectar a los clientes existentes.

4.5., Principio de responsabilidad única

es uno de los principios sólidos del diseño de la clase OOP. Hace hincapié en que una clase debe tener una sola y única responsabilidad.

En otras palabras, debemos escribir, cambiar y mantener una clase para un solo propósito. Esto nos dará la flexibilidad para hacer cambios en el futuro sin preocuparnos por los impactos de los cambios para otra entidad.

4.6. Principio abierto cerrado

enfatiza que los componentes de software deben estar abiertos para la extensión, pero cerrados para la modificación.,

esto significa que nuestras clases deben estar diseñadas de tal manera que cada vez que otros desarrolladores quieran cambiar el flujo de control en condiciones específicas en la aplicación, todo lo que necesitan para extender nuestra clase y anular algunas funciones y eso es todo.

si otros desarrolladores no son capaces de diseñar el comportamiento deseado debido a las restricciones impuestas por nuestra clase, entonces debemos reconsiderar cambiar nuestra clase.

hay muchos otros conceptos y definiciones en whole OOPs paradigm que aprenderemos en otros tutoriales.

Feliz Aprendizaje !!

¿fue útil este post?,

háganos saber si le gustó la publicación. Es la única manera de mejorar.
No