Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1696to1700
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

OOP: saubere Kapselung?

OOP: saubere Kapselung?
25.06.2019 23:21:52
Daniel
Liebe Forums-TN
vielleicht wieder mal eine schräge Frage;-). Es geht um was Grundsätzliches betr. OOP. VBA programmiere ich seit langem, aber nie mit eigenen Klassen, d.h. immer nur prozedural (natürlich abgesehen von Userforms und Excel-Objekten, das ist mir schon klar). Ich bin gerade dran, vermehrt eigene Klassen zu definieren und habe mit der Abgrenzung noch Probleme, was ich in der Klasse, und was in einem normalen Modul löse.
Aufgabenstellung:
Eine Prozedur in einem Modul instanziiert ein Objekt, welches diverse Parameter (Eigenschaften) für den weiteren Verlauf der Prozedur enthält (als Alternative zu mehreren (teils globalen) Variablen). Die Methode "InitParameters" holt ein paar Werte aus der Registry und speichert sie in Eigenschaften des Objektes. Eine Eigenschaft heisst beispielsweise ExportPath.
Hier das normale Modul mit der Prozedur "ExportDaten":
Option Explicit
Public objParameter As New clsParameter
Sub ExportDaten()
If objParameter.InitParameters = True Then 'InitParameters holt 5 Werte aus der Registry
pExport
Else
MsgBox "Bitte zuerst den Exportpfad festlegen"
End If
End Sub
Die Klasse clsParameters mit der InitParameters-Methode sieht etwa so aus (mit nur einem Parameter, der aus der Registry geholt wird):
Private strExportPath As String
Property Let ExportPath(ep As String)
strExportPath = ep
End Property
Property Get ExportPath() As String
ExportPath = strExportPath
End Property
Public Function InitParameters() As Boolean
Dim result As Boolean
result = True
strExportPath = fGetProperty("PfadExcelExport", "XXX")*
If strExportPath = "XXX" Then result = False
InitParameters = result
End Function

*GetProperty holt einfach aus der Registry einen Pfad. Falls dieser fehlt, wird ein "XXX" zurückgegeben (mir ist bewusst, dass ich hier statt einer Funktion auch eine Klasse erstellen könnte. Das kommt vielleicht mal, aber mal schön der Reihe nach;-)).
Hier nun meine konkreten Fragen:
1.) Macht eine InitParameters-Methode überhaupt Sinn, oder gehört das Initialisieren von Variablen eines Objektes in den Konstruktor, sprich
Private Sub Class_Initialize()
?
2.) Oder als Alternative, statt einer Methode InitParameters zum Initialisieren ALLER Variablen könnten die Werte ja innerhalb der einzelnen Property Get Funktionen aus der Registry geholt werden. Also:
Property Get ExportPath() As String
strExportPath = GetProperty("ExportPath","XXX")
ExportPath = strExportPath
End Property
So könnte ich in der Prozedur direkt auf die entsprechende Eigenschaft zugreifen im IF:
Sub ExportDaten()
If objParameter.ExportPath  "XXX" Then
pExport
Else
MsgBox "Bitte zuerst die Optionen festlegen"
End If
End Sub

Was macht da eher Sinn? InitParameters-Methode oder einzelne Eigenschaften abfragen? Oder ist das schlicht Geschmacksache?
3.) Ist es sinnvoll, in der eigentlichen Prozedur (ExportDaten) zu prüfen, ob die Parameter initialisiert werden konnten, und dann eine MsgBox auszugeben, falls es nicht geklappt hat? Oder wäre es OOP-mässig besser, die MsgBox aus der Klasse resp. dem Objekt heraus auszurufen?
Mit OOP geht es ja eigentlich darum, wiederverwendbaren Code zu haben, also Klassen, welche in sich funktionsfähig und rasch in neuen Projekten verwendbar sind. Wenn ich aber in der normalen Prozedur mit einem IF abfragen muss, ob die Variablen im Objekt initialisiert werden konnten, ist das nicht mehr ganz so wiederverwendbar, resp. die Kapselung wohl nicht optimal.
Ich könnte ja innerhalb der Methode InitParameters eine MsgBox bringen, falls die Variablen nicht sauber initialisiert werden konnten. Dies hat der Vorteil, dass die Kapselung wohl "besser" ist. Aber ich muss in der Hauptprozedur ja trotzdem irgendwie entscheiden, ob die Initialisierung geklappt hat oder nicht. D.h. ein IF brauche ich sowieso.
Vermutlich läuft meine Frage einfach daraus hinaus: MsgBox in der Klasse oder im Modul?
Meine Konfusion betr. WO wird was überprüft, lässt sich weiterspinnen:
Der Check, ob ein aus der Registry geholter Dateipfad überhaupt existiert: wird das in der Klasse oder im Modul gelöst? Bis jetzt habe ich dafür einfach eine Funktion FILEEXIST oder sowas ähnliches verwendet. Aber das hat wiederum nix mit OOP zu tun.
Sorry, wenn ich mich unklar ausgedrückt habe. Ich hoffe, jemand versteht, wo mein Abgrenzungsproblem resp. Kapselungsproblem liegt.
Beste Grüsse und vielen Dank
Daniel

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: OOP: saubere Kapselung?
26.06.2019 09:20:56
Nepumuk
Hallo Daniel,
1. Das initialisieren der Parameter gehört in das Class_Initialize-Event.
2. Wenn das initialisieren erfolgreich war, dann würde ich eine boolsche Eigenschaft in der Klasse auf True setzen und diese in den einzelnen Prozeduren abfragen.
3. Ich würde es in der Prozedur "ExportDaten" prüfen, denn darin findet ja die Verarbeitung statt.
Gruß
Nepumuk
AW: OOP: saubere Kapselung?
27.06.2019 08:10:59
Daniel
Hallo Nepumuk
vielen Dank für deine Rückmeldung!
Uff, der OO-Ansatz ist für mich schon noch ein wenig umständlich. Falle immer wieder in das Definieren von Funktionen zurück. Aber es kommt gut:-).
Danke dir.
Gruss, Daniel
Anzeige
dann wohl nicht mehr offen. o.w.T.
27.06.2019 12:10:37
Werner

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige