¿Cómo explicar OOP a un programador de matlab? [cerrado]


8

Tengo muchos amigos que provienen de la ingeniería eléctrica / física / mecánica, y tienen curiosidad acerca de qué se trata "OOP". Todos conocen a Matlab bastante bien, por lo que tienen conocimientos básicos de programación; pero les resulta muy difícil comprender un sistema de tipo complejo que puede beneficiarse de los conceptos que introduce OOP.

¿Alguien puede proponerme una forma de intentar explicárselo? No estoy familiarizado con Matlab, así que tengo problemas para encontrar paralelos. Creo que usar ejemplos simples como formas o animales es demasiado abstracto para esos ingenieros. Hasta ahora he intentado usar una interfaz Matrix frente a implementaciones basadas en matriz / dispersas / lo que sea, pero eso no funcionó tan bien, probablemente porque los diferentes tipos de matriz ya están bien soportados en Matlab.


1
Para su beneficio, puede suponer que matlab es algo así como C, excepto que tiene bibliotecas más diversas, documentación más fácil y una sintaxis ligeramente diferente.
PearsonArtPhoto

3
Si tienen curiosidad, ¿qué les impide buscar un poco en Google y leer alguna breve introducción? No puedo imaginar a un buen ingeniero sintiendo una curiosidad genuina por algo y no persiguiendo ese interés.

2
@Pear Creo que el problema no es solo el lenguaje en sí, sino el uso que hacen de él. Por ejemplo, según tengo entendido, prácticamente nunca definen nuevos tipos. Aún así, ese es un buen resumen corto :)
Oak

44
¡Huir! ¡Huir!
Trabajo

3
No los estropees. Estarán mucho mejor sin la OOP inútil.
SK-logic

Respuestas:


14

Desde 2008, Matlab admite programación orientada a objetos. Por lo tanto, si desean obtener información sobre OOP de una manera que estén familiarizados, pueden consultar la documentación de Matlab sobre OOP , especialmente los ejemplos .

Hace un tiempo, estaba presentando a algunos de mis colegas que usan Matlab a OOP. Aquí hay algunos ejemplos que usé.

Es importante destacar que todo lo que haces con OOP, también puedes hacerlo de otra manera. Lo que OOP le permite es (1) crear estructuras más impresionantes, (2) código de paquete y (3) facilitar la modularización del código y la programación más rápida.

  1. Estructuras con campos que se actualizan automáticamente. Por ejemplo, almacena una coordenada en píxeles (porque la mide en una imagen), pero para los cálculos de distancia, desea tenerla en micras. Almacenar ambos en una estructura es problemático, porque si cambia uno, no debe olvidar cambiar el otro (y lo hará). Por lo tanto, elige almacenar todas las coordenadas en micrones, lo que significa que cada vez que lo necesita en píxeles, tiene que convertir, lo cual es molesto y puede ser propenso a errores.
     
    Con un objeto, convierte "coordenadas en píxeles" en una propiedad dependiente, la conversión se vuelve automática y no tiene que preocuparse por actualizar dos coordenadas al mismo tiempo. Por supuesto, puedes hacer mucho más. Por ejemplo, su estructura podría tener un método 'editar', que abre una GUI, para que pueda editar fácilmente los valores. O puede tener un método de salvar que se llama cada vez que cambia un valor en la estructura.

  2. Puede agrupar funciones con su estructura de datos. Por ejemplo, puede tener una función de trazado personalizada para los datos que llama plot(myDataStructure). Del mismo modo, puede tener dispmétodos personalizados , o incluso tener sus métodos de procesamiento de datos adjuntos a sus datos.


Recuerdo de 2008, que la POO en Matlab fue realmente lenta.
quant_dev

@quant_dev: Las cosas están mejor ahora (2008 fue la primera vez que ofrecieron la función; ha habido cierta optimización desde entonces), aunque todavía hay una sobrecarga mayor al llamar a un método de un objeto definido por el usuario en comparación con llamar a una función. Si no realiza una OOP completa como lo haría en C ++, pero combina OOP y funciones normales, donde el objeto actúa como la interfaz entre el usuario y las funciones que realizan el trabajo real, el sistema funciona bastante bien.
Jonas

