428 Shares 8969 views

OOP es qué? Principios básicos de la programación orientada a objetos

¿Por qué la programación orientada a objetos se prefiere en la mayoría de los proyectos? OOP ofrece una manera efectiva de lidiar con su complejidad. En lugar de considerar el programa como una secuencia de instrucciones ejecutables, lo representa como un grupo de objetos con ciertas propiedades y realiza ciertas acciones con ellos. Esto lleva a la creación de aplicaciones más claras, más confiables y fáciles de seguir.

Los principios básicos de la programación orientada a objetos (POO) se formaron porque se encontraron limitaciones en los enfoques anteriores. Entre ellos – acceso ilimitado a los datos y un gran número de enlaces que imponen restricciones a la introducción de cambios. Su conciencia y las razones son importantes para entender lo que es OOP en la programación y cuáles son sus beneficios.

Lenguajes procesales

C, Pascal, FORTRAN y lenguajes similares son procesales. Es decir, cada uno de sus operadores ordena a la computadora hacer algo: obtener los datos, sumar los números, dividir por seis, mostrar el resultado. La aplicación de lenguaje de procedimiento es una lista de instrucciones. Si es pequeño, no se requiere ningún otro principio de organización (a menudo llamado paradigma). El programador crea una lista de instrucciones y la computadora las ejecuta.

Separación en funciones

Cuando las aplicaciones se hacen más grandes, la lista resulta ser engorrosa. Pocos pueden entender más de unos cientos de instrucciones hasta que se agrupan. Por esta razón, la función se ha convertido en una forma de hacer las aplicaciones más comprensibles para sus creadores. En algunos idiomas, el mismo concepto puede ser llamado subprograma o procedimiento.

La aplicación se divide en funciones, cada una de las cuales tiene un propósito y una interfaz claramente definidos.

La idea de separación en procedimientos se puede extender agrupándolos en un objeto más grande llamado módulo, pero el principio es similar: agrupar componentes que ejecutan listas de instrucciones.

La separación en funciones y módulos es una de las piedras angulares de la programación estructural, que durante varias décadas antes de la aparición de la OOP fue un paradigma preventivo.

Problemas de la programación estructural

A medida que las aplicaciones crecieron, la programación estructural comenzó a experimentar dificultades. Los proyectos se hicieron demasiado complicados. Los gráficos cambiaron. Un mayor número de programadores estaban involucrados. La complejidad creció. Los costos se dispararon, el gráfico cambió más y el colapso llegó.

Un análisis de las causas de estos fracasos mostró las deficiencias del paradigma procesal. Independientemente de cuán bien se implemente un enfoque estructurado de la programación, las grandes aplicaciones se vuelven excesivamente complejas.

¿Cuáles son las causas de estos problemas asociados con los lenguajes procedimentales? En primer lugar, las funciones tienen acceso ilimitado a los datos globales. En segundo lugar, los procedimientos y significados no relacionados no modelan el mundo real.

Si consideramos estos problemas en el contexto de un programa de inventario, entonces uno de los elementos de datos globales más importantes es el agregado de unidades de contabilidad. Diferentes funciones pueden acceder a ellos para introducir un nuevo valor, mostrarlo, cambiarlo, etc.

Acceso ilimitado

En un programa escrito, por ejemplo, en C, hay dos tipos de datos. Local se ocultan dentro de la función y no se utilizan otros procedimientos.

Cuando dos o más funciones necesitan tener acceso a los mismos datos, el segundo debe ser global. Éstos, por ejemplo, son información sobre los artículos a ser tomados en cuenta. Los datos globales se pueden acceder por cualquier procedimiento.

En un programa grande hay muchas funciones y muchos elementos globales. El problema con el paradigma procesal es que esto conduce a un mayor número de vínculos potenciales entre ellos.

Un número tan grande de compuestos causa varias dificultades. En primer lugar, esto complica la comprensión de la estructura del programa. En segundo lugar, hace difícil hacer cambios. Un cambio en un elemento de datos global puede requerir que se ajusten todas las funciones que tienen acceso a él.

Por ejemplo, en el programa de contabilidad, alguien decide que el código del elemento que se considera debe constar de no más de 5 dígitos y de 12. Esto requerirá cambiar el tipo de datos de corto a largo. Ahora las funciones relacionadas con el código deben cambiarse para trabajar con el nuevo formato.

Cuando los elementos cambian en una aplicación grande, es difícil decir qué procedimientos tienen acceso a ellos. Pero incluso si esto se aclara, cambiarlos puede llevar a un trabajo incorrecto con otros datos globales. Todo está conectado con todo lo demás, así que el cambio en un lugar será en otro.

Modelado del mundo real

El segundo y más importante problema del paradigma procedimental es que su ubicación de datos y funciones individuales no modela las cosas en el mundo real. Aquí tratamos objetos tales como personas y coches. No parecen datos ni funciones. Los objetos reales complejos tienen atributos y comportamiento.

Atributos

Ejemplos de atributos (a veces llamados características) para las personas son el color de los ojos y el título del trabajo, para los automóviles – el poder y el número de puertas. Como resultó, los atributos en el mundo real son equivalentes a los datos del programa. Tienen significados específicos, como el azul (color de los ojos) o cuatro (el número de puertas).

Comportamiento

El comportamiento es lo que los objetos del mundo real producen en respuesta a algún tipo de impacto. Si pide a las autoridades que aumenten sus salarios, la respuesta es "sí" o "no". Si presiona el freno, el coche se detiene. Pronunciación y stop son ejemplos de comportamiento. El comportamiento es como un procedimiento: es llamado a hacer algo, y lo hace. Por lo tanto, los datos y las funciones por sí solos no modelan los objetos del mundo real de manera eficiente.

Solución de problemas

El objeto en OOP se representa como una colección de datos y funciones. Sólo los procedimientos que se llaman funciones miembro en C ++ permiten obtener sus valores. Los datos están ocultos y protegidos del cambio. Los valores y funciones están encapsulados en una unidad. La encapsulación y la ocultación son los términos principales en la descripción de los lenguajes OO.

Si desea cambiar los datos, sabe exactamente qué funciones interactúan con ellos. Ningún otro procedimiento puede acceder a ellos. Esto simplifica la escritura, la depuración y el mantenimiento del programa.

Una aplicación, por regla general, consiste en varios objetos que interactúan entre sí, invocando las funciones de los miembros.

Hoy en día el lenguaje más utilizado de OOP (programación orientada a objetos) es C ++ (plus-plus). Java carece de algunas funciones, como punteros, plantillas y herencia múltiple, lo que la hace menos potente y versátil que C ++. C # aún no ha alcanzado la popularidad de C + +.

Debe tenerse en cuenta que las llamadas funciones de miembro en C ++ se llaman métodos en algunos otros lenguajes OO, como Smalltalk. Los elementos de datos se denominan atributos. Llamar a un método de objeto es enviarle un mensaje.

Analogía

Puede enviar objetos a los departamentos de la empresa. En la mayoría de las organizaciones, los empleados no trabajan un día con cuadros, la próxima vez que pagan salarios, y luego pasan una semana haciendo negocios minoristas. Cada departamento tiene su propio personal con responsabilidades claramente asignadas. También hay datos propios: salarios, cifras de ventas, registros de empleados, etc. La gente en los departamentos trabaja con su información. La separación de la empresa, por lo tanto, facilita el control sobre sus actividades y mantiene la integridad de los datos. La contabilidad es responsable de la nómina. Si necesita conocer el monto total de los salarios pagados en la sucursal del sur en julio, no necesita investigar en el archivo. Es suficiente enviar una nota a la persona a cargo, esperar a que esta persona tenga acceso a los datos y enviar una respuesta con la información requerida. Esto asegura el cumplimiento de los reglamentos y la ausencia de interferencia externa. De la misma manera, el objeto en OOP proporciona la organización de la aplicación.

Debe recordarse que la orientación a los objetos no se refiere a los detalles del programa. La mayoría de las sentencias de C ++ corresponden a operadores de lenguaje procedimental como C. De hecho, las funciones de miembro en C ++ son muy similares a las funciones de C. Sólo un contexto más amplio permitirá establecer si la instrucción es procedimental u orientada a objetos.

Objeto en OOP: definición

Al considerar el problema de la programación en un lenguaje OO, en lugar de preguntas sobre su separación en funciones separadas, surge el problema de la separación en objetos. El pensamiento OOP hace que sea mucho más fácil desarrollar aplicaciones. Esto se debe a la similitud de software y objetos reales.

¿Qué cosas se convierten en objetos en OOP? A continuación se muestran las categorías típicas.

