Objekt-orientierte Programmierung ist - immer noch - ein wichtiges Thema
für mich. Umso mehr freue ich mich über das positive Feedback nach diesem
Vortrag.
Und wie gesagt: Fang klein an, vielleicht
mit einer Hilfsklasse für E-Mails oder für RichText, um Erfahrungen zu
sammeln. Beim nächsten komplexeren Prozess (z. B. Agent), vielleicht beim
Import oder Export, verwende diesmal OOP. Und dann mach eine Basis-Klasse
für dich mit deinen für dich wichtigen Methoden, die du sowieso immer schon
benutzt hast, und stelle mal eine Maske um...
Die Präsentation und die Demo-Datenbank
zu meinem Vortrag in Track 3, Session 3: Wenn ich das früher gewusst
hätte, hätte ich schon lange objekt-orientiert programmiert:
Posts Tagged: ‘OOP’
OOP in LS: Konstruktoren überladen a la LotusScript
Wir sind seit vielen Jahren aktive Verfechter für und Nutzer von objekt-orientierter
Programmierung (OOP) mit LotusScript. Leider hat die Sprache an sich einige
Defizite gegenüber moderneren Vertretern ihrer Art, wie zum Beispiel das
Fehlen von Mehrfachvererbung oder zumindest Interfaces. Ein weiterer Punkt
ist, dass man Methoden nicht überladen kann, also nicht mehrere Methoden
erstellen kann, die den gleichen Namen haben und sich nur in der Anzahl
und Art ihrer Parameter unterscheiden (Parametersignatur). Bei normalen
Methoden kann man natürlich noch darauf ausweichen, dass man einfach unterschiedliche
Namen vergibt, aber der Konstruktor muss immer Public
Sub
New
heißen.
Eine Möglichkeit, den Konstruktor flexibler zu gestalten, ist es, ihm eine Liste zu übergeben, die den oder die Parameter enthält.
Aber gerade, wenn es um genau einen Parameter geht, ist der Weg mit der Liste mit viel Overhead verbunden. Eine einfache, elegante Möglichkeit ist es dann, ein Variant und eine "Objektweiche" zu benutzen.
Als Beispiel dient der Konstruktur einer Klasse OpenGeoDBRecord. Die Objekte dieser Klasse sollen entweder mit einer Liste, einem Array, einem NotesDocument- oder einem NotesViewEntry-Objekt initialisiert werden können (oder "nackt" mit Vorgabewerten):
Private Class OpenGeoDBRecord
Public Sub New(source As Variant)
Dim openGeoDoc As NotesDocument
Dim openGeoEntry As NotesViewEntry
If TypeName(source) = "VARIANT LIST" Then
Call ReadFromList(source)
ElseIf TypeName(source) = "STRING( )" Then
Call ReadFromArray(source)
ElseIf source Is Nothing Then
' initialize with default values...
ElseIf source IsA "NotesDocument" Then
Set openGeoDoc = source
Call ReadFromDoc(openGeoDoc)
ElseIf source IsA "NotesViewEntry" Then
Set openGeoEntry = source
Call ReadFromViewEntry(openGeoEntry)
End If
End Sub ' OpenGeoDBRecord.New
Public Sub ReadFromList(paramList As Variant)
'/**
' * reads data from a list with the parameter names as keys.
' *
' * @param paramList Variant list of parameters with parameter names as keys.
' */
End Sub ' OpenGeoDBRecord.ReadFromList
Public Sub ReadFromArray(paramArray As Variant)
'/**
' * reads data from an array
' *
' * @param paramArray String array of parameters.
' */
End Sub ' OpenGeoDBRecord.ReadFromArray
Public Sub ReadFromDoc(openGeoDoc As NotesDocument)
'/**
' * reads data from a document
' *
' * @param openGeoDoc NotesDocument object to read from.
' */
End Sub ' OpenGeoDBRecord.ReadFromDoc
Public Sub ReadFromViewEntry(openGeoEntry As NotesViewEntry)
'/**
' * reads data from a view entry (more efficient than from a NotesDocument)
' *
' * @param openGeoDoc NotesViewEntry object to read from.
' */
End Sub ' OpenGeoDBRecord.ReadFromViewEntry
End Class ' OpenGeoDBRecord
Man beachte auch den "Cast" über die getypten Variablen.
Statt des IsA-Operators kann man natürlich auch TypeName(source) = "NOTESDOCUMENT" bzw. = "NOTESVIEWENTRY" verwenden.
Eine Möglichkeit, den Konstruktor flexibler zu gestalten, ist es, ihm eine Liste zu übergeben, die den oder die Parameter enthält.
Aber gerade, wenn es um genau einen Parameter geht, ist der Weg mit der Liste mit viel Overhead verbunden. Eine einfache, elegante Möglichkeit ist es dann, ein Variant und eine "Objektweiche" zu benutzen.
Als Beispiel dient der Konstruktur einer Klasse OpenGeoDBRecord. Die Objekte dieser Klasse sollen entweder mit einer Liste, einem Array, einem NotesDocument- oder einem NotesViewEntry-Objekt initialisiert werden können (oder "nackt" mit Vorgabewerten):
Private Class OpenGeoDBRecord
Public Sub New(source As Variant)
Dim openGeoDoc As NotesDocument
Dim openGeoEntry As NotesViewEntry
If TypeName(source) = "VARIANT LIST" Then
Call ReadFromList(source)
ElseIf TypeName(source) = "STRING( )" Then
Call ReadFromArray(source)
ElseIf source Is Nothing Then
' initialize with default values...
ElseIf source IsA "NotesDocument" Then
Set openGeoDoc = source
Call ReadFromDoc(openGeoDoc)
ElseIf source IsA "NotesViewEntry" Then
Set openGeoEntry = source
Call ReadFromViewEntry(openGeoEntry)
End If
End Sub ' OpenGeoDBRecord.New
Public Sub ReadFromList(paramList As Variant)
'/**
' * reads data from a list with the parameter names as keys.
' *
' * @param paramList Variant list of parameters with parameter names as keys.
' */
End Sub ' OpenGeoDBRecord.ReadFromList
Public Sub ReadFromArray(paramArray As Variant)
'/**
' * reads data from an array
' *
' * @param paramArray String array of parameters.
' */
End Sub ' OpenGeoDBRecord.ReadFromArray
Public Sub ReadFromDoc(openGeoDoc As NotesDocument)
'/**
' * reads data from a document
' *
' * @param openGeoDoc NotesDocument object to read from.
' */
End Sub ' OpenGeoDBRecord.ReadFromDoc
Public Sub ReadFromViewEntry(openGeoEntry As NotesViewEntry)
'/**
' * reads data from a view entry (more efficient than from a NotesDocument)
' *
' * @param openGeoDoc NotesViewEntry object to read from.
' */
End Sub ' OpenGeoDBRecord.ReadFromViewEntry
End Class ' OpenGeoDBRecord
Man beachte auch den "Cast" über die getypten Variablen.
Statt des IsA-Operators kann man natürlich auch TypeName(source) = "NOTESDOCUMENT" bzw. = "NOTESVIEWENTRY" verwenden.