Si bien me gustan sus ejemplos, realmente no son tan beneficiosos a menos que esté buscando una reutilización importante (que es en lo que sobresale OOP). Si voy a convertir mucho de píxeles a micras, y no he usado OOP, tener una función llamada microns = convert_to_microns (píxeles) parecerá tan fácil y más familiar que construir algunas estructuras principales de OOP en torno a las llamadas de clase . Usar la abstracción es excelente, pero con el aprendizaje de OOP en un entorno más procesal, debe haber un fuerte impulso en cuanto a por qué su proceso de pensamiento debería cambiar.
Jeff Langemeier

Tengo una pregunta seria. ¿Por qué ese juguete en Matlab se llama OOP pero en C no es OOP? El lenguaje AC structcon métodos es mucho más atractivo que los de Matlab.
ar2015

@ ar2015: ¿se pregunta por qué alguna característica de Matlab se trata como si Matlab fuera un lenguaje de programación serio? ¿O crees que structC tiene características OOP fundamentales de las que carecen las clases de Matlab?
Jonas

4

No intentes encontrar un ejemplo de puente. OOP es muy adecuado en áreas completamente diferentes a las del 'código de estilo matlab' (y viceversa). Iría por el mismo tipo de explicación que le daría a alguien que sabe un poco acerca de la programación de procedimientos pero que nunca ha trabajado con estructuras o estructuras de datos similares.


2

El código MATLAB vectorizado tiene una sensación muy funcional y declarativa, donde las matrices se ven con frecuencia como muestras en algún espacio, y las operaciones en esas matrices como transformaciones de ese espacio. Cuando un fenómeno, proceso o entidad se modela utilizando MATLAB (vectorizado), a menudo existe una representación numérica explícita que opera como intermediario entre la lógica del programa y los elementos conceptuales de la entidad que se está modelando. Como resultado, las complejidades en el dominio del problema tienden a reflejarse como una complejidad numérica, en lugar de la complejidad de la lógica del programa o el flujo de control.

El paradigma orientado a objetos tiene una sensación muy diferente: se usa con frecuencia junto con un enfoque mucho más directo para modelar relaciones estructurales en el mundo. En muchos casos, el programa OO es un modelo directo de una entidad, donde las construcciones lógicas del programa reflejan, directa o indirectamente, los atributos y propiedades del sistema que se está modelando. Como resultado de esto, la lógica del programa OO tiende a tener más "profundidad" estructural (y posiblemente complejidad), ya que refleja más directamente las complejidades del sistema bajo prueba.

Dicho esto, hay muchas situaciones en las que el paradigma de modelado de objetos está muy bien alineado con la forma en que se entiende y describe un problema en particular. Este es particularmente el caso cuando uno intenta modelar entidades discretas con una gama más diversa de atributos y comportamiento, de modo que considerar cada entidad individualmente y de forma aislada es más informativo que considerar cada propiedad individualmente, y las entidades juntas como una población.

Con OOP, pasa tiempo pensando en entidades individuales y sus propiedades. El comportamiento colectivo es más difícil de visualizar y observar. Las estructuras y las relaciones tienden a expresarse explícitamente en código.

Con MATLAB vectorizado, pasa tiempo pensando en poblaciones de entidades. El comportamiento colectivo es más fácil de observar. Las estructuras y las relaciones tienden a expresarse implícitamente en el código.


1

La mayoría de los programadores están familiarizados con un aspecto importante de la programación orientada a objetos, la estructura. Explicaría que un objeto es como una estructura, pero tiene sus propias llamadas de función para tratar con los datos dentro de la estructura. Luego, agregue lentamente detalles adicionales, como herencia, pasar funciones, etc.


