2010-01-02 19 views
17

Enseño C++ durante aproximadamente 2 años en escuelas secundarias, institutos de capacitación en informática, etc. Después de enseñar conceptos básicos sobre variables, matrices, estructuras, funciones, siempre comienzo la parte de ejemplos orientados a objetos con ejemplos tradicionales, como este:Cómo enseñar programación orientada a objetos: ¿Alguna idea de dónde empezar?

class Person { 
public: 

Person(); 
~Person(); 
char* getFirstName(); //we can use std::string instead of char* in optimization part 
char* getLastName(); 
char* getFullName(); 
int getAge(); 
bool getGender(); 
void printFullProfile(); 

void setFirstName(char*); 
void setLastName(char*); 
void setAge(unsigned int); 
void setGender(bool); 
void setGender(char);//f for female, m for male. 

private: 
char* first_name; //or std::string but i prefer to use pointers in the beginning. 
char* last_name; 
unsigned int age; 
bool gender; //ladies 1(st) , male 0 
} 

y después de completar esta clase Persona y enseñar nuevas cosas como por qué getter y setters métodos son malos y evitando descriptores de acceso, la herencia, el polimorfismo mediante la creación de otras clases (como estudiante, empleado, Moderador etc.), es necesario Habilidades y conceptos de OOP.

[EDITAR]: Y estas clases son útiles para resolver problemas de programación. (Al igual que el cálculo de salario por cada objeto Employee, Estudiantes marca promedio, y muchos otros)

otros ejemplos básicos son la clase de vehículo, clase Shape, etc.

Quiero saber sus ideas acerca de cómo (SOLO) comenzar un salón de OOP.

en busca de grandes ideas.

+8

Algunas recomendaciones para su ejemplo: 1. Casi nunca alentaría el uso de char * durante el uso de C++; en su lugar use std :: string, 2. No hay necesidad de una función setter para cada miembro de la clase (esto es importante para enseñar el significado de la encapsulación) –

+2

duplicado: http://stackoverflow.com/questions/1086086/teaching-oop-to-high-schoolers, relacionado: http://stackoverflow.com/questions/597267/defining -oop-for-a-new-programmer http://stackoverflow.com/questions/355796/how-do-you-explain-oo-to-new-programmers –

+0

Sé que hemos tenido preguntas como esta aquí antes . El único que puedo encontrar es http://stackoverflow.com/questions/1129224/how-to-teach-object-oriented-programming-to-procedural-programmers pero sé que hay otros. – MatrixFrog

Respuesta

12

Comenzaría sin código, con tarjetas CRC. Deje que la clase desarrolle los roles de las tarjetas y realice una sesión de diseño de OO real. Allí puede introducir el principio de responsabilidad única, hablar sobre has-a vs is-a y herencia, encapsulación. Me encuentro con demasiados programadores que no tienen ni idea sobre OO y todavía están programando en C++, C#, java o delphi.

[editar] Más adelante, es posible que desee comparar basado en clases con Javascript (o auto) y OO basado en prototipos para hablar sobre las diferentes formas de clasificación.

+0

+1 buena sugerencia. pero no estoy empezando mi clase con el código. Edité mi pregunta. gracias –

+0

Intenté su solución recientemente. Fue interesante para los estudiantes y me di cuenta de que tenían más dificultades con el concepto de OOP que con la implementación. Entonces, las tarjetas CRC hacen el encanto :) –

+0

También como @justsomebody mencionó en su respuesta, no enseñaré OOP usando C++, Java es mi elección. –

1

Como sabemos Object Oriented conceptos están muy cerca de ser humano por lo que, cuando comienzo con el concepto oo Siempre doy los ejemplos en tiempo real y me hace mucha diferencia .. EX ... - Polimorfismo: real ejemplo de tiempo de polimorfismo es "YO", veo que hay una sola persona soy yo, pero tengo DIFERENTES ROLES, como cuando estoy en casa 1. Soy hijo de mi padre y mi madre. 2. Cuando estoy en la escuela esa vez soy maestro. 3.cuando estoy en el suelo, entonces soy un jugador ........ veo solo una persona, es decir, yo, pero tengo diferentes roles ... es decir, POLIMORFISMO

- Abstracción: soy un maestro y ustedes (estudiantes) están interesados ​​en mi enseñanza, no en lo que hice para recopilar estos datos y en lo que hice anoche. es decir, abstracción EVITAR DARLE COSAS NO DESEADAS AL USUARIO.

