vida trabajar software ser requisitos que puede programar programador programacion para lenguaje empezar donde como buen aprender oop language-agnostic

oop - trabajar - lenguaje de programacion



¿Cómo explica OO a los nuevos programadores? (17)

Mi pariente está estudiando programación y le cuesta entender las clases. Tiene problemas para entender, por ejemplo, que necesita crear una instancia, que los métodos no pueden acceder a las variables en otros métodos y que si cambia una variable en una instancia de una clase, no cambia para otras instancias.

Intenté usar analogías, como una definición de clase que es como un plano de una casa. Y los casos son casas hechas con ese modelo.

¿Cómo se explican las clases y OO en general?



¿Qué tal "cada moldura se construye usando un molde", o "cada modelo se construye usando una plantilla", y así "cada objeto se construye utilizando una clase"?

Tenga en cuenta que funciona para OOP orientado a clases (que es lo que desea), pero no para OOP orientado a prototipos.

En cuanto a explicar OOP a un programador, agregaría ejemplos que ilustran:

Separar el estado del comportamiento

La mayoría de las veces, una instancia describe un estado y una clase describe un comportamiento.

Delegación

Una instancia delega su comportamiento a su clase, y la clase a su vez puede delegar su comportamiento a sus superclases (o mixins o rasgos)

Polimorfismo

Si la clase A hereda de la clase B, se puede usar una instancia de A en cualquier lugar donde se pueda usar una instancia de la clase B.

Mensajes y métodos

Un mensaje (o función genérica, o función virtual) es como una pregunta. La mayoría de las veces, varias clases pueden responder a esta pregunta.

Un método correspondiente es una posible respuesta a la pregunta, que reside en una clase.