El objeto físico en OOP es:

  • Transporte en patrones de flujo;
  • Elementos eléctricos en los programas de diseño de circuitos;
  • Países en el modelo de economía;
  • Aviones en el sistema de control de tránsito aéreo.

Elementos del entorno informático del usuario:

  • Menú;
  • Windows;
  • Gráficos (línea, rectángulo, círculo);
  • Teclado, ratón, impresora, unidades de disco.

Personas:

  • Empleados;
  • Estudiantes;
  • Clientes;
  • Vendedores.

Datos:

  • Libro de contabilidad;
  • Un asunto privado;
  • Diccionario;
  • Tabla de latitudes y longitudes de asentamientos.

La conexión entre objetos del mundo real y OOP fue el resultado de una combinación de funciones y datos: revolucionaron la programación. No existe una correspondencia tan estrecha en los lenguajes procedimentales.

Clase

Los objetos en OOP son miembros de clases. ¿Qué significa esto? Los lenguajes de programación tienen tipos de datos incorporados . El tipo int, es decir, un entero, está predefinido en C ++. Puede declarar cualquier número de variables int.

Del mismo modo, se define un conjunto de objetos de la misma clase. Define las funciones y los datos incluidos en sus objetos sin crearlos, así como int no crea variables.

Una clase en OOP es una descripción de una serie de objetos similares. Prince, Sting y Madonna son cantantes. No hay una sola persona con ese nombre, pero la gente puede ser llamada así si tienen las características apropiadas. El objeto OOP es una instancia de la clase.

Herencia

En la vida, las clases se dividen en subclases. Por ejemplo, los animales se dividen en anfibios, mamíferos, aves, insectos, etc.

El principio de este tipo de división es que cada subclase tiene características comunes con la clase de la cual ocurre. Todos los coches tienen ruedas y un motor. Estas son las características definitorias de los vehículos. Además de las características generales, cada subclase tiene sus propias características. Los autobuses tienen muchos asientos, y los camiones tienen espacio para el transporte de mercancías pesadas.

De forma similar, la clase base puede convertirse en el padre de varias subclases derivadas que se pueden definir de modo que compartan sus características con la adición de las propias. La herencia es similar a una función que simplifica el programa de procedimiento. Si varias partes del código hacen casi lo mismo, puede extraer los elementos comunes y ponerlos en un procedimiento. Tres secciones de aplicación pueden llamar a una función para realizar acciones comunes, pero también pueden realizar sus propias operaciones. De forma similar, la clase base contiene datos comunes al grupo derivado. Al igual que las funciones, la herencia reduce el programa OO y aclara la interconexión de sus elementos.

Reutilizar

Después de que la clase se crea y depura, se puede pasar a otros programadores para su reutilización en sus propias aplicaciones. Esto es similar a una biblioteca de funciones que se pueden incluir en diferentes aplicaciones.

En OOP, la herencia es una extensión de la idea de uso múltiple. De la clase existente, sin cambiarla, puede crear una nueva con la adición de otras funciones. La facilidad de reutilizar software existente es una ventaja importante de OOP. Se cree que esto proporciona un aumento en los retornos de la inversión inicial.

Creación de nuevos tipos de datos

Los objetos son convenientes para crear nuevos tipos de datos. Supongamos que el programa utiliza valores bidimensionales (por ejemplo, coordenadas o latitud y longitud), y existe el deseo de expresar acciones con ellas operaciones aritméticas:

Posición1 = posición + origen,

Donde posición1, posición y origen son pares de valores numéricos independientes. Crear una clase que incluye estos dos valores y declarar variables con sus objetos crea un nuevo tipo de datos.

Polimorfismo, sobrecarga

Los operadores = (igual) y + (más) utilizados en la aritmética de posición anterior no actúan de la misma manera que con los tipos incorporados, como int. La posición de los objetos y otros no están predefinidos, pero están programados. ¿Cómo saben estos operadores cómo manejarlos? La respuesta radica en el hecho de que puede establecer nuevos patrones de comportamiento para ellos. Estas operaciones son funciones miembro de la clase Posición.

El uso de operadores o procedimientos, dependiendo de con qué trabajan, se llama polimorfismo. Cuando un operador existente, como + o =, es capaz de trabajar con un nuevo tipo de datos, se dice que está sobrecargado. La sobrecarga en OOP es una especie de polimorfismo. Es su característica importante.

El libro sobre la OOP "Programación Orientada a Objetos para Dummies" permitirá a todos familiarizarse con este tema con más detalle.