Hallo,
ich bin gerade dabei ein Wiedervorlage-System in Notes zu programmieren. Es soll unter anderem sehr flexible periodische Wiedervorlagen ermöglichen (täglich, wöchentlich, monatlich, alle x Wochen / Monate).
Bei klassischer prozeduraler Herangehensweise hätte ich da vermutlich auch wenig Fragen, ich möchte das ganze aber vor allem zu eigenen Lernzwecken mal objektorientiert aufziehen. Ich habe in Grundzügen zwar schon objektorientiert gearbeitet, aber z.B. noch nie mit einem richtigen Klassenmodell und vererbten Klassen.
Meine Grundidee ist nun, eine Klasse "Wiedervorlage" (WVL) zu erstellen
so dass ich über das Objekt w dann die Methoden und Eigenschaften auf-/abrufen kann. Eine klassische Eigenschaft wäre z.B. ob die WVL aktiv ist, eine klassische und wichtige Methode gerade für Wiederkehrende Termine wäre die Methode
Die Methode soll "datumswert" auf den nächsten wiederkehrenden Termin ab "datumswert" setzen.
Meine einfachen und meine wiederkehrenden Wiedervorlagen (täglich, wöchentlich, monatlich, freie liste) haben ja nun viele Eigenschaften und Methoden gemeinsam, nur bestimmte Punkte (z.B. die Berechung des nächsten wiederkehrenden Termines) weichen voneinander ab. Deswegen war meine Idee, eine Basisklasse "WVL" zu erstellen und für die speziellen wiederkehrenden WVL Klassen zu erstellen, die von WVL erben:
Class WVL (BASISKLASSE)
Eigenschaften:
Bearbeitugnsberechtigt
Art der WVL
Wiederholen alle
Beginn am
Ende Am
Bestätigung
Aktiv/Inaktiv
etc.
Methoden
SetzeAktiv
SetzeInaktiv
SetzeErledigt
naechster(Datum)
Class WVL_Einfach as WVL
Methoden
naechster(Datum)
Class WVL_Taeglich as WVL
Methoden
naechster(Datum)
Class WVL_Monatlich as WVL
Methoden
naechster(Datum)
Mein Problem betrifft nun die Deklaration der Objekte. Ich müsste nun ja einen Code einfügen
select case doc.Art(0)
case "e": dim t as new WVL_Einfach(doc)
case "t": dim t as new WVL_Taeglich(doc)
case "m": dim t as new WVL_Monatlich(doc)
end select
Aber ich möchte außerhalb des Objektes nicht auf irgendwelche Werte des übergebenen Notes-Dokumentes (doc.Art(0)) zugreifen. Eigentlich hätte ich gerne alles mit den Aufruf
dim obWvl as new wvl(doc)
erledigt. Abhängig von der Art der Wiedervorlage soll das Objekt obWvl dann z.B. unterschiedliche rechnende Methoden "naechster" haben. Aber wie kann ich so etwas innerhalb einer Klasse dynamisch machen?
Ich hoffe ihr könnt mir bei meinem Problem halbwegs folgen.
Danke & Grüße,
Gregor
Es kann sein, dass ich hier etwas föllig valsch verstehe... und es wär nicht das erste Mal, aber:
Mein Problem betrifft nun die Deklaration der Objekte. Ich müsste nun ja einen Code einfügen
select case doc.Art(0)
case "e": dim t as new WVL_Einfach(doc)
case "t": dim t as new WVL_Taeglich(doc)
case "m": dim t as new WVL_Monatlich(doc)
end select
Ich würd sagen, das Problem betrifft eher die Initialisierung des richtigen Objekts in Abhängigkeit von den 3 cases in den Code nicht die Deklaration, oder?
In LotusScript fehlen static Methoden, die es etwa in Java oder C# gibt.
Da könnte man in der abstrakten Oberklasse WVL - kein guter Name, nenn die besser Wiedervorlage - sowas schreiben wie
public static Wiedervorlage getInstance(char kuerzel, Document doc) {
switch (kuerzel) {
case 'e' : return new Wiedervorlage_Einfach(doc);
case 't' : return new Wiedervorlage_Taeglich(doc);
case 'm' : return new Wiedervorlage_Monatlich(doc);
default : throw new UnsuportedOperationException("Dieser Parameter ist hier nicht vorgesehen.");
}
}
Weiss nicht mal, ob das so kompiliert. ;D
Aber so die Art.
Man könnte vermutlich mühsam in LotusScript statische Methoden nachprogrammieren. Machs besser nicht. Hier übrigens ein Versuch für statische Variablen.
http://opendom.blogspot.de/2007/03/static-properties-methods-in.html
Viel bringt das übrigens auch nicht. Die Vorteile von OO gegenüber guter strukturierter Programmierung sind für so Einzelfälle am Ende auch nicht so gewaltig. Die Summe machts halt. Und es ist auch sehr einfach über OO auf falsche Fährten gelockt zu werden.
Peter Klett verzichtet auf Vererbung. Gefällt mir gut. So wird die Frage welche Methode denn nun aufgerufen wird in der Klasse gekapselt und darum gehts letztlich. Den Code ausserhalb der Klasse von der in der Klasse abgefrühstückten Business-Logik freizuhalten. Du MUSST ja nicht jedes Feature von OO einsetzen sondern Du schreibst eine Anwendung!
Ulrichs Vorschlag ist eine Variante, die je nach Anwendungsfall besser, genausogut oder schlechter ist. Da ist der Entscheiungsparameter, welche Logik nun aufgerufen ein Property der Klasse und kein an die Methode naechste übergebener Parameter. Wenn es mehrere Methoden mit Fallunterscheidungen nach Einfach, Woechentlich, Monatlich gibt, ist das vielleicht die bessere Lösung. Kommt aber auf den Kontext drauf an.
Eine unterhaltsame und aus meiner Sicht auch realistische Art sich über OO zu informieren sind aus meiner Sicht die Filme von Robert Martin:
http://www.cleancoders.com/