Al enviar un mensaje a una instancia, la instancia busca un método correspondiente en su clase. Si se encuentra, lo llama (con la instancia vinculada a ''self'' o ''this''. De lo contrario, busca un método correspondiente en sus mixins, rasgos o superclases, y lo llama.


Como el problema es explicarle a un nuevo programador y no a una madre o esposa, iría directamente al grano. OO se trata de tres conceptos principales:

  1. Herencia: un perro es un animal, un padre-hijo, es una prueba de relación, etc.
  2. Encapsulamiento: público-privado (protegido), ocultamiento de la información, los detalles subyacentes internos no son importantes para los usuarios de la clase, protegen a los usuarios de futuros cambios en la implementación.
  3. Polimorfismo: el método de enlace en tiempo de ejecución y de enlace tardío depende del tipo de objeto y no de la referencia o puntero al objeto.

Además, dependiendo de cuánto ha estado haciendo el nuevo programador un lenguaje de procedimiento, necesitaría ayudarlo a desaprender que las funciones o procedimientos ya no son centrales.


Como todos los viejos pedos, me gustaría responder a esto con una historia de mi propia vida.

Empecé a programar básicos en un VIC-20. Sin saber nada más, pensé que así era como todas las computadoras estaban programadas. Pensé que era un poco difícil hacer un seguimiento de los nombres de variables que había usado y que seguían siendo gratuitos (problema de alcance). También pensé que era difícil dividir mi programa en partes repetibles usando Gosub-return y estableciendo y leyendo las variables que utilizarían (falta de métodos).

Luego entré en Turbo C sobre MS-DOS. ¡Ahora podría crear mis propios métodos y funciones! Ya no estaba atascado con el antiguo conjunto finito de comandos en básico. Sentí que estaba creando un nuevo idioma para cada programa que escribí. C me dio más poder expresivo.

C ++ fue el primer lenguaje orientado a objetos que escuché. El gran momento para mí fue cuando comprendí que podía crear mis propios tipos de datos e incluso sobrecargar a los operadores. Una vez más, sentí que podía crear mi propio idioma con nuevas funciones y tipos de datos, completo con operadores.

Así es como vendería OO a un nuevo programador. Explique que otorga poder expresivo porque pueden definir sus propios tipos de datos. Siempre pensé que la encapsulación era un mejor argumento de venta que la herencia.


Créalo o no, ¡ deportes !

He tenido éxito en la enseñanza y la tutoría al hablar sobre la forma en que, por ejemplo, se describe una obra de teatro para un equipo de fútbol en términos de cómo las distintas posiciones (Centro, Mariscal de campo, Retransmisor, etc.) interactúan para lograr un objetivo en particular. En una versión, las posiciones corresponden a las clases, y las personas específicas (Tony Romo, Johnny Unitas, etc.) son ejemplos de la clase: individuos que exhiben los mismos comportamientos definidos por las posiciones.

La segunda versión de esta metáfora es para explicar que las posiciones pueden ser interfaces (en el sentido de Java) en lugar de clases. Una interfaz realmente representa un rol cumplido por cualquier objeto que implemente los métodos de la interfaz. Y es perfectamente razonable que un objeto (a través de su clase, en Java) implemente múltiples interfaces, del mismo modo que un individuo con talento puede jugar más de una posición en un equipo deportivo.

Finalmente, la obra es como un patrón, ya que describe cómo un conjunto de roles interactúa para lograr un objetivo específico.


Explico que el programa de procedimientos se basa en los "verbos" del sistema, las cosas que desea que el sistema haga, mientras que la programación orientada a objetos se basa en los "sustantivos", las cosas en el sistema y lo que son capaces de hacer. , y eso para muchas personas esto permite un mapeo más directo del dominio del problema al software.

Por ejemplo, uso automóviles: "Honda Accord" es una clase, mientras que el vehículo que se encuentra en el estacionamiento es un objeto, un ejemplo de un Honda Accord. Un Honda Accord es un sedán, que es un automóvil, que es un automóvil, que es un vehículo motorizado, que es un modo de transporte, etc. No puedo hacer nada con un automóvil hasta que tenga un automóvil físico para trabajar. no me ayuda que exista la idea de un Honda Accord.

También ayuda a analizar las interfaces y el polimorfismo: el pedal del acelerador significa acelerar, independientemente de lo que el auto haga entre bastidores para que eso suceda. Hay partes "privadas" del automóvil a las que yo, como usuario, no tengo acceso, no puedo aplicar un freno individual directamente.


La mejor manera de comunicarme con mi esposa (un contador público) es la siguiente.

En la programación ''regular'' tienes datos (cosas que se manipulan) y código (cosas que manipulan) y están separados. A veces te confundes porque cierta parte del código intenta manipular lo incorrecto.

En el caso de mi esposa, dije que llegó una factura (que no implica dinero físico que cambia de manos) y accidentalmente actualicé un saldo bancario, algo que inmediatamente consideró un fraude potencial (ella solía hacer contabilidad forense, todo es un fraude potencial para ella, incluida la mayoría de mis intercambios de acciones :-).

Podrías decir con la misma facilidad que una pieza de código destinada a lavar el piso con una fregona gigante decidió hacerlo con tu cepillo de dientes.

Con la programación OO, los manipuladores y manipulados están inextricablemente entrelazados. No aplica el proceso de lavado de piso al piso, sino que le ordena al piso que se lave solo. Sabe cómo hacer esto porque el código es parte del objeto, no algo externo a él.

En el caso contable anterior, creo que terminamos teniendo el plan de cuentas como el objeto y le dijimos que se aplicara una factura a sí mismo. Como entendía el proceso, sabía qué cuentas se podían actualizar (cuenta de pasivo de acreedores y una cuenta de gastos si no recuerdo mal).

De todos modos, eso es irrelevante y ahora estoy dando vueltas. Lo que estoy diciendo es expresarlo en términos que su público objetivo entenderá. Supongo que ese es el secreto de la mayoría de la enseñanza.


La programación orientada a objetos es una técnica para elevar el nivel de abstracción mediante el cual el programador se comunica con la computadora: desde el nivel de activar y desactivar bits individuales, desde el nivel de agujeros en tarjetas de papel, desde el nivel extraordinariamente secuencias complejas de códigos de instrucción básicos, desde el nivel de definiciones menos complicadas de plantillas reutilizables para bloques de datos y bloques reutilizables de código (estructuras y procedimientos) hasta el nivel de transcripción de los conceptos en la mente del programador en el código, de modo que lo que ocurre en el interior de la computadora se asemeja, para el programador, lo que ocurre fuera de la computadora en el mundo de los objetos físicos, los activos intangibles y la causa y efecto.



Los juegos son buenos Hay gameobjects, de estas paredes, los enemigos y los jugadores heredan. Los objetos del juego deben poderse presentar con lógica de colisión, etc. Los enemigos tienen ai-logic mientras el jugador está controlado por el teclado.

Algunos elementos de UI también son buenos, hay botones, cajas de entrada, etc. que todos heredan de algún objeto base que tiene código para administrar eventos de mouse, etc.

No me gusta el ejemplo animal porque nunca he visto un programa "real" que alguna vez haya tenido que usar animales de esa manera. Solo hará que la gente use la herencia en todas partes y terminará con cubos que heredan de rectángulos que heredan de las líneas (¿por qué tantos libros insisten en usar esto como ejemplo?).


Mientras estás explicando OO con animales, no te olvides de ilustrar la relación "is-a" con los canguros armados con misiles Stinger ;-)

