Domino 9 und frühere Versionen > Entwicklung
Wie kann ich eine Klasse sinnvoll aufbauen ?
animate:
das könnte jetzt etwas wirr werden, aber wenn wir damit jetzt schon anfangen, dann machen wir das gleich gescheit.
Ich hab mal das Klassendiagramm mit UML gemalt. Das ist einfach der Standard, um sowas zu modellieren. Das Diagramm hängt als Attachment hier dran.
Die Kästen sind Klassen (im Moment noch ohne Methoden/Attribute).
Ganz oben in jedem Kasten steht der Klassenname, gefolgt von den Attributen und den Methoden.
Kursiv geschrieben Klassennamen bedeuten, die Klasse ist abstrakt (von ihr wird keine Instanz erzeugt).
Die Linien mit den großen Pfeilen am Ende heißen Genrealisierung ('ist ein')
Die Linien ohne Pfeile sind ungerichtete Assoziationen ('gehört zu', 'hat')
Die Zahlen, die bei diesen Assoziationen stehen sind die Kardinalitäten (bestimmt bekannt aus ERD. 'Zu einem History-Objekt gehören n HistoryEntry-Objekte)
TMC:
--- Zitat von: koehlerbv am 20.06.04 - 17:08:10 ---Was Deine Klassen-Methoden angeht: Du kannst entweder die sowieso erforderliche Methode New dafür hernehmen, um
- alle globalen Variablen (als members Deiner Klasse) mit dem Ausgangsstatus zu versehen (in PostOpen) oder
- dieser erstmal nur "leer" zu instantiieren. Dann müsstest Du in PostOpen gleich nachschieben, die Methode "GetOriginalValues" zu verwenden (die das tun sollte, was ihr Name verspricht)
--- Ende Zitat ---
--- Zitat von: Thomas Völk am 20.06.04 - 17:31:10 ---Du kannst die Behandlung von Events, die von der Maske ausgelöst werden, an die Klasse delegieren (das steht auch in dem Artikel, den Bernhard anführt).
Stichwort 'On Event x From y Call z'
--- Ende Zitat ---
Was mir noch überhaupt nicht klar ist:
Ich habe bisher u.a. folgenden Code in der Maske (Auszüge):
Global Declarations
--- Code: ---Dim vGlobalHistoryFields As Variant
Dim vGlobalHistoryFieldTitles As Variant
Dim vGlobalHistorySource As Variant
--- Ende Code ---
PostOpen
--- Code: --- vGlobalHistoryFields = fExplode(CHISTORYFIELDS, "##")
vGlobalHistoryFieldTitles = fExplode(CHISTORYFIELDTITLES, "##")
If Not Source.IsNewDoc Then
'Write field values in global variable
vGlobalHistorySource = fHistoryStoreItemValuesInArray(doc, vGlobalHistoryFields)
End If
--- Ende Code ---
Was passiert da:
Es werden die zu überwachenden Feldnamen und die Item-Inhalte als Array in die globalen Variablen der Maske gesetzt.
Warum mach ich das:
Im Postsave hole ich mir die globalen Variable-Inhalte und mach was damit (vergleichen, etc.).
Jetzt die Frage:
Was kann ich davon in eine Klasse 'outsourcen' ? Kann ich die in der Maske ge-dim-ten Variablen in einer Klasse setzen (ich will ja im PostSave wieder auf die im Postopen gesetzten Variablen wieder zurückgreifen können)? Oder muss ich das im Masken-Event erledigen?
(Ich hoffe dass ich die Frage einigermaßen klar rüberbringe....)
animate:
--- Zitat von: TMC am 20.06.04 - 17:56:59 ---Was mir da noch nicht klar ist:
Ich (bzw. der Postopen- oder Postsave - Event) kommuniziere nur mit der Klasse "History" ? Die in den anderen Klassen benötigten Dinge gebe ich intern dann entsprechend weiter?
--- Ende Zitat ---
Ja, genau, du erzeugst ein History-Objekt im Postopen-Event, und das wars dann schon an Code, den du in der Maske benötigst.
Wenn du das wirklich zur Übung machen willst, um OOx zu lernen dann würde ich mal darüber nachdenken, ob wir evtl. nicht eine Klasse Dokument brauchen (ich hab das schon in meinem Diagramm angedeutet)
Das wäre in meinen Augen korrekt.
animate:
--- Zitat von: TMC am 20.06.04 - 18:22:31 ---
Ich habe bisher u.a. folgenden Code in der Maske (Auszüge):
Global Declarations
--- Code: ---Dim vGlobalHistoryFields As Variant
Dim vGlobalHistoryFieldTitles As Variant
Dim vGlobalHistorySource As Variant
--- Ende Code ---
PostOpen
--- Code: --- vGlobalHistoryFields = fExplode(CHISTORYFIELDS, "##")
vGlobalHistoryFieldTitles = fExplode(CHISTORYFIELDTITLES, "##")
If Not Source.IsNewDoc Then
'Write field values in global variable
vGlobalHistorySource = fHistoryStoreItemValuesInArray(doc, vGlobalHistoryFields)
End If
--- Ende Code ---
--- Ende Zitat ---
aha, so machst du das. vGlobalHistoryFields sind die Felder, die beobachtet werden sollen, stimmts?
Mein erster Gedanke ist, dass wir hier wieder einen Kandidaten für eine Klasse haben. Ich muss mal kurz nachdenken.
Aber egal, was dabei rauskommt, du solltest das alles aus der Maske rausbringen. Ok, die Information, welche Felder beobachtet werden sollen, kann man evtl. in der Maske lassen, aber keine Logik
TMC:
--- Zitat von: Thomas Völk am 20.06.04 - 18:08:26 ---das könnte jetzt etwas wirr werden, aber wenn wir damit jetzt schon anfangen, dann machen wir das gleich gescheit.
Ich hab mal das Klassendiagramm mit UML gemalt. Das ist einfach der Standard, um sowas zu modellieren. Das Diagramm hängt als Attachment hier dran.
Die Kästen sind Klassen (im Moment noch ohne Methoden/Attribute).
Ganz oben in jedem Kasten steht der Klassenname, gefolgt von den Attributen und den Methoden.
Kursiv geschrieben Klassennamen bedeuten, die Klasse ist abstrakt (von ihr wird keine Instanz erzeugt).
Die Linien mit den großen Pfeilen am Ende heißen Genrealisierung ('ist ein')
Die Linien ohne Pfeile sind ungerichtete Assoziationen ('gehört zu', 'hat')
Die Zahlen, die bei diesen Assoziationen stehen sind die Kardinalitäten (bestimmt bekannt aus ERD. 'Zu einem History-Objekt gehören n HistoryEntry-Objekte)
--- Ende Zitat ---
Danke für die Tipps und die Zeichnung.
Wo "malt" man sowas am besten? Ich habe hier MS Visio 2002. Na ja, ist damit sicherlich machbar. Werde mir mal ein paar Visio-Shapes dafür zusammenzimmern (wenn diese nicht eh schon dabei sind).
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln