Posts Tagged: ‘OOP’

EntwicklerCamp 2015: Wenn ich das früher gewusst hätte, hätte ich schon lange objekt-orientiert programmiert

4. März 2015 Posted by Thomas Bahn

EntwicklerCamp
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:



OOP in LS: Konstruktoren überladen a la LotusScript

5. Januar 2012 Posted by Thomas Bahn

A picture named M2
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.