Los canguros se dispersaron, como se había predicho, y los estadounidenses asintieron con admiración. . . y luego hizo una doble toma cuando los canguros reaparecieron desde detrás de una colina y lanzaron una andanada de misiles de aguijón contra el desventurado helicóptero. (Aparentemente los programadores se habían olvidado de eliminar "esa" parte de la codificación de infantería).

¿La leccion? Los objetos se definen con ciertos atributos, y cualquier objeto nuevo definido en términos del antiguo hereda todos los atributos. Los avergonzados programadores habían aprendido a tener cuidado al reutilizar el código orientado a objetos, y los yanquis se marcharon con el máximo respeto por la vida silvestre australiana.


OOP es un nivel más alto de abstracción, un programador no puede llegar a comprenderlo a menos que comprenda bien la forma normal de programación (lectura: procedimental), y debe poder escribir algunos programas que hacen algo útil.

Para mí tomó una serie de varias conferencias de uno de mis profesores universitarios, donde discutió muchos aspectos teóricos de la programación, trató de convencernos de que la programación se trata de manipular datos, y que estos datos son una representación del "estado (s)". ) "del programa, y ​​algunas otras cosas abstractas que olvidé ahora! Pero el punto es que es difícil entender la POO sin una discusión abstracta teórica, y esta discusión no tendría ningún sentido para una persona que no había tenido experiencia escribiendo un código real.

Después de la discusión teórica, usted da un ejemplo de un programa moderadamente complejo, escrito en estilo de procedimiento, y lo convierte lentamente, paso a paso, en un estilo orientado a objetos. Después del ejemplo concreto, debe volver a la discusión teórica y resumir los puntos principales, relacionar directamente los constructos teóricos con el ejemplo concreto, por ejemplo, puede hablar sobre cómo el nombre, la edad y el salario de un empleado representan su estado.


Si son lo suficientemente mayores como para haber completado un formulario de impuestos, muéstreles un 1040EZ y explique que una instancia de una clase es como un formulario completado: cada espacio en blanco es una variable miembro del objeto, y el formulario también incluye instrucciones sobre qué hacer con las variables miembro, y esas instrucciones son las funciones miembro del objeto. Una clase en sí misma es como una copia maestra del formulario, desde la cual puede imprimir un número interminable de formularios en blanco para completar.

Una cosa que aconsejaría EVITAR al tratar de comunicar los conceptos de OO a los nuevos programadores es usar solo ejemplos donde los objetos (en el sentido OO) representen objetos físicos del mundo real. Esto realmente confundirá a los estudiantes cuando encuentren objetos usados ​​para representar objetos no físicos (como un esquema de color, o la mayoría de los patrones de comportamiento en "Patrones de diseño") u objetos usados ​​como una manera útil de almacenar funciones relacionadas y datos relacionados en el mismo lugar (piense en java.lang.Math de Java como ejemplo)


