Praxis Klassenmodule

19/02/2008 - 10:13 von Josef Morlo | Report spam
Praxis Klassenmodule

Hallo zusammen,

da ich mir bei Klassenmodulen immer wieder unsicher bin, möchte ich gerne
wissen, wie Ihr in der Praxis verfàhrt.

Problem: Ich habe ein Property-Paar mit Longwerten

Was tue ich am besten, wenn beim Schreiben Nullwerte nicht auszuschließen
sind?

1. Ich prüfe bei Übergabe vorm Schreiben des Wertes

Nachteil: Ich muss bei spàteren Verwendungen des Klassenmoduls immer wieder
prüfen (Also nicht nach dem Motto: ‚Das Klassenmodul wird’s schon richten’)


2. Ich wandele mein Long-Property-Paar in ein Variant-Paar um, mache die
Prüfung im Klassenmodul selbst. Ich schließe den Nullwert aus, wandele ihn
in 0 um oder löse einen Fehler aus, je nach Verwendungszweck.

Nachteil: ich arbeite im weiteren Code des Klassenmoduls mit ‚VarMeinWert’
nicht typgerecht


3. Ich schreibe eine Var-Property (nur) mit Schreibzugriff, etwa
Property Let MeinWert (var as Variant)
mvarMeinWert = var
und eine Long-Property (nur) mit Lesezugriff, etwa
Property Get MeinNeuerWert() as Long
If Not IsNull(mvarMeinWert) then mlngMeinNeuerWert _
=CLng(mvarMeinWert)

Nachteil / Vorteil: Die Symmetrie geht verloren, der Code wird schwerer
lesbar, ich arbeite aber typgerecht

Das Problem ist ja nicht nur akademisch. Gibt’s da Pràferenzen für die eine
oder andere Variante, Faustregeln, Empfehlungen? Oder gibt’s noch andere
Lösungsmöglichkeiten? Wie haltet Ihrs damit im Praktischen? Danke für
Beitràge!

Liebe Grüße

Jo
 

Lesen sie die antworten

#1 Peter Götz
19/02/2008 - 11:20 | Warnen spam
Hallo Josef,

Problem: Ich habe ein Property-Paar mit Longwerten

Was tue ich am besten, wenn beim Schreiben
Nullwerte nicht auszuschließen sind?



Option Explicit
Private mValue As Long

Public Property Get Value() As Long
Value = mValue
End Property

Public Property Let Value(ValueNew As Long)
mValue = ValueNew
End Property

Public Sub SetValue(Value As Variant)
Select Case VarType(Value)
Case vbByte, vbInteger, vbLong
mValue = Value

Case vbEmpty, vbNull
mValue = 0

Case Else
Err.Raise 13
End Select
End Sub

Bei diesem Klassenmodul kannst Du Value auf
zwei verschiedene Arten setzen.

Einmal typsicher über die Property Let-Prozedur.
Die Fehlerbehandlung würde in diesem Fall im
Code, welcher Property Let aufruft erfolgen.

Oder via Sub SetValue.
Nullwerte werden in den Wert 0 umgewandelt,
Werte vom Typ Byte, Integer und Long werden
übernommen und Werte mit anderen Datentypen
lösen einen Fehler auf, den der aufrufende Code
behandeln kann/muss.



1. Ich prüfe bei Übergabe vorm Schreiben des
Wertes
Nachteil: Ich muss bei spàteren Verwendungen
des Klassenmoduls immer wieder prüfen (Also
nicht nach dem Motto: ,Das Klassenmodul wird's
schon richten')



Auch wenn es das Klassenmodul richten würde,
müsste es vermutlich auch einen Fehler auslösen,
wenn z.B. der übergebene Wert ein völlig unpassender
Datentyp wàre. (s.Beispiel unten).

2. Ich wandele mein Long-Property-Paar in ein
Variant-Paar um,



Das würde ich nicht tun, sondern lieber das
Propertypaar typgerecht (Long) belassen und
der Klasse zusàtzlich eine
Sub SetValue(Wert as Variant)
spendieren, an die auch leere Variants übergeben
werden können, welche dann z.B. zum Longwert 0
umgewandelt werden.

Du hast damit im aufrufenden Code die Wahl,
typgerecht mit Property Let oder mit unbestimmten
Datentyp via Sub SetValue() zu arbeiten.

Option Explicit
Private mValue As Long

Public Property Get Value() As Long
Value = mValue
End Property

Public Property Let Value(ValueNew As Long)
mValue = ValueNew
End Property

Public Sub SetValue(Value As Variant)
Select Case VarType(Value)
Case vbByte, vbInteger, vbLong
mValue = Value

Case vbEmpty, vbNull
mValue = 0

Case Else
Err.Raise 13
End Select
End Sub

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen