2009-02-04 16 views
6

Al leer algunos libros de programación, observo que los autores dicen que, en OOP, puede tener cierta confusión al entender la idea principal de OOP.OOP concepts confusion?

¡Y demonios sí! Tenía algo de confusión. ¿Tuviste lo mismo y qué hace esta confusión a los programadores (incluso a los programadores experimentados)?

Y si lo tuviera, ¿cómo podría vencer esto ?!

Gracias

+0

Podría explicar con más detalle lo que se encuentra confuso? – Rik

+0

+1 a Rik. ¿Podrías decirnos más? –

+0

¿Cuál es la idea principal en OOP y por qué le resulta confuso? Para mí, es "las clases deben ser los únicos módulos" y no es confuso. –

Respuesta

4

El tropo Animal trabaja al explicar que la mayoría de la gente.

(Otros enlaces útiles here y here)

+1

Hasta que entren en el mundo real y descubran que las personas (con razón) evitan la herencia por Composición. 'Cow.moo()' -> 'soundService.makeSound (vaca)' :) –

1

creo que especialmente los programadores, que se vivieron en el desarrollo con lenguajes orientados a la función, tenían problemas para entender los conceptos de programación orientada a objetos. Al menos, fue realmente confuso para mí e hice un montón de cosas para programar funcionalidades mientras usaba un lenguaje OOP (Java).

Pero también creo que el enfoque OOP es una gran cosa para los principiantes porque este enfoque es muy "natural".

+0

JavaScript es ideal para esto, ya que es a la vez un lenguaje funcional y un lenguaje de programación orientada a objetos ALTAMENTE, por lo que podría ser la mejor 'transición' lenguaje – UnkwnTech

+0

Sé lo que quieres decir :) Para fines de aprendizaje es una pena que no puedas construir ningún tipo de aplicación con él. Así que creo que Delphi es bueno para esa transición porque te permite desarrollar funcional y orientado a objetos. – dajood

3

Mucha de la confusión en el aprendizaje de programación orientada a objetos viene de tratar de escoger la correcta relación entre los objetos y clases de objetos, en particular, si:

  • ObjectcontieneSome other Object (o Object1tiene un Object2)
  • Objectes un instancia de Class

Si puedo pensar en un buen ejemplo que muestra un caso en el que cualquiera de los dos podría ser apropiado, lo agregaré ...

+0

+1 para has-a vs is-a – annakata

0

Gracias por sus respuestas.

Creo que dar ejemplos funciona mejor, pero no siempre, ¿no?

Llamé al creador de C++ cuando dijo, se necesita tiempo y paciencia y lo entenderá mejor al intentarlo.

+0

Muy cierto, pero siempre y cuando sigas reflexionando sobre tu comprensión teórica a través de esa práctica. Eso hará las cosas mucho más concretas en el largo plazo. – Mystic

1

Nunca tuve realmente ninguna confusión pero aprendí programación a lo largo del eje de tiempo que evolucionó. así que tuve assembly, c, C++, java, C# y muchas otras que no son relevantes aquí. Lo que tiene que aceptar es que todo se expresará mediante un objeto y un objeto contiene información que se describe a sí misma (propiedades) y que puede realizar tareas relacionadas con ellos (métodos i.E .: Car.GetAllCars();).

Para la herencia y el polimorfismo y todo lo demás recomiendo la práctica. practica todo, ya que la práctica hace la perfección. Intenta desarrollar los ejemplos dados en todos los libros.

1

Una vez que comprenda los principios básicos de Oo, eche un vistazo a los patrones de diseño y principios de diseño (por ejemplo, leyendo Head First Design Patterns). Le enseñará cómo debe usar las herramientas que le ofrece. Si bien esto no es un sustituto de la experiencia práctica, sin duda puede acelerar el proceso de aprendizaje.

+0

+1 por sugerir ese libro :) – Mystic

2

Sí, al principio experimenté un poco de confusión. Esto fue en el día en que OO estaba empezando a ser popular, por lo que había muchos libros que lo cubrían, pero no lo explicaban bien para las personas que no sabían de qué se trataba. Como resultado, comencé a pensar que un objeto y una clase eran en gran parte intercambiables y definía una nueva clase para cada objeto que quería crear.

