Tengo un obstáculo en el camino del aprendizaje de la programación orientada a objetos. ¿Cuáles son algunos consejos que me puede dar de su experiencia?

Si está familiarizado con la biología, es una manera súper fácil de entender la POO.

Considere un coyote, un lobo y un fennec: todos son cánidos. Debajo de esto, el coyote es Canis Latrans, el lobo es Canis Lupus y el fennec es Vulpes Zerda.

Para representar esto usando OOP, comenzaría definiendo la Clase base para Canidae: todo lo que esperaría utilizar que es común a todos ellos iría aquí. Todos tienen tamaño, peso, color de pelaje y similares: estas son las propiedades de la clase Canidae. Cualquier acción que puedan realizar (comer, cagar, llamar, correr, etc.) son métodos de la clase Canidae.

Aunque el lobo y el coyote son del mismo género, nuestro pobre y pequeño fennec está solo. Aquí, definiría dos clases más, cada una de las cuales heredaría de Canidae. Cualquier atributo o habilidad específica que el lobo y el coyote tengan pero que el fennec no tenga sería Propiedades y métodos de la clase Canidae :: Canis. Cualquier atributo específico exclusivo del fennec sería Propiedades y métodos de la clase Canidae :: Vulpes.

Todavía hay diferencias entre el coyote y el lobo, por lo que necesitamos dos clases más, cada una de las cuales hereda de Canis, que hereda de Canidae – Canidae :: Canis :: Latrans y Canidae :: Canis :: Lupus. Dado que nuestro fennec es el único Canidae :: Vulpes que estamos usando, no necesitaremos crear una Clase Zerda para él.

Pero nos hemos encontrado con un problema: los lobos y los coyotes hacen ruidos, pero hacen diferentes tipos de ruidos. Aullan igual, y ambos se quejan, pero los coyotes no pueden ladrar. El fennec no aulla, pero puede ladrar, quejarse y llorar.

Dado que los tres pueden Whine, y Canidae es la Clase común que comparten los tres, ahí es donde ponemos el Método Whine, que, dado que es la Clase raíz, significa que podemos acceder a Whine desde CUALQUIERA de nuestras Clases de la misma manera.

Solo el lobo y el coyote pueden aullar, por lo que no tiene sentido ocupar espacio en Vulpes (que hereda de Canidae). Latrans y Lupus heredan de Canis, por lo que Canis es donde ponemos el Método Howl. Ni el lobo ni el coyote pueden llorar como el fennec, por lo que la única clase que lo necesita es Vulpes.

(Otra opción sería definir Howl en la clase Canidae, luego crear un alias para Howl en la clase Vulpes llamado Cry).

La corteza es un verdadero bicho raro en este ejemplo. En la mayoría de los lenguajes OOP, lo ubicaríamos en la clase Canidae como un método virtual , definiendo el formato que usarían las clases heredadas, pero en realidad no existe hasta que esté definido en las clases que lo usarán (Lupus y Vulpes) .

El resultado práctico de todo esto es que hemos incorporado una gran capacidad en nuestro programa con muy poco código redundante. Podemos hacer una lista de cánidos que podría ser cualquier combinación de lobos, fennecs y coyotes y podemos acceder a todos de la misma manera.

Este es un resumen básico de la herencia .

Si terminamos con conflictos, como mezclar carnívoros y herbívoros en la misma lista, podemos definir un método de comer de una manera para carnívoros, de manera diferente para herbívoros, y aún así podemos llamar a Animal.Eat pase lo que pase.

Bienvenido al polimorfismo .

Lo realmente bueno de las clases es que son solo planos: en realidad no existen hasta que los instancia como un objeto. De la misma manera, puedes sacar medio millón de objetos de una clase tan fácilmente como uno.

