2009-02-28 7 views
14

Al enseñar un primer idioma a alguien sin experiencia en programación Me resulta difícil definir OOP a pesar de que prefiero OOP, ¿cómo puedo definir OOP a alguien con poca (o cero) programación ¿experiencia?Definición de OOP para un programador nuevo

+0

duplicado: http://stackoverflow.com/questions/355796/how-do-you-explain-oo-to-new-programmers – hasen

+0

@hasen j - No había visto eso, pero esto tiene algunas buenas respuestas . – UnkwnTech

+0

** Vea también: ** "Comparación libre de jerga de OOP vs Procedural": http://stackoverflow.com/questions/1530868 – dreftymac

Respuesta

26

Se podría intentar algo así como el enfoque siguiente, que he modificado ligeramente aquí de un post en un foro que hice hace un tiempo:

El conjunto más básico de vocabulario para la programación orientada a objetos es una clase, un método, y un parámetro.

Una clase es un conjunto de funciones que trabajan juntas para realizar una tarea. Una instancia de una clase se considera un objeto.

Un método simplemente se refiere a una función que está encerrada en una clase.

Un parámetro es una variable que se pasa a una función que le indica cómo actuar o le da información para procesar.

Si va a excavar un poco, encontrará abundante información sobre patrones de diseño. Algunos de estos pueden ser útiles para observar, aunque tendré cuidado de incluirlos demasiado al principio porque pueden ser abrumadores. Hay dos acrónimos útiles (y un tanto usados ​​en exceso) que puedes tener en cuenta cuando trates de entrar en una mentalidad de OOP: DRY y KISS.

DRY significa Do not Repeat Yourself y significa exactamente eso. Si escribe algún código, no debería tener que repetir ese código en particular nunca más. En términos prácticos, significa pensar de manera más abstracta y planificar un poco mejor desde el principio. Daré un ejemplo en breve.

KISS significa Keep It Simple, Stupid y significa que debe tratar de escribir código que logre su objetivo de la manera más sencilla posible. Más simple significa menos posibilidades de errores y un mantenimiento más sencillo. En el contexto de OOP, esto generalmente significa asegurarse de que cada método o función tenga una sola tarea. Si encuentra que un método hace más de una cosa, generalmente significa que puede refactorizarse en varios métodos más pequeños, cada uno dedicado a una tarea específica.

Ahora, para un ejemplo sencillo (alguien podría ser capaz de llegar a una mejor, pero ir conmigo en él por ahora):

Digamos que usted necesita programar dos formas diferentes, una que procesa información sobre autos y otra que hace lo mismo para camiones.

Para los coches, vamos a querer registrar la siguiente información:

  • color
  • Tamaño del motor
  • Tipo de transmisión
  • Número de puertas

Para camiones, necesitamos :

  • color
  • Tamaño del motor
  • Tipo de transmisión
  • Cab Tamaño
  • capacidad de remolque

En la programación de procedimiento, podría escribir el código primero para procesar el formulario coche y luego el código de la forma de camión.

Con la programación orientada a objetos, escribiría una clase base llamada vehículo que registraría las características comunes de lo que necesitamos tanto de camiones como de automóviles. En este caso, la clase de vehículo registrará:

  • color
  • tamaño del motor
  • Transmisión tipo

Haremos cada una de esas características en un método separado. El método de color, por ejemplo, podría tomar el color del vehículo como parámetro y hacer algo con él, como almacenarlo en una base de datos.

A continuación, crearemos dos clases más: camión y automóvil, que heredarán todos los métodos de la clase de vehículo y lo ampliarán con métodos que son únicos para ellos.

La clase de automóvil tendrá un método llamado numberOfDoors y la clase de camión tendrá los métodos cabSize y towingCapacity.

De acuerdo, supongamos que tenemos un ejemplo de trabajo para la programación procedural y de OO. Ahora, repasemos algunos escenarios.

Escenario 1: Supongamos que de repente tenemos que añadir una forma de autobús, que registra la siguiente información:

  • color
  • Tamaño del motor
  • Tipo de transmisión
  • Número de pasajeros

Procedural: Tenemos que volver a crear todo el formulario, repitiendo el código de Color, Tamaño del motor y Tipo de transmisión.

OOP: Simplemente ampliamos la clase de vehículo con una clase de bus y agregamos el método, numberOfPassengers.

Escenario 2: En lugar de almacenar el color en una base de datos como lo hacíamos anteriormente, por alguna extraña razón nuestro cliente quiere el color enviado por correo electrónico.