+0

Esto es lo que sugiero en mi pregunta ... ¿clase de persona ?! –

0

Si el tiempo lo permite y los estudiantes están ansiosos y pueden aprender. Puede enseñarles a escribir programas de GUI fáciles y construir GUI es también donde OOP es bueno.

Qt, bien diseñado en C++, es ideal para esta tarea. Los estudiantes no pueden apreciar la herencia, las funciones virtuales, hasta que hayan visto ejemplos del mundo real.

+0

¿Sugiere comenzar mis primeros ejemplos de OOP escribiendo programas de GUI simples? –

+1

@Michel Sí. Después de enseñar algunos conceptos básicos, puede usar programas simples de GUI para ilustrar el estilo y el poder de OOP. Sugiero usar Qt, 1/4 del curso OOP en C++ en nuestra universidad está usando Qt. Y a los estudiantes les gusta esta parte :) –

+0

Estoy de acuerdo con la parte "Después de enseñar algunos conceptos básicos". Estoy de acuerdo con la parte Qt también. –

2

Con el aumento de importancia en las interfaces en el mundo de la programación actual, me concentraría en lo que hace su clase (comportamiento) en lugar de sus campos y propiedades. Esto ayuda a aplicar el concepto de pensamiento "Is-A" (a.k.a. Liskov Sustitution Principle).

+1

Los objetos constan de estado y comportamiento. – deamon

+0

Sí, por supuesto que sí. Sin embargo, he visto demasiados diseños de clases que parecen diagramas de relaciones de entidades glorificadas. Muchas clases terminan teniendo muchos campos y virtualmente sin métodos. Aplicarlos a plataformas MVC, etc. es todo un desafío en ese punto. –

6

empezar evitando las clases con getters y setters. una de las principales promesas de OOP es "datos y programas van de la mano".está destinado a resolver un problema de larga data en los programas de procedimientos: un cambio en una estructura de datos en un punto se propaga a lo largo del programa a medida que fluyen los datos. OOP resuelve esto al asegurarse de que los datos permanezcan en. getters y setters son simplemente un mecanismo para eludir OOP (viajes de datos en a->setX(y->getX())), y terminan con un montón de repetición.

también, no enseñe OOP usando C++. use un lenguaje que fue diseñado para OOP. algo que tiene una encapsulación real (los cambios a miembros privados no requieren la recompilación del código del cliente) y trata a todos los tipos de manera uniforme (por ejemplo, los literales de cadena son objetos de primera clase).

+0

Olvidé algo en mi pregunta (¡editado!). Estoy de acuerdo con la parte "do not teach OOP using C++", pero ¿puedo enseñar Java o Python en la clase C++? –

+0

Probablemente podría hacer Smalltalk –

+0

@Stephan Eggermont ... Smalltalk es puro OOP Lang pero pagué la enseñanza C++: D –

7

Como han sugerido otros, use ejemplos del mundo real para explicar las cosas; como una clase de vehículo y una clase de camión para la herencia. Pero aquí está la parte importante. Una vez que entienden los ejemplos del mundo real, necesitan ver ejemplos relacionados con el programa a continuación antes de comprender realmente por qué es importante para la programación.

He visto un montón de código C++ terrible y no es solo de personas que no entienden los conceptos. He visto muchos codificadores que saben exactamente qué es un objeto y pueden explicar perfectamente el polimorfismo y todos los términos técnicos de OOP. Pero si no saben cuándo usarlo, nunca podrán aprovecharlo al máximo. Lo sé porque yo era así yo mismo. Había leído un libro sobre OOP en la escuela secundaria que explicaba todos los conceptos, pero pasé años antes de que realmente los utilizara, porque no veía cuándo iban a beneficiar a mi código. Intenta dar asignaciones de programación donde hacerlo sin OOP sería mucho más desafiante. Los estudiantes naturalmente tomarán la ruta más fácil y comenzarán a entender. Hacer es la mejor manera de aprender.

Puede tener una clase de lista vinculada y pedirle que herede de ella para crear una pila o cola escribiendo sus propios métodos push/pop, enqueue/dequeue. O bien, cree una clase de árbol binario y solicite que se convierta en un árbol de búsqueda binaria anulando el método de inserción. Haga que funcionen con memoria dinámica para que puedan ver por qué [copiar] los constructores/destructores son importantes. Pídales que escriban una clase de temporizador que almacene el tiempo como segundos, pero usa getters/setters para convertir automáticamente a minutos u horas.