Finalmente lo "conseguí" jugando en LambdaMOO, un MUD (piense en World of Warcraft, pero sin gráficos) con un lenguaje de programación orientado a objetos en el juego. Irónicamente, MOOCode no hace distinción entre clases y objetos: los objetos heredan directamente de otros objetos. (Tenía una convención de que los objetos destinados para su uso como "clases base" se denominaran "Foo genérico" como una forma de distinguirlos de Foos específicos ("instancia"), pero eso es lo más cercano a una distinción clase/objeto como tenía.)

+1

¡Esta es también la forma en que llegué a comprender completamente OOP! LambdaMOO por la victoria. – Brendan

+0

"Irónicamente, MOOCode no hace distinción entre clases y objetos; los objetos heredan directamente de otros objetos" - OOP no requiere clases. Lo que describes se llama [OOP, basado en prototipos] (https://en.wikipedia.org/wiki/Prototype-based_programming) y JavaScript es un ejemplo de lenguaje popular que utiliza ese enfoque. –

+0

@ el.pescado - La ironía a la que me refería es que llegué a entender la distinción entre clases y objetos al trabajar con un lenguaje en el que esa distinción no existe. Uno esperaría que tal comprensión provenga del aprendizaje de un lenguaje que hace una fuerte distinción entre entonces, no de un lenguaje que los trate como intercambiables. No quise decir (ni insinuar) que MOOCode no es POO "real". –

3

OOP adopta un enfoque "orientado a problemas" para la programación frente a el enfoque tradicional "orientado a la máquina" utilizado en idiomas como C y Pascal. Aprender OOP puede ser bastante difícil si ha programado extensamente en los lenguajes de procedimiento/funcionales. Es a estos programadores que las cosas tienden a ser más confusas. Si eres nuevo en la programación, probablemente encontrarás cosas mucho menos confusas ya que estás comenzando con una mente fresca.

Dicho esto, he visto muchos programadores que han trabajado extensamente con lenguajes como Java y dicen ser buenos programadores de POO cuando en realidad eran ni mucho menos. Claro que usan funciones de lenguaje Java como interfaces, herencia, etc., y crean objetos "que son instancias de clases" y "envían un mensaje a un objeto". La mayoría de las personas usa mucha jerga OOP porque están expuestas a ella. Pero cuando se trata de escribir una aplicación simple, el código resultante expone su pobre comprensión.

Mi consejo es que no se deje atrapar por el uso de la jerga solo. Pregunta y aprende los conceptos subyacentes diligentemente. Es posible que tenga su primer semi-nirvana (como yo) cuando aprenda polimorfismo y los beneficios que aporta a la reutilización del código. Otro semi-nirvana cuando comprendes las compensaciones entre la reutilización a través de la herencia y la reutilización a través de la composición. Al final, sabrá que ha entendido bien el OOP si puede diseñar bien, o mejor dicho, un buen diseño de OO es una buena medida de qué tan bien entiende el OOP.

Si usted es serio sobre la programación orientada a objetos, usted debe leer los dos primeros capítulos de la GOF book on Design Patterns. Puede ser un poco difícil para los nuevos programadores, pero establece el quid del pensamiento detrás de OOP. Este libro es una referencia importante que cualquier programador OOP debe tener. Si entiende bien los conceptos de este libro, considérese un buen programador OO.

+0

I y otras personas han alcanzado el nirvana semi-[aprender sobre el Tell No pida el principio] (http://programmers.stackexchange.com/a/59209/93338). – Piovezan

2

De hecho, creo que se pone demasiado énfasis en el concepto de 'clase'.

El mayor avance en mi comprensión fue cuando leí sobre el principio "Diga, no pregunte".

Solo comencé a 'sentir' Orientación a los objetos cuando jugaba con (y leyendo sobre) entornos de pato como Ruby, JavaScript, Python, etc ... después de 8 años creando felizmente montones de clases en C++.

lenguajes con tipos estáticos son grandes para el código de producción, pero se paga un montón de gastos cuando se trata de hacerse una idea de Orientación a Objetos.

Además, al lado de la OOP utilizado comúnmente plazo, a menudo se olvida que primero viene OO A y OO D.