Procedural: Cambiamos tres formas diferentes: automóviles, camiones y autobuses para enviar el color por correo electrónico al cliente en lugar de almacenarlo en la base de datos.

programación orientada a objetos: cambiamos el método de color en la clase de vehículo y porque los automóviles, camiones, autobuses y las clases se extienden todas (o heredar de, por decirlo de otra manera) la clase de vehículo, que se actualizan automáticamente.

Escenario 3: Queremos pasar de un coche genérico a marcas específicas, por ejemplo: Nissan y Mazda.

Procedural: Creamos un nuevo formulario para cada marca, repitiendo todo el código de información genérica del automóvil y agregando el código específico para cada marca.

OOP: Extendemos la clase de automóvil con una clase nissan y una clase mazda y agregamos métodos para cada conjunto de información única para esa marca de automóvil.

Escenario 4: Encontramos un error en el área de tipo de transmisión de nuestro formulario y necesitamos repararlo.

Procedural: Abrimos y actualizamos cada forma.

OOP: Arreglamos el método de tipo de transmisión en la clase de vehículo y el cambio se perpetúa en cada clase que hereda de él.

Como puede ver en los escenarios anteriores, el uso de un estilo OOP tiene ventajas significativas sobre la programación de procedimientos, especialmente a medida que aumenta su escala. Considere los ahorros que recibiríamos de OOP en términos de código repetido, flexibilidad y mantenimiento si también tuviéramos que agregar formularios para barcos, motocicletas, aviones, go-karts, cuatrimotos, motos de nieve, etc.

Objetos y métodos son también es mucho más fácil de probar que la programación de procedimientos mediante el uso de pruebas unitarias para evaluar los resultados.

¿Esto significa que nunca debe usar la programación de procedimientos? No necesariamente. Si está haciendo una maqueta o una aplicación de prueba de concepto, es posible que no tenga tiempo para hacer todo orientado a objetos, por lo que creo que sería mejor usar programación de procedimientos para un prototipo, pero sería mejor para hacer el producto de producción de una manera OO.

+0

En mi opinión, eso es un poco demasiado formal para un principiante ... pero está muy bien escrito ;-) –

+0

Volviendo a leer la pregunta, creo que probablemente tengas razón. Probablemente sería útil si tuvieran al menos una * pequeña * experiencia en programación. La pregunta que esto respondió en el foro fue acerca de los estilos de procedimiento y OOP, por lo que podría no ser un ajuste exacto ... – VirtuosiMedia

+0

Sin embargo, puedo completar los requisitos necesarios para comprender esto antes de usarlo. – UnkwnTech

3

Hasta donde yo sé, la programación orientada a objetos significa originalmente que usted organiza todos los conceptos de su programa en objetos y luego define todo el flujo lógico como mensajes entre esos objetos. Creo que para entender la intención original, debes aprender Smalltalk.

+0

Muy buena respuesta. Una sugerencia menor: IMO, Self en realidad sería incluso mejor que Smalltalk para enseñar programación OO, porque Self * really * solo tiene objetos y mensajes - sin variables, sin constantes, sin clases. –

12

Bueno, debería usar ejemplos. Un ejemplo que la mayoría de la gente entiende es en los videojuegos de referencia. Entonces, tienes objetos monstruosos y los monstruos tienen ciertos atributos como color, tamaño, forma, número de brazos, etc. Entonces, algunos monstruos tienen diferentes "habilidades" como el aliento, disparar armas, etc., etc. Estos son ejemplos tontos pero fáciles de entender. Creo que es más fácil explicar a un novato que todo este asunto sobre "cuadrados", "círculos", etc.

+0

No estoy de acuerdo con la base de que existe una percepción errónea generalizada de que "objeto" significa "cosa que puedes ver en la pantalla" (generalmente botones, cuadros de texto, etc.) y el uso de monstruos de videojuegos (que son visibles en la pantalla) en eso. –

+0

Estoy de acuerdo en que este tipo de debate se vuelve muy interesante para los jóvenes. Tengo la intención de usarlo para mis futuras clases. –

+0

Bueno, lo he visto usado mucho y realmente no ha tenido el problema de confundir objetos con cosas visibles. Creo que los pros superan a los contras. No es un gran salto ir a objetos conceptuales/abstractos/no visibles. Creo que es más fácil de entender lo han visto acostumbrado al éxito en el aula. – BobbyShaftoe

5

Lo explicaría como una forma de modelar información del mundo real. Existe una analogía común que usa automóviles y vehículos para mostrar la jerarquía de tipos. Creo que es lo suficientemente simple para que la mayoría de la gente lo entienda, si lo explicas correctamente.

Quizás debería comenzar por explicar tipos primitivos, luego hablando de tipos compuestos como estructuras, y luego mostrar cómo se pueden relacionar tales tipos como clases que usan herencia.

Editar: Después de pensarlo, el ejemplo de los animales es mucho mejor. Consulte Explaining OOP without Mentioning Classes y this SO thread sobre el mismo tema.

6

No pierda el tiempo "definiendo" OOP.

Simplemente use un lenguaje OOP para todos sus ejemplos.

Los objetos son trivialmente obvios. El mundo real está lleno de objetos.

No "defina" objetos. Simplemente muestre ejemplos de programación, la 'objetividad' será obvia.

Las personas sin antecedentes de programación no tienen expectativas tontas basadas en la programación de procedimientos.

Las personas que aprendieron COBOL o Basic tendrán problemas.


Partes de esto dependen del idioma. Algunos lenguajes dificultan la OOP.

Por ejemplo, en C++, la "clase" es simplemente definitional. No existe como un objeto discreto en tiempo de ejecución.

En Java y C++, algunas cosas son objetos, pero algunos tipos "primitivos" no son objetos.

Algunos lenguajes hacen que la OOP sea más fácil.

Python y Smalltalk todo es un objeto. No hay tipos primitivos para enturbiar las aguas. Cuando aprendes OO en un lenguaje como Python, la objetividad es clara y obvia porque impregna todo. Al igual que el mundo real, donde los objetos están en todas partes.

+0

Si los objetos son trivialmente obvios; entonces, ¿por qué tantos desarrolladores son tan malos para elegir buenos objetos? En muchos casos, ni siquiera son objetos en absoluto. – Dunk

+0

@Dunk: porque muchos programadores aprendieron primero la programación de procedimientos: VB o C o algo así. –

+0

No estoy seguro de que los objetos sean triviales, pero creo que tiene la idea correcta. No lo definas, solo hazlo. Preséntelo como la forma en que se supone que debe escribirse el código. Luego vuelve más tarde y explica lo que estabas haciendo todo el tiempo (y otros paradigmas disponibles). –

-1

Quien sea que esté explicando esto necesita saber qué es la programación básica antes de poder aprender qué significa OOP, ya que es una rama de los lenguajes de programación. Él nunca puede entender qué hace especial a OOP si no conoce a sus contrapartes. Entonces tu pregunta tiene dos partes; cómo explicar qué es un lenguaje de programación y qué separa OOP de otros lenguajes de programación.

La manera más fácil de explicarle de qué se trata la programación en general es compararla con operaciones matemáticas. Puede explicarlo definiendo la programación como un número de expresiones matemáticas que toman una entrada que da como resultado una salida. Hasta dónde deseas elaborar depende de ti.

Con esta explicación hemos hecho el trabajo preliminar para que comprenda lo que significa OOP. Ahora podemos definir Objetos como conjuntos de funciones y datos matemáticos. Entonces, en lugar de tratar la lógica como trozos globales de código, reunimos estos trozos de código dentro de los objetos para reunir piezas de código relevantes y obtener una forma de aislarlas. A partir de este punto, puede explicar más ventajas que vienen con la abstracción del Objeto (por ejemplo, polimorfismo, acoplamiento libre).

+0

Se define con mayor precisión como una colección de funciones y datos. Cada función toma el objeto así como sus otros parámetros. De lo contrario, no es una función, debido a posibles cambios de estado. Me recuerda a Python. Desafortunadamente, esto no es tan útil para decir cómo se usarán los objetos. –

4

Digamos que desea describir una familia de cosas que comparten todos los mismos atributos, pero que pueden tener diferentes nombres, colores u otras diferencias estéticas.

Por ejemplo, desea describir los vehículos que una familia tiene en el garaje.Hay Atributos de cada Vehículo de su interés:

  1. ¿Cuál es el modelo y el año de cada vehículo?
  2. ¿Cuántas ruedas tiene un vehículo?
  3. ¿Quiénes son las personas que conducen un vehículo determinado?

En este caso, es posible que tenga un conjunto de dos vehículos, de tal manera que se cumple lo siguiente:

Vehicle A's Model is a Toyota. 
Vehicle A's Year is 2001. 
Vehicle A has four Wheels 
Vehicle A is driven by Mom, Dad, and Junior 

Vehicle B is a Moto Guzzi 
Vehicle B was made in 2004 
Vehicle B has two wheels 
Vehicle B is driven by Dad 

en varios idiomas, es posible referirse a grandes rasgos los dos ejemplos de la siguiente manera equivalente :

A = new Vehicle(); 
A.model = "Toyota"; 
A.year = 2002; 
A.wheelCount = 4; 
A.drivers = [ "Mom", "Dad", "Junior" ]; 

B = new Vehicle(); 
B.model = "Moto Guzzi"; 
B.year = 2004; 
B.wheelCount = 2; 
B.drivers = [ "Dad" ]; 

En programación orientada a objetos, que está encapsulando los atributos de estos vehículos, por lo que se puede describir por sus características. Su trabajo es escribir código para obtener y establecer los valores de estas características (así como también hacer otras cosas interesantes con estas características).

Además, puede "subclase", que es una forma de reutilizar un objeto en diferentes contextos. Por ejemplo, podría utilizar tipos de vehículos objeto más específicos, tales como coches y moto, que heredan sus características de la descripción del vehículo:

A = new Car(); 
B = new Motorcycle(); 

de automóviles y motocicletas objetos son descripciones más específicas de un vehículo. Estas dos subclases pueden tener sus propios atributos especiales. Un automóvil puede tener cerraduras a prueba de niños, mientras que una motocicleta generalmente no tendría tal necesidad de una cosa.

En lugar de establecer el atributo de bloqueo a prueba de niños de un vehículo, puede decir que solo un automóvil tiene un atributo de bloqueo. Esto hace que su descripción del Vehículo sea más limpia y más fácil de escribir y mantener.

15

Utilizo el ejemplo de "pelotas de rebote". Imagina que tienes una caja con una pelota que rebota dentro.

se puede programar de 2 maneras:

Una forma es ejecutar un bucle, un seguimiento de la posición actual de la pelota, el cálculo de la posición siguiente, comprobar las colisiones, borrar de la posición actual, dibujar en la nueva posición. repetir.

La otra forma es dejar que la bola haga un seguimiento de su propia posición y orientación y enseñarle a calcular la siguiente posición y cómo moverse allí y cómo manejar las colisiones. Luego, ejecute el ciclo y dígale a la pelota que se actualice.

Ahora imagina que tienes 100 bolas. Luego hay bolas pesadas y bolas ligeras y bolas explosivas. Estas son bolas básicas con características adicionales. ¿Seguirías usando el método 1?

+0

Esa es una excelente descripción. Bien hecho. –

2

Programación Orientada a Objetos en endecha hablar:

  1. Todo en su programa es una cosa (objeto). Esto tiene propiedades que lo explican (tamaño, forma, color, etc.))
  2. El programador le pregunta lo que hay que hacer cosas preguntas/respuestas: Haga su gran tamaño (setSize) o ¿Cuál es su tamaño (getSize)

El cosa se ocupa de ajustar sus propiedades sólo cuando se pide a (llame a un método). No puede examinar directamente ni cambiar las propiedades de. Solo puede examinar o cambiar las propiedades lo que le permite ver. Por lo tanto, cosa puede asegurar que las propiedades se ven y cambian correctamente.

Esto evita que el programador de decir cosa su tamaño es roja. Si le dices directamente que haga que su tamaño sea rojo, debería rechazarlo (el rojo no es un tamaño válido). Además, permite que las cosas administren los efectos secundarios de cambiar sus propiedades.

Supongamos de loOriginalSize es gran. Si que acaba de cambiar de cosatamaño a pequeña, me tienen que recordar decir cosa que ya no es su OriginalSize. Si yo pido cosa para cambiar su tamaño a pequeña que va a cambiar su tamaño a las pequeñas y cambiar el OriginalSize a falso. Ahora cuando pregunto si es su tamaño original, responderá con un no.

Esencialmente esto le permite empaquetar sus datos y funciones juntos haciendo que las cosas sean más modulares/compartimentadas. Esto le permite organizar mejor el código y reutilizar código más fácilmente. OOP no es nada súper especial, solo una forma de organizar mejor tu código. No es crítico en el nivel de principiante, pero es crítico para proyectos más grandes. Dentro de las funciones de un Objeto, las cosas generalmente se vuelven más procesales, como se acostumbra a un principiante.

