Domino 9 und frühere Versionen > Entwicklung
Wie kann ich eine Klasse sinnvoll aufbauen ?
animate:
ich versuche mal zu beschreiben, was ich jetzt verstanden habe kombiniert mit dem, was ich mir dachte.
du sagst, du erstellst verschiedene Feld-Objekte. Das ist gut so.
Wo erstellst du die denn?
Ich dachte, dass das History-Objekt, diese Feld-Objekte erstellt.
Das History-Objekt holt sich (woher ist egal) eine Liste aller zu überwachender Felder.
Es erzeugt dann auf Basis dieser Liste alle nötigen Feld-Objekte und hält diese Objkete in einem Array (sozusagen als Membervariable)
Beim Erzeugen muss das History-Objekt ermitteln, welches spezielle Feld-Objekt erzuegt werden muss.
Dem Konstruktor des Feld-Objekts wird das entsprechende NotesItem-Objekt als Parameter mitgegeben, das Feld-Objekt hält dieses NotesItem-Objekt als Membervariable.
Das Feld-Objekt holt sich dann seinen Initialwert aus diesem Feld. (Private Methode, die vom Konstruktor aufgerufen wird.
Wenn jetzt ein neuer History-Eintrag gemacht werden muss, dann tritt ja wieder unser History-Objekt in Aktion, es muss ja das HistoryEntry-Objekt erstellen.
Dem HistoryEntry-Objekt muss es allerdings den Text mitgeben, der im Eintrag stehen soll.
Deshalb fragt das History-Objekt nun alle seine Feld-Objekte:
"Gib mir doch bitte mal das Delta zwischen deinem Initialwert und dem, der jetzt in deinem NotesItem drin steht."
(Jetzt kommt das mit der Reihenfolge. Das verstehe ich nicht. Die ist ja immer die gleiche. Dieses Fragen ist eine Schleife über den Array mit den Feld-Objekten, und die verändern nicht die ihre Position innerhalb des Arrays)
So, die History bekommt von jedem Feld eine Antwort und erstellt daraus etwas Geeignetes, um es dem HistoryEntry zu übergeben, der das Ganze dann ins Dokument schreiben soll.
So, das wars.
Du hast recht, dass das ein paar mehr Zeilen Code sind.
Dafür gewinnst du ein sehr großes Maß an Flexibilität.
Du kannst, wenn die History mal etwas anders aussieht, als jetzt (1 Textfeld) immer noch deine Feldklassen einsetzen - unverändert.
Was du ändern musst ist, was die History mit dem Delta eines Felds macht bevor es an den HistoryEntry gegeben wird.
Ich versuche mal, am WE (muss schaun, ob ich Zeit hab) sowas in die letzte hier angehängte Version der DB einzubauen.
animate:
--- Zitat von: TMC am 07.07.04 - 23:22:28 ---- Man hat ein Dokument und öffnet dieses
- dabei schreibt man pro zu überwachendes Feld was in ein FieldObjekt (Name, Inhalt, etc.)
- Beim Speichern schreibt man zusätzlich die neuen Werte in die FieldObjekte und lässt sich die Unterschiede geben.
--- Ende Zitat ---
aha. von alleine draufgekommen. sehr schön.
TMC:
Vielen Dank, Thomas, für Deine Erklärung.
Habe es soweit glaub ich verstanden (incl. Reihenfolge, die ja easy über das Array der Field-Objekte gelöst wird).
Ich werde mal versuchen, das soweit selber hinzubekommen.
Dabei werde ich aber ein Ctrl+N im Client machen - also wohl nochmal neu anfangen mit den Klassen (da fällt mir das glaub ich leichter).
TMC:
Ich hab jetzt mal die Klasse "HistoryField" neu erstellt. Ich glaube hier brauchts gar keine Auftrennung Abstrakte Klasse / Unterklassen. Aber bestimmt noch an anderer Stelle der History-Klassen.
--- Code: ---Public Class HistoryField
Private m_itmField As NotesItem
Private m_strFieldTitle As String
Private m_vInitialValue As Variant
Private m_vNewValue As Variant
'-------------------------------------------------------------------------------------------------
Public Sub new(itmField As NotesItem, strItemTitle As String)
Dim iItemType As Integer
'Das Item und den Item-Titel in die Membervariable
Set m_itmField = itmField
m_strFieldTitle = strItemTitle
'----> Den Iteminhalt auslesen
m_vInitialValue = GetFieldValue()
'<----
End Sub
'-------------------------------------------------------------------------------------------------
Public Sub setInitialValue()
'Setzt den aktuellen Feldinhalt als InitialValue. Vielleicht brauchen wir
'das irgendwann einmal :-)
m_vInitialValue = GetFieldValue()
End Sub
'-------------------------------------------------------------------------------------------------
'########################################################
'Get/Set-Methoden
'-------------------------------------------------------------------------------------------------
Public Property Get difference As String
Dim strDiff As String
Dim iItemType As Integer
'Der neue Iteminhalt
m_vNewValue = GetFieldValue()
'---> Item-Typ
On Error 91 Goto OBJECTNOTSET 'If it is a new doc and field is RTF
iItemType = m_itmField.Type
On Error Goto 0 'Fehlerbehandlungsroutine wieder zurücksetzen
'<---
Select Case iItemType
Case RICHTEXT:
If m_vInitialValue = m_vNewValue Then
'Keine Feldänderung
strDiff = ""
Else
'Feldinhalt hat sich geändert
strDiff = "Changed Richtext-Field '" & m_strFieldTitle & "'"
End If
Case Else:
m_vNewValue = m_itmField.Values
If m_vInitialValue = m_vNewValue Then
'Keine Feldänderung
strDiff = ""
Else
'Feldinhalt hat sich geändert
strDiff = AuxImplode(m_vInitialValue, " / ") 'erstmal alles in ein String
strDiff = AuxRemoveLinebrakes(strDiff, " ")
strDiff = "Changed Field '" & m_strFieldTitle & "' (former value: '" & strDiff & "')"
End If
End Select 'Case iItemType
difference = strDiff
EXITSCRIPT:
Exit Property
OBJECTNOTSET:
iItemType = RICHTEXT
Resume Next
End Property
'########################################################
'-------------------------------------------------------------------------------------------------
Private Function GetFieldValue() As Variant
'Den Item-Inhalt bzw. bei RTF Datum letzter Änderung auslesen .........
Dim iItemType As Integer
'-> Item-Typ
On Error 91 Goto OBJECTNOTSET 'If it is a new doc and field is RTF
iItemType = m_itmField.Type
On Error Goto 0 'Fehlerbehandlungsroutine wieder zurücksetzen
'<-
Select Case iItemType
Case RICHTEXT:
GetFieldValue = m_itmField.LastModified
Case Else:
GetFieldValue = m_itmField.Values
End Select
'<----
EXITSCRIPT:
Exit Function
OBJECTNOTSET:
GetFieldValue = "NEWRTF"
Resume EXITSCRIPT
End Function
'-------------------------------------------------------------------------------------------------
End Class
--- Ende Code ---
Mit dem Rest mache ich noch gelegentlich weiter...
*Edit*
Hier hab ich noch die Klasse beschrieben:
animate:
--- Zitat von: TMC am 10.07.04 - 16:13:47 ---Ich glaube hier brauchts gar keine Auftrennung Abstrakte Klasse / Unterklassen.
--- Ende Zitat ---
nun ja, du hast diese Aufteilung in der Klasse gemacht. In mehreren Methoden sogar.
Lass da mal, rein theoretisch, noch ein paar Fälle dazu kommen. Dann wirds unangenehm.
Also: eine weitere Feldart kommt dazu. Du musst Änderungen an deiner Klasse machen und diese Klasse für alle Feldarten nochmal testen (kann ja sein, dass da was schiefgelaufen ist).
Wenn du die Unterscheidung durch verschiedene Subklassen machst, dann siehts so aus:
Neue Klasse, Funktionalität implementieren (musst du ja bei der ARt, die du gewählt hast, auch), diese (und nur diese) Klasse testen. Die bereits funktionierenden Klassen werden nicht angerührt.
Das ist nur ein Vorteil.
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln