objektorientierte mathematica-Programmierung
Ich Frage mich, wie es zu tun im Allgemeinen, was sind die besten Strategien, etc. Ich habe einige Lösungen gesehen, und einige von Ihnen sehen wirklich schwer/mühsam zu bedienen. Die, die ich arbeitete für gebrauchte pur-Funktionen zu implementieren, die Objekt-Funktionen und-Köpfe wie OBJECT[]. Es war sehr schwer zu verwenden, die auf die Klasse Codierung Seite. Ich bekam Schwindel beim definieren von Funktionen und Konstruktoren (vor allem die Vererbung Teil war hart).
Also die emaphsis meine Frage ist auf die elegenace von dem codierenden Teil einer Klasse. Idealerweise bin ich auf der Suche nach etwas, das würde funktionieren wie folgt. Zunächst definieren wir eine Klasse, z.B. PKW wie folgt:
beginClass["vehicle"];
public startTheEngine;
private fuel;
vehicle[args_]:=Block[{},...];
startTheEngine[thrust_]:=Block[{}...];
endClass
beginClass["car", "vehicle"];
public TurnTheRadioOn;
private frequency;
car[args_] := Block[{...},];
TurnTheRadioOn[]:=
Block[{},
use private variable frequency
]
endClass;
Bitte beachten Sie, dass es ist sehr wichtig, dass die private - /public-Funktionen definiert sind, fast wie in einer "normalen" mathematica-code. Dies wäre die wichtigste Voraussetzung, so zu sagen.
Klasse verwendet werden, als
car1 = newObject["car", args];
car1.StartTheEngine[];
car1.TurnOnTheRadio[];
Ich bin neugierig, was ist das denn denken? Zu consturct so etwas wie das oben wohl beinhaltet viele Aspekte von Mathematica, z.B. wie würde man die ". " - syntax etc. Wenn Sie vorschlagen, ein vorhandenes Paket-ich wäre Ihnen dankbar, wenn Sie könnten kommentieren, wie es im Prinzip funktioniert.
Meine naive Erwartung ist, dass die Verkapselung Teil könnte behoben werden, indem BeginPackage Konstrukte. Alle Objekte, die gespeichert werden können in namespaces, die speziell für jede Klasse. Ich nehme an, dass die Objekte Aussehen würde
car1 = OBJECT["car"][fuel$1,frequency$1,....];
car2 = OBJECT["car"][fuel$2,frequency$2,....];
Ich nehme an, man hätte zu konstruieren, so etwas wie einen compiler, der zum konvertieren der definition der Klasse, obigen code in die Klasse ein .m-Datei. Auch, zu einem gewissen Grad, das zweite zentrale Thema ist, wie zu konstruieren, die so ein compiler.
Grüße
Zoran
p.s. Der Grund warum ich Frage ist, dass ich hatte wirklich eine Notwendigkeit für so etwas wie dies viele Male.
- Beachten Sie, dass, wenn man nur auf der Suche nach
Struct
-wie-Fähigkeiten (d.h. die Fähigkeit, den Zugriff auf Daten, die mit Namen wiedataAboutBob[["weight"]
), dann dieAssociation
- Struktur Hinzugefügt in Mathematica 10 verwendet werden kann. Mehr hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Mathematica-Sprache ist optimiert für die symbolische Programmierung Paradigma, und bietet die Hebelwirkung und Komfort, wenn man bleibt innerhalb dieses Paradigmas. Objekt-orientierte Programmierung ist eine erhebliche Abweichung von der symbolischen Paradigma, und man landet zu schreiben die meisten der unterstützenden Infrastruktur von Grund auf neu. Es ist nichts falsch mit, dass, natürlich, aber es wäre viel weniger Aufwand zu nutzen, die J/Link Anlage und schreiben von OOP-code in Java. Die Wolfram Workbench macht es leicht zu mischen Mathematica und Java-code.
Wäre es fruchtbar, um darüber nachzudenken, was die Anforderungen sind, fahren in Richtung einer OOP Lösung. Die Frage suggeriert, dass das Interesse in der Frage, wie simulieren Struktur-Typen, aber vielleicht gibt es auch andere Probleme wie Kapselung und Polymorphismus. Es scheint, es gibt Spielraum für einige weitere spezifische follow-up-Fragen entlang der Linien von "Was ist das Mathematica-entspricht der Objekt-orientierten idiom X?".
OOP Schädlich?
Im Rahmen von Mathematica, object-oriented programming könnte sich sogar als schädlich. OO betont, die Schaffung von "black-box" - Objekte, deren Einbauten nicht zugänglich sind, um Anrufer von außerhalb. Dies hat zwar offensichtliche Vorteile für die Komplexität der Steuerung durch information hiding, es tut Fliegen direkt in das Gesicht der macht, der symbolischen Programmierung. Mathematica betont die Synergie zwischen scheinbar nicht verwandten Komponenten, indem Sie die symbolische Darstellung eines zu sein, umgewandelt in die symbolische Repräsentation des anderen. Eine "black box" nicht gut spielen in diesem ökosystem. Als ein konkretes Beispiel den Kontrast der Unterschied zwischen
Graphics
"Objekte" und der neue V8 -Graph
Objekte. Die letzteren nehmen eine etwas OO-Ansatz-Generierung einige negatives feedback in der Gemeinschaft.Nichts davon ist zu sagen, dass OO ist an sich schädlich. Der Punkt dieser Diskussion ist, dass OO Fremd ist das Mathematica-ökosystem und dass durch die Einnahme, die design-Wahl, könnte man ausschließen, einige wünschenswerte Synergien in der Zukunft. Nehmen Sie diese Entscheidung bewusst.
Verweise ich Sie auf diese post von mir wo ich über eine Möglichkeit, etwas umzusetzen, ähnlich zu dem, was Sie sich wünschen. Dies wird nicht geben Ihnen ein Objekt-system, Vererbung oder Polymorphismus Merkmal von OO, sondern die eigene Formulierung, es sieht aus wie Sie suchen mehr für die Mittel zu konstruieren, ADTs (Abstrakten Datentypen), als die vollwertige OO-Erweiterung. Für ein nicht-triviales Beispiel für die Verwendung von mutable Datenstrukturen konstruiert werden, kann man sich hier.
Soweit OO in Mathematica betroffen ist, können Sie auch einen Blick auf einige relevanten Diskussionen der Vergangenheit, sowohl auf als SO und auf MathGroup. Ich bin mir bewusst,diese, wo ich steuerte eine Antwort und äußerte einige meiner Gedanken über die Sache. Sie können auch finden, diese sehr aktuellen ALSO Frage und den link an die vergangene Diskussion über Strukturen in Mathematica interessant.
this.fasten(tight)
Table
, die prozeduraleFor
im Unglück, die haben eine '+1 ... goto", das zeigt, gerade unter der Haube. Also, moderne software-engineering (glaube ich) sollte ...