¿Tengo problemas para entender la POO, algún consejo, libros o artículos que puedan ayudarme?

A mi modo de ver, podría haber dos formas de responder a esta pregunta. Una es asumir que estás hablando de tratar con un lenguaje que mucha gente dice que usa OOP, pero voy a decir que no, como C ++, Java o Ruby. Otra es suponer que está hablando de lo que voy a llamar OOP real, como en un lenguaje como Smalltalk, CLOS en Common Lisp o Erlang (con el Objetivo C una representación de OOP más distante pero más cercana que otros idiomas populares) .

Continuando con el primer supuesto, lo que sugiero es primero aprender sobre los tipos de datos abstractos (TDA). Es una estrategia de diseño que a veces se usa en lenguajes de procedimiento, como C. Una vez que obtenga ese concepto, piense en una clase como un ADT. Es una estructura que contiene variables. Puede crear instancias de él, y esas instancias son accedidas exclusivamente por un conjunto de funciones, también declaradas y / o definidas en la clase. Una vez que obtenga ese concepto, puede tener la oportunidad de agregarle algunas abstracciones, dependiendo del idioma, que le permitan tratar una instancia suya como una instancia de otra clase (por ejemplo, una secuencia o una cadena), si mejor representa lo que estás tratando de expresar.

Continuando con la segunda suposición (de que estamos hablando de OOP reales), sugiero pensar en los objetos como haciendo lo que hacen las computadoras. Estas computadoras no tienen que ser complicadas. Pueden ser muy sencillas, especializadas para tareas sencillas. Piense en ellos como si fueran servidores en Internet, donde los datos brindan la oportunidad de crear “sitios de servidores”, con interfaces (colecciones de métodos) que son como protocolos de Internet que operan entre servidores enviándose mensajes entre ellos. Al igual que con una red, cada servidor es su propia entidad que opera independientemente de otros servidores. Puede trabajar en cooperación con ellos, o no, dependiendo de si tienen permiso de ello.

No tengo ningún libro o artículo para recomendar, desafortunadamente.

La Programación Orientada a Objetos u OOP es un concepto para pensar todo como Objetos. El ejemplo más común de OOP es mirar el Reino Animal.

Podemos usar el sistema de clasificación en biología como ejemplo. Vamos con Felis Catus.

Dominio: Eukarya
Reino: Animalia
Phylum: Chordata
Clase: mammalia
Orden: Carnivora
Familia: Felidae
Género: Felis
Especie: felis catus

Con la POO, podríamos hacer un conjunto de clases que sigan esta estructura exacta y cada objeto inferior en la lista se hereda de su padre.

dominio de clase pública – clase base
clase pública reino: dominio
Clase pública Filo: Reino
Clasificación pública de clase: Phylum (Tenemos que cambiar de clase ya que es una palabra clave)
Orden pública de clase: Clasificación
Clase pública Familia: Orden
Clase pública Género: Familia
clase pública Especie: Género

Cabe señalar que las especies tendrán todos los métodos y propiedades disponibles desde el dominio porque cada una de estas clases se deriva una de la otra.
La herencia es una de las características clave del uso de la POO, pero no es la única. También tiene polimorfismo y encapsulación para buscar una comprensión básica de la POO.

La POO requiere una mentalidad de que no se puede aprender de los libros, sitios web o incluso de los mentores. O lo tienes o no lo tienes. Parece que no lo tienes.

OOP significa que necesita poder ver “objetos” en los datos. Y un objeto sería todo tipo de datos que se relacionarían entre sí. Incluso una pequeña cantidad de datos ya serían dignos de objetos.

Por ejemplo, sólo un nombre. Puedes crear un objeto ‘Nombre’ y usarlo para dar nombres a cualquier cosa. Las personas tendrían nombres. Pero las mascotas también lo hacen. Y también varios nombres en su escritorio también tienen nombres. Lápiz, papel, teclado, etc. Todos los nombres y todos cabrían en un objeto de nombre simple. Es decir, si sólo un nombre sería suficiente.

Pero si está tratando con personas, también podría tener que tratar con un nombre, apellidos, iniciales, títulos, etc. Así que el nombre de una persona sería una clase derivada.

Lo mismo con las mascotas. Es posible que desee nombrar a la mascota, pero también mencionar la especie. Por ejemplo, Fido el perro, Garfield el gato. Por lo tanto, un nombre de mascota también se derivaría de la clase de nombre base. Es decir, si los necesitas.

Y en algunos casos, necesita información adicional para objetos específicos. Por ejemplo, los objetos físicos pueden tener un fabricante, por lo tanto, derivaría una clase ‘PhysicalObject’ de la clase ‘Nombre’ y le agregaría la propiedad ‘Manufacturer’.

A continuación, tendría que decidir si necesita más detalles para objetos específicos. Por ejemplo, necesita saber el color del lápiz para obtener una clase de ‘Lápiz’. O una clase de ‘Grapadora’ que te dice la cantidad de grapas que tiene. Por lo tanto, obtendrías varias clases diferentes para satisfacer tu necesidad.

Sin embargo, todas esas clases se derivan de ‘Nombre’ y, por lo tanto, en su nivel básico, todas son iguales. Podría tener un contenedor lleno de objetos del tipo ‘Nombre’ y, por ejemplo, aplicar un filtro a todos los objetos del tipo ‘Lápices’ para obtener todos los datos del lápiz.

¡Y de eso se trata la POO! Se trata de hacer un análisis de datos adecuado, verificar qué partes de datos coinciden y cómo puede hacer que las cosas sean más genéricas para que todas encajen en un contenedor simple. No es fácil si no tiene la mentalidad adecuada para hacerlo y no hay “trucos especiales” que pueda aprender a ayudar. Es un poco como las matemáticas. Tiene muchos datos y necesita encontrar el denominador común entre ellos para hacer dos datos diferentes similares entre sí.

Es como cuando necesitas comparar manzanas con naranjas. Dos piezas diferentes de fruta para compararlas se realizan comparando el denominador común (ambas son frutas) y, por lo tanto, proporcionan la respuesta. Sin embargo, sería más complejo si tuvieras que comparar manzanas con huevos. Se podría decir que ambos son objetos redondos. O ambos hechos de materiales orgánicos. O ambos hechos de materiales vivos. O ambos como comida. El denominador que elija dependerá de para qué necesitará los datos.