Wie kann man einem Matlab-Programmierer OOP erklären? [geschlossen]


8

Ich habe viele Freunde, die aus dem Bereich Elektrotechnik / Physik / Maschinenbau stammen und neugierig sind, worum es bei "OOP" geht. Sie alle kennen Matlab sehr gut, haben also grundlegende Programmierkenntnisse. Es fällt ihnen jedoch sehr schwer, ein komplexes Typsystem zu erfassen, das von den von OOP eingeführten Konzepten profitieren kann.

Kann jemand einen Weg vorschlagen, wie ich versuchen kann, es ihnen zu erklären? Ich bin mit Matlab selbst einfach nicht vertraut, daher habe ich Probleme, Parallelen zu finden. Ich denke, einfache Beispiele wie Formen oder Tiere zu verwenden, ist für diese Ingenieure etwas zu abstrakt. Bisher habe ich versucht, eine Matrix-Schnittstelle im Vergleich zu Array-basierten / sparse / was auch immer-Implementierungen zu verwenden, aber das hat nicht so gut funktioniert, wahrscheinlich weil verschiedene Matrixtypen in Matlab bereits gut unterstützt werden.


1
Zu Ihrem Vorteil können Sie davon ausgehen, dass matlab so etwas wie C ist, außer dass es vielfältigere Bibliotheken, eine einfachere Dokumentation und eine etwas andere Syntax aufweist.
PearsonArtPhoto

3
Wenn sie neugierig sind, was hindert sie daran, ein bisschen zu googeln und eine kurze Einführung zu lesen? Ich kann mir nicht vorstellen, dass ein guter Ingenieur wirklich neugierig auf etwas ist und dieses Interesse nicht verfolgt.

2
@Pear Ich denke, das Problem ist nicht nur die Sprache selbst, sondern auch die Verwendung, die sie daraus machen. So wie ich es verstehe, definieren sie praktisch nie neue Typen. Trotzdem ist das eine gute kurze Zusammenfassung :)
Oak

4
Fliehen! Weglaufen!
Job

3
Verwöhne sie nicht. Ohne das nutzlose OOP werden sie viel besser dran sein.
SK-Logik

Antworten:


14

Seit 2008 unterstützt Matlab die objektorientierte Programmierung. Wenn sie sich also auf vertraute Weise über OOP informieren möchten, sollten sie sich die Matlab-Dokumentation zu OOP ansehen , insbesondere die Beispiele .

Vor einiger Zeit stellte ich einige meiner Matlab-Kollegen OOP vor. Hier sind einige Beispiele, die ich verwendet habe.

Wichtig ist, dass Sie alles, was Sie mit OOP tun, auch anders machen können. Mit OOP können Sie (1) fantastischere Strukturen erstellen, (2) Code bündeln und (3) Code einfach modularisieren und schneller programmieren.

  1. Strukturen mit Feldern, die sich automatisch aktualisieren. Beispielsweise speichern Sie eine Koordinate in Pixel (weil Sie sie an einem Bild messen), aber für Entfernungsberechnungen möchten Sie sie in Mikrometern haben. Das Speichern von beiden in einer Struktur ist problematisch, denn wenn Sie eine ändern, dürfen Sie nicht vergessen, die andere zu ändern (und Sie werden es tun). Daher speichern Sie alle Koordinaten in Mikrometern. Dies bedeutet, dass Sie jedes Mal, wenn Sie sie in Pixel benötigen, konvertieren müssen, was ärgerlich und möglicherweise fehleranfällig ist.
     
    Mit einem Objekt machen Sie "Koordinate in Pixel" zu einer abhängigen Eigenschaft, die Konvertierung wird automatisch und Sie müssen sich nicht darum kümmern, zwei Koordinaten gleichzeitig zu aktualisieren. Natürlich können Sie noch viel mehr tun. Zum Beispiel könnte Ihre Struktur eine 'edit'-Methode haben, die eine GUI öffnet, so dass Sie Werte leicht bearbeiten können. Oder es kann eine Speichermethode geben, die aufgerufen wird, wenn sich ein Wert in der Struktur ändert.

  2. Sie können Funktionen mit Ihrer Datenstruktur bündeln. Beispielsweise können Sie eine angepasste Plotfunktion für Ihre von Ihnen aufgerufenen Daten verwenden plot(myDataStructure). Ebenso können Sie benutzerdefinierte dispMethoden verwenden oder sogar Ihre Datenverarbeitungsmethoden an Ihre Daten anhängen lassen.


Ich erinnere mich an 2008, dass die OOP in Matlab sehr langsam war.
quant_dev

@quant_dev: Die Dinge sind jetzt besser (2008 war das erste Mal, dass sie die Funktion anboten; seitdem wurden einige Optimierungen vorgenommen), obwohl beim Aufrufen einer Methode eines benutzerdefinierten Objekts immer noch ein größerer Aufwand anfällt als beim Aufrufen einer Funktion. Wenn Sie nicht wie in C ++ auf OOP umsteigen, sondern OOP und normale Funktionen mischen, wobei das Objekt als Schnittstelle zwischen dem Benutzer und den Funktionen fungiert, die die eigentliche Arbeit ausführen, funktioniert das System recht gut.
Jonas