Probé el enfoque de "estructuras con sus propias funciones" y luego expliqué que, dependiendo de la implementación de la estructura, el comportamiento de esas funciones puede cambiar. Eso me dio un aspecto muy fuerte de "para qué sirve" ...
Oak

Si son matemáticos, use la palabra "tupla" en lugar de "estructuras".
Ingo

1
Matlab no trata con tuplas, pero ...
PearsonArtPhoto

1

Todos conocen a Matlab bastante bien

Entonces es bastante simple: déjelos probar simulink. Los modelos Simulink están en espíritu OOP. Si entienden cómo crear un modelo de simulink, y si saben cómo funciona simulink, entonces ya saben de qué se trata OO.


0

Matlab es solo un idioma. OOP es el concepto.

Intente explicar los conceptos utilizando una explicación menos orientada a ejemplos. Los ingenieros ciertamente entienden diferentes dominios y unidades (por ejemplo: agregar temperatura a la distancia sería extraño), por lo que deberían entender intuitivamente la encapsulación y el polimorfismo sin necesitar ejemplos concretos en Matlab. Deberías poder explicar la abstracción con bastante facilidad. La herencia y la composición serían más difíciles de explicar sin ejemplos, pero explique el concepto claramente y deberían entenderlo.

La especificidad genérica versus tipo debe motivarse a través de ejemplos de sus antecedentes matemáticos. La programación funcional, las funciones de paso y las lambdas no son OOP per se, y eso es más difícil de explicar sin un fondo matemático más abstracto que generalmente se presenta a los ingenieros (después de estudiar ingeniería, software y matemáticas, tengo una idea de sus diferentes especializaciones).

Es posible que no pueda proporcionar ejemplos usando Matlab directamente, pero ciertamente podría explicar la abstracción y la encapsulación usando ejemplos que incluyen estructuras. Incluso en idiomas en los que no puede encapsular sus funciones (métodos) con sus datos, aún puede explicar cómo ciertas funciones solo se definen para ciertos dominios.

Teniendo en cuenta que muchos desarrolladores valoran la composición sobre la herencia, podría explicar la herencia, la composición y los méritos relativos de los dos.

Podría motivar el polimorfismo de forma natural al revisar la diferencia entre enteros, racionales, reales y números complejos, y luego explicar cómo los operadores aritméticos "normales" son funciones (métodos), aunque el operador (ex '+') se ve igual, es una función diferente cuando se usa con diferentes dominios.

¡Buena suerte!


-1

Soy ingeniero eléctrico, pero tengo más en común con los programadores de CS que con los programadores de EE. Específicamente, he intentado, sin éxito, persuadir a mis compañeros de estudio para que escriban al menos código estructurado y modular a mitad de camino, y mucho menos código orientado a objetos.

Cuando intenté usar las funciones OO de MATLAB, rápidamente me encontré con problemas muy molestos. Un método en una clase TIENE que tomar un objeto de esa clase como su primer argumento, y TIENE que devolver el objeto si está modificando el objeto. Eso hace que el código como

methods
     function obj_new = modi_object(obj,some_other_data)
     ...
     end
...
end

y uso como

new_obj = objec.modi_object(some_piece_of_data);

Casi me he rendido. Te sugiero que los dejes en paz, hasta que un poco de soporte OO decente entre en MATLAB. Pídales que renuncien a MATLAB e intenten usar Python o similares. Estoy intentando (y no puedo) hacer eso.

Por lo menos, MATLAB OO no es de ninguna manera una buena puerta de entrada para aprender OO. Podrías posponerlos de por vida.


¿Por qué el voto negativo?
Milind R

Me doy cuenta de que esto es antiguo, pero por lo que vale, lo primero que mencionas es una característica , y tiene que ver con el despacho dinámico . El segundo no es necesario; Si prefiere mutar el objeto existente en lugar de reasignarlo, todo lo que tiene que hacer es heredar de la superclase Handle. En cuanto a python, creo que su implementación de una clase es mucho peor / fea que matlab, no estoy seguro de por qué diría eso.
Tasos Papastylianou
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.