Digamos que hicimos nuestras clases como se indica arriba e instanciamos tres objetos usando Canidae :: Canis :: Lupus – Wolf (1), Wolf (2) y Wolf (3). En algún lugar del camino, llamas a Wolf (2). Eat (LittleRedRidingHood) – Wolf (2) ahora está saciado pero Wolf (1) y Wolf (3) todavía tienen hambre. Todo se mantiene bien y ordenado porque los Métodos que definió en la Clase solo pueden afectar ese Objeto en particular.

Y ahora entiendes la encapsulación .

Y eso es más o menos en pocas palabras.

Piensa en OO así:
Quieres construir un auto. Antes de hacer eso y usar su automóvil, debe determinar qué conforma un automóvil y qué hace un automóvil. Necesitamos un plano.

Esta será nuestra clase.

Seamos simples y digamos que lo siguiente es todo lo que necesita para un automóvil: un motor, una marca, un modelo y un número de registro

Estos serán sus campos / variables globales.

Ahora, ¿qué puedes hacer con un auto? Puedes conducirlo, ¿verdad? Por lo tanto, debe tener un método llamado unidad que haga algo. Tal vez simplemente toma una ubicación como una cadena (parámetro) y devuelve la cadena: (make + “” model + “conduce a” + ubicación).

Esta es la funcionalidad de tu clase.

Así que ahora sabemos qué hace un automóvil y qué hace un automóvil. Ahora, necesitamos construirlo. Para hacer esto, necesitamos saber qué tamaño de motor tiene, su marca y su modelo y su número de registro. Si planeamos crear varios autos, no podemos simplemente codificar estos valores, ¡todos los autos serían idénticos!

En cambio, usamos lo que se llama un constructor.

Nuestro constructor tomará los parámetros (motor, marca, modelo, número_reg) y los asignará a las variables de nuestro automóvil. (pista: podemos usar el mismo nombre para nuestros parámetros como lo hacemos para las variables de * this * car). ¡El constructor almacena nuestro automóvil en la memoria para que ahora podamos usar nuestro automóvil y conducir (“en cualquier lugar”)! Y ahora podemos usar nuestro constructor una y otra vez para crear * nuevos * autos.

Debería haber suficiente para que pueda crear un objeto de automóvil. ¡Darle una oportunidad!
Una vez que comprenda el concepto básico de un objeto, su próximo paso debería ser pensar en grupos de objetos. Su automóvil es bueno, pero ¿qué pasa si desea crear una motocicleta? ¡Seguirá teniendo los mismos campos que su automóvil y la misma funcionalidad, pero solo tiene la mitad de las ruedas de un automóvil!

Sin embargo, ambos son vehículos, por lo que quizás sea mejor crear una clase de vehículo con esas características compartidas. Luego, podría extender su clase de vehículo con una clase de Motocicleta y Automóvil que explica las diferencias.

OO puede ser difícil de entender al principio, pero en poco tiempo, ¡hará clic y se sorprenderá de que haya tenido problemas en primer lugar!

Si desea aprender OOP, le sugiero que elija un lenguaje OOP como Java o C #. Creo que parte del problema es que te estás levantando para aprender varias cosas a la vez, lo que te causa confusión.

Java te permite concentrarte en OOP, sin que la sintaxis se interponga en tu camino.

Parece que tienes una sólida comprensión de la programación de procedimientos. Entonces estás bastante cerca de entender la POO.

Suponga que tiene un conjunto de métodos que operan en una estructura de datos en un lenguaje de procedimiento. Tal vez es una pila o una cola. Estos métodos aceptarían la estructura de datos como un parámetro o devolverían la estructura de datos en una declaración de devolución.

Un tipo de datos junto con un conjunto de operaciones se conoce como un tipo de datos abstracto. Espero que sigas conmigo en este momento.

Ahora llega el punto en el que cambiamos un poco nuestro pensamiento.

Modifiquemos esa estructura de datos para que los métodos que haya definido previamente sean solo miembros de la estructura de datos. Además, “ocultemos” los miembros de datos para que solo podamos operar con los métodos.