Supongo que el objetivo sabe cómo usar interfaces gráficas de usuario. Encontré la mejor manera de describir OOP con cosas para las que realmente se usan. Decir

Clase

Una ventana es una clase. Tiene métodos como

  • Mostrar una ventana
  • Habilitar una ventana
  • Establecer el título de la ventana

Una ventana tiene atributos. Eso es datos asociados con eso. Está encapsulado en la clase, junto con las funciones que operan en ellos

  • Una ventana tiene dimensiones. Anchura y altura.
  • Una ventana tiene posiblemente una ventana principal, y posiblemente hijos.
  • Una ventana tiene un título

Objeto

Hay muchas ventanas Cada ventana en particular es un objeto de la clase Ventana . Una ventana principal que contiene 10 ventanas hace 11 objetos de ventana.

Derivación

Un botón es una ventana. Tiene dimensiones tiene una ventana principal y tiene un título, la etiqueta de un botón. Es un tipo especial de ventana. Cuando solicite un objeto de ventana, alguien puede darle un Botón . Un botón puede agregar funciones y datos que son específicos para un botón:

  • Un botón tiene un estado. Puede estar en estado comprimido y sin presionar.
  • Un botón puede ser el botón predeterminado en una ventana.

Un objeto es una caja negra, que no se puede ver a través. Los métodos públicos son botones sobre ellos. Los métodos protegidos son botones ocultos en la parte inferior, los métodos privados son interruptores DIP en el interior.

Veamos una lavadora como un objeto. No sabemos cómo funciona No nos importa si funciona con gas natural, diesel, electricidad o plutonio. Sin embargo, el mecanismo y la estructura interna variarán mucho dependiendo de la fuente de energía, ya que para algunos es necesario un motor de combustión. No nos importa, siempre y cuando presionemos el botón "Wash", lava nuestra ropa.

Vamos a convertir la lavadora no orientada a objetos. Exponga todos los botones organizándolos en la parte superior. Los clientes ahora pueden turbocargar el motor ajustando algunos interruptores dip. Haz que el chasis sea transparente. Ahora, puede ver que su lavadora de ahorro de energía en realidad es híbrida. Hay algunos monos en ella. Los liberas en la naturaleza, y la máquina come tu factura de servicios públicos como un tragamonedas.


Utiliza seriamente Animals, funciona genial. Y eso es lo que definió el concepto para mí hace años. Acabo de encontrar este código C #. Parece bien

// Assembly: Common Classes // Namespace: CommonClasses public interface IAnimal { string Name { get; } string Talk(); } // Assembly: Animals // Namespace: Animals public class AnimalBase { private string _name; AnimalBase(string name) { _name = name; } public string Name { get { return _name; } } } // Assembly: Animals // Namespace: Animals public class Cat : AnimalBase, IAnimal { public Cat(String name) : base(name) { } public string Talk() { return "Meowww!"; } } // Assembly: Animals // Namespace: Animals public class Dog : AnimalBase, IAnimal { public Dog(string name) : base(name) { } public string Talk() { return "Arf! Arf!"; } } // Assembly: Program // Namespace: Program // References and Uses Assemblies: Common Classes, Animals public class TestAnimals { // prints the following: // // Missy: Meowww! // Mr. Bojangles: Meowww! // Lassie: Arf! Arf! // public static void Main(String[] args) { List<IAnimal> animals = new List<IAnimal>(); animals.Add(new Cat("Missy")); animals.Add(new Cat("Mr. Bojangles")); animals.Add(new Dog("Lassie")); foreach(IAnimal animal in animals) { Console.WriteLine(animal.Name + ": " + animal.Talk()); } } }

Y una vez que ha conseguido esto, lo desafías a definir Bird (volar), y luego Penguin (¡volar !?)