Domino 9 und frühere Versionen > Entwicklung

Wie kann ich eine Klasse sinnvoll aufbauen ?

<< < (35/41) > >>

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