Digamos que tenemos una estructura de datos Stack con operaciones Push y Pop.

En lugar de un método como

Empujar (Pila s, Int v)

queríamos escribir

Pila s;
En televisión:
s.Push (v);

Tenga en cuenta que el método Push no necesita un parámetro Stack, porque la estructura de datos que llamamos el método Push es la pila que hubiéramos pasado.

¡Este cambio ha convertido el tipo de datos abstractos en un objeto!

De esto se trata OOP. Todo lo demás es solo ruido para que aprendas los conceptos básicos.

Hay algunas otras cosas que decir en este momento.

Los objetos se crean utilizando el nuevo operador.

Pila s = nueva pila ():

Esto crea la estructura de datos que contiene datos y métodos, también conocidos como objetos , en la memoria.

Pero antes de que pueda hacer esto, necesitamos definir el diseño del objeto, es decir, los datos y los métodos. Esto se hace a través de la sintaxis de la clase.

pila de clase {
Vacío público Push (Int v) {
// agregar implementación
}

public Int Pop () {
// agregar implemebtation
}
}

Una clase es una plantilla sobre cómo construir un “objeto” en tiempo de ejecución.

En lo último que me hizo tropezar cuando aprendí OOP: la palabra clave ” this “.

Dentro de los métodos en una definición de clase, llegamos a la ubicación de memoria de tiempo de ejecución del objeto usando “this”.

p.ej

pila de clase {
Int [] datos;

public Int Pop () {
Int v = este .data [0];
// hacer – eliminar de arrray return v;
}
}

Obviamente, hay mucho más en OOP que estos conceptos relativamente sencillos. Pero este es el núcleo de lo que necesita saber.

Encuentre un lenguaje que se adapte a su gusto que experimentemos con objetos y clases fácilmente.

Una vez que lo consigues, puedes comenzar a jugar con la “herencia”: hacer que los objetos “hereden” datos y métodos de otros objetos.

Sí, me pareció confusa OOP al principio. Creo que hay una complicación innecesaria en la forma en que se explica la POO, o al menos una complicación prematura. Entonces, por ahora, simplemente ignore la complicación.

Eres feliz escribiendo programas de procedimiento. Asumiré que estos programas manipulan números y cadenas. Estás acostumbrado a operaciones como la suma y la multiplicación de números y operaciones como la concatenación y la subcadena de cadenas. Ahora suponga que ahora quiere escribir un programa que se ocupe de ubicaciones de mapas. Un programa bien diseñado (en cualquier idioma) para hacer esto no funcionaría en longitudes y latitudes o millas o kilómetros, sino en alguna representación de la ubicación de un mapa. Debe admitir operaciones apropiadas para ubicaciones de mapa, como medir la distancia o demora entre dos ubicaciones, o encontrar una ubicación a cierta cantidad de millas o kilómetros en alguna demora de otra ubicación. En un lenguaje OO, un tipo como ubicación de mapa se denomina clase , y una ubicación de mapa individual se denomina objeto. Eso es realmente todo lo que hay para usar objetos y clases.

En cuanto a la definición de clases, eso ya no es más mágico. Si no hay una clase de ubicación de mapa, deberá escribirla. Eso solo significa que debe decidir cómo representarlo, cómo crear uno en un lenguaje OO (esto se llama un constructor ) y cómo implementar esas operaciones que discutimos (llamados métodos ). La representación es simplemente una cuestión de determinar qué información se necesita; en este caso, una longitud y latitud son probablemente lo que desea, cada una almacenada como un número de coma flotante. En un lenguaje OO, se denominan variables de instancia o miembros de datos . Si está acostumbrado a un lenguaje de procedimiento, puede pensar en ellos como campos de registro. Entonces necesitas definir algunos constructores; en este caso, esto solo debería tomar la longitud y latitud y almacenarlos en las variables de instancia. Y los métodos: solo tienes que hacer que hagan lo que tienen que hacer; necesitaría consultar un libro de texto de geomática en este caso.

Ahora, para ser justos, esta no es toda la historia, y los idiomas OO tienden a acumularse en muchas reglas confusas, principalmente para protegerte de ti mismo y de los demás. En la mayoría de los casos, esto se debe a que los métodos pueden cambiar las variables de instancia de un objeto. Esto crea muchas trampas, porque muchas variables y variables de instancia pueden contener un objeto en particular, y controlar cuál de ellas debería “experimentar” los cambios realizados en ese objeto es muy complicado y propenso a errores. Sería tonto pensar que agregar 5 a 7 de repente debería hacer que otros 7s en su programa cambien mágicamente a 12s. Pero eso es el equivalente de lo que sucedería si proporciona un método para mover una ubicación del mapa a cierta distancia en alguna dirección: cualquier variable o variable de instancia que se refiera a esa ubicación del mapa de repente se refieren a una diferente.

Hay otras trampas de los idiomas OO. Ver mi respuesta a Java funciona en muchas plataformas de PC. Cuando lo escriba una vez, se ejecutará en cada PC. ¿Cuáles son algunos software creados en Java? ¿Por qué las personas se dirigen a C ++, C # y Visual Basic? ¿Por qué algunos programadores odian Java? para el caso de Java, pero la mayoría de estas quejas se aplican a muchos otros lenguajes OO.

“¿Cómo aprendiste la programación OO y al principio te pareció confusa?”

Todos tienen ese problema.

Deje de intentar entender la programación OO leyendo el código de otras personas o cómo las bibliotecas lo usan.

Aprender haciendo.

Crea algunas clases simples tú mismo. Úselos de manera simple, como parte de algún programa. Luego, cuando lo necesite, use la herencia para hacer variaciones en la clase. Luego, observe que desea usarlos entremezclados en una colección, deberá usar el polimorfismo.

No tenía una idea real acerca de cómo y por qué de la programación OO hasta que comencé a crear y usar clases simples para mí. Solo eran palabras y sintaxis. Pero una vez que comencé a escribir programas usando clases simples, las cosas más complicadas surgieron de manera bastante natural: pude ver cómo la herencia, el polimorfismo, etc., resolvieron los problemas de programación de la vida real al usar OO.

En algún momento, poco después de que comiences a escribir tus propias clases simples, algo hará “clic” en tu cerebro y lo “entenderás”. Y en lugar de estar confundido acerca de lo que hacen las clases, te entusiasmarás porque te permitirán hacerlo mucho más fácilmente.

Los programas de gráficos 2D simples son un excelente lugar para comenzar, ya que cada objeto que dibuja en la pantalla que crea como una instancia de una clase. Como querrá dibujar diferentes tipos de objetos, la herencia se convierte en un concepto natural. Como querrá que cada objeto sea dibujable y móvil, verá cómo la herencia múltiple (o interfaces) y el polimorfismo se vuelven útiles.

La programación orientada a objetos es en realidad muy similar a la buena programación de procedimientos.
Como este no parece ser su problema, estoy omitiendo deliberadamente herencia, polimorfisim, funciones virtuales y genéricos, pero los menciono como temas para buscar en futuras lecturas.
Enfoques orientados a objetos sobre la idea de que los programas manipulan datos o tienen algún estado. El paradigma OO dice que deberíamos modular nuestro código de forma similar a como vemos el mundo como entidades con atributos y operaciones que los manipulan.
Mantener el código relevante para alguna clase de entidades cerca de su definición.
Podemos escribir fácilmente código OO en un idioma sin soporte OO como C.
Definimos una estructura y en un archivo de encabezado para cada estructura definimos varios métodos que reciben la estructura como su primer argumento. Agrupamos todas las definiciones de funciones que se relacionan con este tipo de datos para ubicarlas. También separamos la definición de firma del método de su implementación.
Los idiomas OO solo proporcionan azúcar para esto, no requieren que expliques explícitamente el primer argumento.
Cuando comencé en C ++ descubrí que siempre estaba pensando en lo que estaba sucediendo en el código C equivalente. Y haciendo una nota mental del paramater extra.
En general, cuando utilizo cualquier función de lenguaje avanzado, me gusta entender lo que sucede debajo del capó.
Al principio, me ayuda a mantener mi antiguo modelo mental, pero también mucho después poder cambiar puede ayudar a comprender problemas más profundos.

Hola, espero que hayas pasado mejor con OOP desde el momento en que publicaste esta pregunta. Sí, al principio me pareció confuso también. Tuve un buen maestro que me mostró el poder de OOP.

Si todavía no ha comprendido la POO, no se preocupe, lleva tiempo. Pero tal vez lo que digo puede ser de alguna ayuda.

Todos los términos técnicos que escucha (herencia, polimorfismo, encapsulación, clases, métodos, etc.), los dejan a un lado por un segundo. No necesitamos tratar con ellos todavía. Lo primero que debe comprender es el propósito de OOP. OOP nos permite ver y escribir programas en un nivel superior. Qué significa eso? Déjame darte un ejemplo para ilustrar.

Supongamos que está en un automóvil y quiere conducir hacia adelante. Hay dos formas de pensar en esto. De la primera manera, puedes pensar en cosas en un nivel inferior. Por ejemplo, presione el pedal del acelerador, el gas se libera del tanque de combustible, el gas se quema para crear más energía, la energía se usa para empujar pistones, los pistones giran las ruedas más rápido, las ruedas aceleran y el automóvil avanza. ¿Notaste cómo las cosas se complicaron realmente rápido? Además, ¿notó que no teníamos que preocuparnos por lo que sucedió dentro de un automóvil? Había muchos detalles de los que no teníamos que preocuparnos.

Ahora, en la segunda forma de pensar, puedes pensar en cosas a un nivel superior. Por ejemplo, presione el pedal del acelerador, el automóvil se mueve hacia adelante. ¿Te diste cuenta de lo simple que era? Nos deshicimos de todos los detalles de nivel inferior que no nos importaban. Mientras el auto avance, estamos felices.

Este es el propósito de OOP. Es un estilo de programación que nos permite ver y escribir programas en un nivel superior. En la primera forma de pensar, puede comparar eso con escribir código de procedimiento. Las cosas pueden complicarse muy fácilmente y hay muchos detalles con los que no tenemos que lidiar (¡¿a quién le importan los pistones en un automóvil ?!). Por otro lado, en la segunda forma de pensar, puede compararlo con OOP. Todo lo que necesitábamos saber era que si presionábamos el acelerador, el automóvil avanzaría. ¿No es eso tan simple y hermoso?

OOP nos permite ver y escribir código en un nivel superior. Ahora, todos los términos técnicos que escucha (herencia, polimorfismo, encapsulación, clases, métodos, etc.), son solo conceptos que nos permiten escribir código OO. Son conceptos que nos permiten escribir código a un nivel superior.

PD: si hay alguien que no está claro, avíseme y puedo intentar editar mi respuesta.

Algunos enseñan OOD desde el primer día. Algunas personas enseñan procedimientos (por un tiempo) seguidos de OOD. Aprendí la segunda forma. Inicialmente, encontré que OOD era confuso porque era nuevo, pero mejoré con el tiempo.

La primera explicación que obtuve fue de mi libro favorito de Just Java. El autor explicó las clases como un sello de goma que crea objetos. Eso solo tenía sentido para mí.