1

Cualquier explicación de OOP depende en gran medida de la interpretación del concepto por parte del explicador. Mi interpretación del concepto es algo como esto.

El mundo real se entiende en gran medida como un conjunto de actores. Cada actor tiene una colección de propiedades y comportamientos. En la mayoría de los casos, las propiedades de un actor se expresan en términos de sus comportamientos, en relación con su interacción con otros actores.

Un programa de computadora es generalmente una simulación de algún proceso del mundo real, por lo que generalmente ayuda al programador a construir el programa basado en un modelo de actores-comportamientos-propiedades. Es decir, cada elemento del programa completo se puede dividir en programas más pequeños que representan actores individuales.

Por supuesto, solo puedes llevar eso hasta ahora. No todo lo que queremos modelar es un actor único. Por ejemplo, la moneda se conserva, pero en muchos sentidos es infinitamente divisible.

Además, otras formas de modelar el mundo real pueden ofrecer garantías de corrección más rigurosas a costa de una abstracción mayor, como un modelo relacional, que se deriva de la teoría de conjuntos. OOP no tiene esa base matemática.

-1

Es extraño. ¿Estás preguntando sobre enseñar OOP a personas que no saben nada sobre PROGRAMACIÓN y todos responden "¿Cómo enseñar OOP?"

La respuesta es que no. ¿Cómo se enseña programación funcional a alguien que nunca ha programado? Tu no Tienes funciones, el código está repleto, se reutilizan, etc. En Java, todo tu código debe estar en una clase. ¿Qué es una clase? Es, en primer lugar, un lugar para poner tu código. Los programas comienzan en el método Principal. Más adelante, puede crear una instancia, y cada clase tiene sus propios métodos y propiedades. Y luego hablas de métodos estáticos y variables. Y luego, un tiempo después, hablas de polimorfismo y herencia. Y en algún momento allí comienzan a diseñar sus propias API y usan servlets y clases persistentes o lo último en implementar (snervlets? IHibernate?)

Pero si nunca antes ha visto programación, no es necesario sentarse y tener la gran charla OOP. Eso solo es necesario si está guardando a alguien de una programación que no es de OOP. Solo enseñe programación. Programación OOP? ¿Hay algún otro tipo? Sí, pero no estamos enseñando eso hoy, así que no nos preocupemos por eso.

[Por analogía: cuando vas a una clase de artes marciales, por lo general no pasan mucho tiempo explicando. Primero estiras, te hacen entrenar, y luego te enseñan algunas técnicas. Si está interesado en averiguar qué arte marcial está estudiando, vaya a la biblioteca.]

+0

Si piensa demasiado en el problema, los conocimientos básicos se impartirán primero. – UnkwnTech

+0

Bien, buena suerte con eso. –

5

Un equipo de deportes. Los jugadores del campo/cancha en cualquier momento pueden ser especificados en términos de las posiciones que juegan. Sin embargo, todo el equipo puede tener múltiples miembros que pueden jugar un puesto determinado.

Cada posición es como una clase en OO; especifica un conjunto de responsabilidades. Los miembros del equipo son instancias de esas clases.

Las reproducciones en el libro de jugadas son patrones. Cada uno especifica cómo lograr un resultado específico a través de las interacciones de (instancias de) posiciones (clases).

2

Aquí hay una definición simple.

Gun gun = new Gun(new Bullet); 
gun.Aim = Appendage.Foot; 
gun.PullTrigger(); 

;)

+0

gun.AimAt, gente común! – mannicken

1

Un objeto es un sólo una cosa con un montón de propiedades con nombre. Los valores de estas propiedades definen el estado de un objeto. La interacción entre los objetos se realiza a través del mensaje pasando. Un mensaje consiste en un nombre y un grupo de parámetros. Cuando un objeto recibe un mensaje, el objeto lo procesa. Procesar un mensaje puede provocar un cambio en el estado del objeto y enviar mensajes a otros objetos.

1

es tan fácil como tarta deletreado al revés. los 3 principios básicos de oo son:

encapsulación herencia polimorfismo

muestran el novato el código para el sorteo estándar moldea ejemplo que se encuentra en la mayoría de los libros de programación oo. también les muestra el código no-oo usando muchos interruptores con datos globales.

deberían tener alguna idea de oo en función de las diferencias organizativas entre los dos conjuntos de códigos.

Cuestiones relacionadas