Obwohl ich Ihre Beispiele mag, sind sie wirklich nicht so nützlich, es sei denn, Sie suchen nach einer größeren Wiederverwendung (was OOP auszeichnet). Wenn ich viel von Pixeln in Mikrometer konvertieren werde und kein OOP verwendet habe, erscheint es genauso einfach und vertrauter, einen Funktionsaufruf microns = convert_to_microns (Pixel) zu haben, als einige wichtige OOP-Strukturen um Klassenaufrufe herum aufzubauen . Die Verwendung der Abstraktion ist großartig, aber wenn man OOP in einer prozeduraleren Umgebung lernt, muss es einen starken Impuls geben, warum sich ihr Denkprozess ändern sollte.
Jeff Langemeier

Ich habe eine ernste Frage. Warum heißt dieses Spielzeug in Matlab OOP, aber in C ist es nicht OOP? AC-Sprache structmit Methoden ist viel ansprechender als die in Matlab.
ar2015

@ ar2015: Fragen Sie sich, warum eine Funktion in Matlab so behandelt wird, als wäre Matlab eine ernsthafte Programmiersprache? Oder glauben Sie, dass structC grundlegende OOP-Funktionen hat, die Matlab-Klassen fehlen?
Jonas

4

Versuchen Sie nicht, ein Brückenbeispiel zu finden. OOP eignet sich in ganz anderen Bereichen als der Code im Matlab-Stil (und umgekehrt). Ich würde mich für die gleiche Erklärung entscheiden, die ich jemandem geben würde, der etwas über prozedurale Programmierung weiß, aber noch nie mit Strukturen oder ähnlichen Datenstrukturen gearbeitet hat.


2

Vektorisierter MATLAB-Code hat ein stark funktionales, deklaratives Gefühl, bei dem Matrizen häufig als Beispiele in einem bestimmten Raum betrachtet werden und Operationen an diesen Matrizen als Transformationen dieses Raums. Wenn ein Phänomen, ein Prozess oder eine Entität unter Verwendung von (vektorisiertem) MATLAB modelliert wird, existiert häufig eine explizite numerische Darstellung, die als Vermittler zwischen der Programmlogik und den konzeptuellen Elementen der zu modellierenden Entität fungiert. Infolgedessen spiegeln sich Komplexitäten in der Problemdomäne eher als numerische Komplexität als als Komplexität der Programmlogik oder des Steuerungsflusses wider.

Das objektorientierte Paradigma hat ein ganz anderes Gefühl: Es wird häufig in Verbindung mit einem viel direkteren Ansatz zur Modellierung struktureller Beziehungen in der Welt verwendet. In vielen Fällen ist das OO-Programm ein direktes Modell einer Entität, bei dem die Programmlogik direkt oder indirekt die Attribute und Eigenschaften des zu modellierenden Systems spiegelt. Infolgedessen weist die OO-Programmlogik tendenziell eine größere strukturelle "Tiefe" (und möglicherweise Komplexität) auf, da sie die Feinheiten des zu testenden Systems direkter widerspiegelt.

Allerdings gibt es viele Situationen, in denen das Paradigma der Objektmodellierung sehr gut auf die Art und Weise abgestimmt ist, wie ein bestimmtes Problem verstanden und beschrieben wird. Dies ist insbesondere dann der Fall, wenn versucht wird, diskrete Entitäten mit einem breiteren Spektrum von Attributen und Verhaltensweisen zu modellieren, sodass die Betrachtung jeder Entität einzeln und isoliert informativer ist als die Betrachtung jeder Eigenschaft einzeln und der Entitäten zusammen als Grundgesamtheit.

Mit OOP verbringen Sie Zeit damit, über einzelne Entitäten und ihre Eigenschaften nachzudenken. Kollektives Verhalten ist schwerer zu visualisieren und zu beobachten. Strukturen und Beziehungen werden in der Regel explizit im Code ausgedrückt.

Mit vektorisiertem MATLAB verbringen Sie Zeit damit, über Populationen von Entitäten nachzudenken. Kollektives Verhalten ist leichter zu beobachten. Strukturen und Beziehungen werden in der Regel implizit im Code ausgedrückt.


1

Die meisten Programmierer kennen einen Hauptaspekt der objektorientierten Programmierung, die Struktur. Ich würde erklären, dass ein Objekt wie eine Struktur ist, aber eigene Funktionsaufrufe hat, um mit den Daten innerhalb der Struktur umzugehen. Fügen Sie dann langsam weitere Details hinzu, z. B. Vererbung, Weitergabe von Funktionen usw.