La mejor manera de aprender programación es la repetición. Otra forma es encontrar buenos ejemplos. Hay mucho en OOD, cada lenguaje tiene arrugas, como c ++ tiene herencia múltiple, java tiene interfaces que permiten un tipo de herencia múltiple, etc. Generalmente, como las cosas más complicadas, se aplica la regla 80/20. Un libro podría estar cubriendo “clases internas anónimas” y estás pensando “WTF”. Tal vez no necesite saberlo todavía, tal vez regrese en dos meses y ese mismo ejemplo tiene sentido, ¡regrese en dos años más y se dé cuenta de algo que no se había dado cuenta antes!

Los objetos no tienen que ser una cosa mística. Un uso básico es que agrupan datos con métodos para acceder a los datos. Eso tiene sentido, pondrías tu martillo con tus uñas y tu destornillador con tus tornillos. O tal vez tú pero los tornillos y clavos juntos y el martillo y el destornillador juntos. Se trata del diseño que tiene más sentido para resolver el problema.

Primero haga la diferencia entre una clase y un objeto (una instancia de una clase).

OOP: ¡La herencia es la clave! Trata de entender el notorio ejemplo con los animales. Resumen, clases virtuales y procedimientos!
Entonces Composición – no es gran cosa …
Alcance / Visibilidad de lo que sea: variable (campo,) procedimiento (método,) o clase.
Interfaces: más como artefactos técnicos para la mayoría de los idiomas, úselos solo en patrones bien conocidos, como MVVM combinado con UTests (¡solo allí siente su verdadero poder!)
Diviértete con algunos patrones antiguos, pero no te vuelvas loco. Lo mismo con UML …

Cuando aprenda OOP, no se mezcle con JavaScript (aunque OO y bueno para aprender) y / o Dojo (que intenta reintroducir un concepto de clase en un lenguaje sin clase, pero OO …)

No creo que haya habido un punto en el que lo encontrara confuso, pero había trabajado bastante con el diseño de procedimientos y las bases de datos, por lo que entender cómo las relaciones pueden mejorar un programa fue intuitivo.

Creo que me lo explicaron a través de la analogía de hacer clases para perros. Por qué es posible que desee definir una velocidad o patas variables para ser parte de un constructor, porque los diferentes perros tienen diferentes velocidades. O por qué querría extender la clase básica de perro a una clase BorderCollie, o la clase AlaskanHusky.

Se trata de entender las relaciones más que nada.

More Interesting

Si me cayera de mi yate en medio del océano Atlántico, ¿qué posibilidades hay de que un submarino me escuche y me recoja?

¿Por qué mi perro huele su pierna amputada cuando lo regaño?

Quiero convertirme en un oficial de IAS, en lugar de casarme, ¿puedo salir con chicas y satisfacer mi necesidad biológica, lo permite nuestra ley?

Llegué tarde al trabajo hoy y me despidieron ahora estoy deprimido, asustado y me siento desesperado. ¿Qué tengo que hacer?

Mi cabello está dañado y hay una fuerte caída del cabello. ¿Cómo lo reparo?

Reservé mi primer crucero en marzo para agosto. ¿Todavía puedo agregar a mi novia para el crucero?

No la conozco personalmente y no nos hemos encontrado (amiga de Quora). Las personas en las que confío me influyen fácilmente y no sé cómo se forma la confianza. ¿Está mal confiar en ella?

¿Por qué mi perro me ladra sin cesar en el momento en que lo quito de la correa? ¿Y luego inmediatamente calmado y tranquilo cuando volví a ponerle la correa?

Ayer me encontré con esta pregunta ‘Citas y relaciones en la India’ y, para mi asombrosa sorpresa, descubrí que la terrible experiencia de las chicas me hizo pensar posteriormente. ¿No existen leyes / sistemas (con respecto a los abusadores en línea) en el lugar donde tales asuntos podrían ser reportados a las autoridades y se deben tomar medidas estrictas?

Si pudiera acelerar y avanzar en el vacío del espacio sosteniendo una bandera, por ejemplo, ¿cómo va a actuar la bandera?