No sé si sus alumnos han trabajado con matrices de caracteres o std :: strings desde el principio. Hazlos usar ambos. Cuando entiendan cuán difíciles pueden ser las matrices de caracteres, apreciarán más la clase de cadenas y comprenderán que el objetivo de una clase es la abstracción, no solo la organización del código. Si sus estudiantes siempre preguntan acerca de la organización del código y no están seguros de que un dato o método particular, deben ir, recuerde esta cita:

"Yo, de hecho, afirmar que la diferencia entre un mal programador y una buena es si considera que su código o sus estructuras de datos son más importantes. Los programadores malos se preocupan por el código. Los buenos programadores se preocupan por las estructuras de datos y sus relaciones ". - Linus Torvalds

4

No utilizaría C++ para enseñar OOP, porque C++ no es exactamente un lenguaje elegante y OOP es algo extraño en C++. Prefiero Java o Scala o tal vez Python, que es un buen lenguaje para la enseñanza. Mi primera opción sería Scala, debido a sus fuertes conceptos. No hay miembros estáticos rompiendo oop, por ejemplo. No olvide que la enseñanza es más efectiva si la programación es divertida (C++ no es tan divertido).

Me cubrir:

  • ¿Cuál es el objetivo de la programación orientada a objetos?
  • polimorfismo con la herencia y las interfaces
  • la responsabilidad de un objeto
  • encapsulación
  • mensajes entre objetos
+2

@deamon Estoy de acuerdo contigo. C++ no es bueno para empezar a enseñar OOP, pero en la clase C++ no tengo otra opción. ¿Puedo enseñar Java o Python en la clase C++? No lo creo ... –

3

¿Qué tal que muestran cómo algo de esto es relevante para programación? ¿Qué gana alguien al decirle "puede usar clases para modelar objetos físicos, como, por ejemplo, una persona"?

¿Cómo se relaciona esto con lo que intentan learn? Es decir, la programación?

Esta forma de "enseñar" OOP es una completa tontería y es completamente inútil para cualquiera que no sea ya familiarizado con los conceptos de OOP.

Si desea enseñar OOP, muéstreles algo que sea útil en la programación. ¿De qué manera los conceptos de OOP, como las clases, ayudan a resolver problemas reales de programación? ¿Ofrecen una solución más limpia que la que tendrían que usar de otra manera?

Es fácil aceptar el hecho abstracto de que "podríamos tener una clase de Persona". También es bastante fácil aceptar que "podemos derivar de esta clase de persona para crear una clase de personas más especializadas, como conserjes o niños o mujeres". Lo que falta es algún tipo de pista sobre cómo esto es útil en la programación. ¿Cómo es útil la herencia para resolver problemas de programación? ¿Cómo es útil el polimorfismo? ¿Por qué nos importa el ocultamiento de datos?

De hecho, ¿qué nos compra su ejemplo específico? Es solo una lista de getters y setters. Prácticamente no hay información escondida. No hay abstracción. Es solo un código extra sobre lo que podríamos haber hecho todo el tiempo. Si no puede escribir una buena clase , ¿está calificado para enseñar?

Y por el amor de Dios, use std::string en lugar de char*. Sí, significa que tiene que decirles a sus alumnos que "std::string es una cadena", pero al menos no tiene que tener todo el desorden y el ruido de la gestión de punteros. Mantenga su código limpio y libre de ruidos no deseados.

+1

Gracias @jalf. Olvidé algunas cosas en mi pregunta y simplemente las edité. "Para el caso, ¿qué nos compra tu ejemplo específico?" ¿Cuál es tu ejemplo propuesto? Esto es lo que quiero saber –

+1

revisé mi pregunta nuevamente después de más de 1 año. pero no hay respuesta tuya. ¿Cuál es el ejemplo sugerido de "mundo real"? ¿Una clase que podemos llamar una "buena clase"? Haznos saber. –

1

Cuando enseño programación orientada a objetos, trato de no comenzar con el código, sino con conceptos e ideas y las razones por las cuales. Aquí está a horrible Google translation de un original Swedish web page, donde escribí la introducción de OO que uso para dar.

+0

me 2 ... gracias por el enlace y la sugerencia –

Cuestiones relacionadas