Ich habe den Ansatz "Strukturen mit eigenen Funktionen" ausprobiert und dann erklärt, dass sich das Verhalten dieser Funktionen je nach Implementierung der Struktur ändern kann. Das brachte mir ein sehr starkes "Wofür ist es gut" -Look ...
Oak

Wenn Sie Mathematiker sind, verwenden Sie das Wort "Tupel" anstelle von "Strukturen".
Ingo

1
Matlab handelt nicht mit Tupeln, aber ...
PearsonArtPhoto

1

Sie alle kennen Matlab ziemlich gut

Dann ist es ganz einfach: Lassen Sie sie Simulink versuchen. Simulink-Modelle sind im OOP-Geist. Wenn sie verstehen, wie ein Simulink-Modell erstellt wird, und wenn sie wissen, wie Simulink funktioniert, wissen sie bereits, worum es bei OO geht.


0

Matlab ist nur eine Sprache. OOP ist das Konzept.

Versuchen Sie, die Konzepte anhand einer weniger beispielhaften Erklärung zu erklären. Ingenieure verstehen sicherlich verschiedene Bereiche und Einheiten (z. B. das Hinzufügen von Temperatur zur Entfernung wäre ungerade), daher sollten sie die Kapselung und den Polymorphismus intuitiv verstehen, ohne konkrete Beispiele in Matlab zu benötigen. Sie sollten in der Lage sein, die Abstraktion leicht genug zu erklären. Vererbung und Zusammensetzung wären ohne Beispiele schwerer zu erklären, aber erklären Sie das Konzept klar und sie sollten verstehen.

Generika versus Typspezifität sollten durch Beispiele aus ihrem mathematischen Hintergrund motiviert werden. Funktionale Programmierung, Übergabe von Funktionen und Lambdas sind an sich keine OOP, und das ist schwieriger zu erklären, ohne einen abstrakteren mathematischen Hintergrund, der normalerweise Ingenieuren präsentiert wird (nachdem ich sowohl Ingenieurwesen als auch Software und Mathematik studiert habe, habe ich einen Einblick in ihre verschiedenen Spezialisierungen).

Möglicherweise können Sie Beispiele nicht direkt mit Matlab bereitstellen, aber Sie können Abstraktion und Kapselung anhand von Beispielen einschließlich Strukturen erläutern. Selbst in Sprachen, in denen Sie Ihre Funktionen (Methoden) nicht mit Ihren Daten kapseln können, können Sie dennoch erklären, wie bestimmte Funktionen nur für bestimmte Domänen definiert sind.

In Anbetracht der Tatsache, dass viele Entwickler die Komposition gegenüber der Vererbung schätzen, können Sie die Vererbung, die Zusammensetzung und die relativen Vorzüge der beiden erklären.

Sie können Polymorphismus auf natürliche Weise motivieren, indem Sie den Unterschied zwischen ganzen Zahlen, Rationalen, Realen und komplexen Zahlen überprüfen und dann erklären, wie die "normalen" arithmetischen Operatoren Funktionen (Methoden) sind, obwohl der Operator (ex '+') sieht gleich aus, es ist eine andere Funktion, wenn es mit verschiedenen Domänen verwendet wird.

Viel Glück!


-1

Ich bin Elektrotechniker, habe aber mehr mit CS-Programmierern gemeinsam als mit EE-Programmierern. Insbesondere habe ich erfolglos versucht, meine Kommilitonen davon zu überzeugen, mindestens halbwegs strukturierten und modularen Code zu schreiben, geschweige denn objektorientierten Code.

Als ich versuchte, die OO-Funktionen von MATLAB zu verwenden, stieß ich schnell auf sehr ärgerliche Probleme. Eine Methode in einer Klasse MUSS ein Objekt dieser Klasse als erstes Argument verwenden und das Objekt zurückgeben, wenn es das Objekt ändert. Das macht Code wie

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

und Verwendung wie

new_obj = objec.modi_object(some_piece_of_data);

Ich habe fast aufgegeben. Ich schlage vor, Sie lassen sie in Ruhe, bis MATLAB eine anständige OO-Unterstützung bietet. Bitten Sie sie stattdessen, MATLAB aufzugeben und versuchen Sie, Python oder ähnliches zu verwenden. Ich versuche (und scheitere) das zu tun.

Zumindest ist MATLAB OO in keiner Weise ein gutes Tor, um OO zu lernen. Sie könnten sie einfach für immer aufschieben.


warum die Abstimmung?
Milind R

Mir ist klar, dass dies alt ist, aber für das, was es wert ist, ist das erste, was Sie erwähnen, eine Funktion , die mit dynamischem Versand zu tun hat . Der zweite ist nicht notwendig; Wenn Sie das vorhandene Objekt lieber mutieren als neu zuweisen möchten, müssen Sie nur von der Handle-Superklasse erben. Was Python betrifft, finde ich die Implementierung einer Klasse viel schlechter / hässlicher als Matlab, nicht sicher, warum Sie das sagen würden.
Tasos Papastylianou
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.