2010-08-31 18 views
5

Meine erste "ernsthafte" Sprache war Java, also habe ich objektorientierte Programmierung in dem Sinne verstanden, dass Elementarbaustein des Programms eine Klasse ist. Jetzt schreibe ich auf VBA und Python. Es gibt Modulsprachen und ich fühle andauerndes Unbehagen: Ich weiß nicht, wie ich das Programm in einem Modul/Unterricht zerlegen soll.Modul vs objektorientierte Programmierung in VBA

Ich verstehe, dass ein Modul einer Wissensdomäne entspricht, ein Modul sollte ba in der Lage sein, separat zu testen ... Soll ich Modul nur als Namespace (C++) verstehen?

Antwort

3

Ich mache nicht VBA, aber in Python, Module sind von grundlegender Bedeutung. Wie du sagst, können die Namespaces als Namespaces angesehen werden, sie sind aber auch eigenständige Objekte. Sie sind jedoch keine Klassen, also können Sie nicht von ihnen erben (zumindest nicht direkt).

Ich finde, dass es eine gute Regel ist, ein Modul mit einem Domänenbereich zu halten. Die Regel, die ich verwende, um zu entscheiden, ob etwas eine Funktion auf Modulebene oder eine Klassenmethode ist, besteht darin, mich zu fragen, ob sie sinnvollerweise für Objekte verwendet werden kann, die die 'Schnittstelle' ihrer Argumente erfüllen. Wenn ja, dann entlasse ich es aus einer Klassenhierarchie und mache es zu einer Modulebene-Funktion. Wenn seine Nützlichkeit wirklich auf eine bestimmte Klassenhierarchie beschränkt ist, dann mache ich es zu einer Methode.

Wenn Sie es für alle Instanzen einer Klassenhierarchie arbeiten müssen und Sie es zu einer Funktion auf Modulebene machen, denken Sie daran, dass alle Unterklassen die angegebene Schnittstelle mit der gegebenen Semantik implementieren müssen. Dies ist einer der Nachteile, wenn man von den Methoden weggeht: Man kann nicht länger eine geringfügige Änderung vornehmen und super aufrufen. Auf der anderen Seite, wenn Subklassen wahrscheinlich die Schnittstelle und ihre Semantik neu definieren, dann ist diese bestimmte Klassenhierarchie vielleicht keine sehr gute Abstraktion und sollte neu überdacht werden.

+0

ja, es ist sehr cool in Python, dass ich weiß kann, wenn ein: Import a_handler anderes: Import b_handler aber in VB ich nicht tun kann es :(Sie Beispiel Modulebene Funktion Wissen, das nicht der Fall ist eine Singleton-Funktion (siehe andere Antworten)? – nikaan

+0

@Nikita Ich weiß nicht, was du mit Singleton-Funktion meinst.Ein Singleton ist eine (selten gute) Art, über ein Modul nachzudenken, aber ich denke, dass du versuchst, OO-Konzepte zu erzwingen – aaronasterling

1

Idiome von Sprachen sind unterschiedlich und das ist der Grund, ein Problem gelöst in verschiedenen Sprachen unterschiedliche Ansätze zu nehmen.

  1. "C" dreht sich alles um prozedurale Zersetzung.
  2. Haupt-Idiom in Java ist über "Klasse oder Objekt" Dekomposition. Funktionen sind nicht abwesend, aber sie werden Teil des gezeigten Verhaltens dieser Klassen.
  3. "Python" bietet Unterstützung für sowohl Klassenbasierte Problemzerlegung als auch prozedurbasiert.

Alle diese verwendet Dateien, Pakete oder Module als Konzept zum Organisieren großer Codestücke zusammen. Es gibt nichts, was Sie einschränkt, ein Modul für eine Wissensdomäne zu haben. Dies sind Zerlegungs- und Organisationstechniken und können basierend auf dem vorliegenden Problem angewendet werden.

Wenn Sie mit OO vertraut sind, sollten Sie es sehr gut in Python verwenden können.

+0

> Wenn Sie mit OO vertraut sind, sollten Sie es sehr gut in Python verwenden können. In Java eine Datei <-> eine öffentliche Klasse. Es scheint, dass die Anwendung dieser Regel in Python sehr hässlich ist. In Python eine Datei <-> eine kleine Aufgabe, denke ich. – nikaan

+0

@Nikita Nicht so. In Python (oft) eine Datei <-> Sammlung von vielen verwandten kleinen Aufgaben und vielleicht ein paar große. – aaronasterling

+2

Die Organisation von Code ist völlig abhängig von Coder. Die Regeln sind nicht in Stein gemeißelt. Wenn es kleine Klassen gibt, ist es üblich, sie in einer einzigen Datei zusammenzufassen, soll ich Modul sagen. Wenn Klassen groß sind, werden sie normalerweise in mehrere Dateien aufgeteilt. Python hat ein Paket, um diese Dateien zu gruppieren. Ich denke, die Flexibilität ermöglicht es Coders zu identifizieren, was für sie geeignet ist. – pyfunc

1

VBA ermöglicht auch die Verwendung von Klassen. Leider unterstützen diese Klassen nicht alle Merkmale einer voll-objektorientierten Sprache. Vor allem Vererbung wird nicht unterstützt.

Aber Sie können mit Schnittstellen arbeiten, zumindest bis zu einem gewissen Grad.

Ich habe nur Module wie "ein Modul = ein Singleton" verwendet. Meine Module enthalten "statische" oder sogar zustandslose Methoden. Meiner Meinung nach ist ein VBa-Modul kein Namensraum. Häufiger würde ein Bündel von Klassen und Modulen einen "Namespace" bilden. Ich erstelle oft ein neues Projekt (DLL, DVB oder etwas ähnliches) für einen solchen "Namespace".

+0

Ja, Singleton ist in diesem Zusammenhang das richtige Konzept! Also, etwas ist Modul-Level-Funktion, wenn es Singleton-Funktion ist. – nikaan

3

Es ist Geschmackssache. Wenn Sie Module verwenden, wird Ihr "Programm" mehr prozessorientiert sein. Wenn Sie Klassen wählen, wird es mehr oder weniger objektorientiert. Ich arbeite mit Excel für einige Monate und persönlich wähle ich Klassen wann immer ich kann, weil es für mich bequemer ist. Wenn Sie aufhören, über objects nachzudenken und sie als Components betrachten, können Sie sie mit Eleganz verwenden. Der Hauptgrund, warum ich Klassen bevorzuge, ist, dass man mehr davon haben kann. Sie können nicht zwei Instanzen des Moduls haben. Es ermöglicht mir die Kapselung und bessere Wiederverwendung von Code.

Nehmen wir zum Beispiel an, dass Sie eine Art Logger haben möchten, um Aktionen zu protokollieren, die von Ihrem Programm während der Ausführung ausgeführt wurden. Sie können ein Modul dafür schreiben. Es kann zum Beispiel eine globale Variable haben, die angibt, auf welcher Blattprotokollierung das Blatt erstellt wird. Aber bedenken Sie die folgende hypothetische Situation: Ihr Kunde möchte, dass Sie einige ausgefallene Funktionen zur Berichterstellung in Ihr Programm integrieren. Sie sind schlau, also finden Sie heraus, dass Sie Ihren Protokollierungscode verwenden können, um sie vorzubereiten. Sie können jedoch nicht gleichzeitig mit einem Modul protokollieren und Berichte erstellen. Und Sie können mit zwei Instanzen der Protokollierung Component ohne Änderungen in ihrem Code.

+0

Ja, ich habe verstanden.Ich habe entgegengesetzte Situation - es gibt große Add-in auf VBA, Excel, etwa 1000 Zeile bei jedem der 10 Module und es gibt überhaupt keine Klassen :) Aber die nächste Verbesserung fordert 5 Fälle von sehr ähnlichem Verhalten und ich möchte Klassen einführen. Es ist schwieriger als in Java :) VBA verbietet viele Dinge. Oh! Kennen Sie eine IDE für VBA? Oder Add-Ins mit Syntax-Highlighting, zum Beispiel? – nikaan

+1

Nun, IDE in Excel eingebettet ist nicht so schlimm, wie es auf den ersten Blick erscheint. Ich schreibe in der Ausgabe 2003 und es hat Syntax-Hervorhebung und einige uralte Vor-Intelligenz-System ;-) Debugger ist auch vernünftig. Wenn du bei etwas feststeckst, werde ich versuchen zu helfen. Während dieser Zeit habe ich etwas Erfahrung. – Bart

+0

danke! Ich habe versucht, 2003 und 2007 zu versuchen. Ich habe mich für Eclipse usw. gewöhnt - was ist mit Hervorhebung ähnlich Notizblock ++? (Wenn ich ein Wort auswähle, sind alle das gleiche Wort hervorgehoben ..) Oder Anrufhierarchie? Weil zum Beispiel nach "einige" suchen nicht nur "einige", sondern "einige", "gut aussehend" und so weiter. Aufrufhierarchie ist sehr hilfreich, wenn Sie globale Variablen verwenden :) mmm. Außerdem habe ich ein Problem mit dem Formatierungscode - kann ich ein großes Stück Code tabgen oder einrücken? Kann sein, was kann ich Ihnen helfen - Svn-Tool für VBA (http://www.codeproject.com/KB/office/SourceTools.aspx) – nikaan

Verwandte Themen