Domino 9 und frühere Versionen > Entwicklung

Wie kann ich eine Klasse sinnvoll aufbauen ?

<< < (25/41) > >>

animate:
Axel, ich glaube, wir meinen mit der Größe etwas anderes.

Entscheidend ist, dass nur eine begrenzte Menge Text in ein Textfeld geschrieben werden kann.

Jeder History-Eintrag (repräsentiert durch ein HistoryEntry-Objekt) besitzt eine gewisse Textgröße, die man leicht durch die Anzahl der Zeichen ausrechnen kann.
Die Summe der Größen aller Einträge darf einen gegebenen Maximalwert nicht überschreiten, deshalb muss ich das vor dem Schreiben ins Dokument überprüfen.

Und dazu würde ich der Klasse HistoryEntry ein Attribut "Größe" oder "Size", etc. verpassen, das ich abfragen kann.
Wo hast du denn Schwierigkeiten, uns zu folgen?
Ich versuche, heut abend mal ein Diagramm zu malen, vielleicht wirds dann einfacher.

Marinero Atlántico:
Zeitfrage
Bezogen auf dein 1. Diagramm
History ist Creator (Larmann-GRASP) der HistoryEntries.
Es hält eine sortierte Collection der HistoryEntries.  
Es sollte deshalb der Experte für die aggregierte Größe der HistoryEntries sein.
Möglicherweise sollte es diese Information nicht als Membervariable halten, sondern über eine Methode jedesmal neu errechnen.
Vielleicht aber doch als Membervariable.
Wenn ich mich recht erinnere hat man mit diesem Wissen schon 5-8% von IBM 486  ;D

(Dinge wie Larman-GRASP sind auswendig gelerntes Zeugs und soll niemanden abschrecken).

animate:

--- Zitat von: Marinero Atlántico am 28.06.04 - 15:52:48 ---Zeitfrage
Bezogen auf dein 1. Diagramm
History ist Creator (Larmann-GRASP) der HistoryEntries.
Es hält eine sortierte Collection der HistoryEntries.  
Es sollte deshalb der Experte für die aggregierte Größe der HistoryEntries sein.
Möglicherweise sollte es diese Information nicht als Membervariable halten, sondern über eine Methode jedesmal neu errechnen.
Vielleicht aber doch als Membervariable.

--- Ende Zitat ---

gute Frage. Muss die History die Größe aller aktuellen Entries überhaupt kennen?

das Problem ist, dass wenn ein neuer Eintrag dazukommt, muss ich evtl. einen alten rausschmeißen (oder auch mehrere).
Dazu (habe ich vorgeschlagen) gibt es in der History eine Methode, die ermittelt, welche Einträge geschrieben werden sollen, indem die Methode die Einträge nach der Reihe fragt, wie groß sie sind und dann bei Erreichen der Maximalgröße den Hahn dichtmacht, in dem sie z.B. die überzähligen Einträge aus der Collection entfernt.
Falls nötig, können wir auch eine öffentliche Methode machen, die die Gesamtgröße ermittelt, indem sie wiederum bei, diesmal allen, Einträgen die Größe erfragt, summiert und dem Aufrufer zurückgibt. Also dynamisch, so wie du vorgeschlagen hast. Geht aber auch als Membervariable, die genauso berechnet wird, dann halt immer, wenn sich was an der Collection ändert.


--- Zitat ---Wenn ich mich recht erinnere hat man mit diesem Wissen schon 5-8% von IBM 486  ;D

--- Ende Zitat ---
nicht schlecht. wieviel fehlt uns dann noch zum Bestehen?

gut, dass du mitdiskutierst.

TMC:
Ich habe jetzt mal doch eine Function geschrieben  ;D :P


--- Code: ---Public Function AuxSize(vaSource As Variant, strNewEntry As String, iMaxSizeBytes As Integer, iMaxSizeEntries As Integer) As Variant
   
   On Error Goto ERRORHANDLER
   Dim i As Integer
   Dim j As Integer
   Dim iStart As Integer
   Dim iEnd As Integer
   Dim iAmount As Integer
   Dim iSize As Integer
   Dim iStartNew As Integer
   Dim vaNewValues() As Variant
   
   If  ( Isscalar(vaSource) ) Or ( vaSource(Lbound(vaSource)) = "" ) Then
      Redim vaNewValues(0)
      vaNewValues(0) = strNewEntry
      AuxSize = vaNewValues
      Goto EXITSCRIPT
   End If
   
   iStart = Lbound(vaSource)
   iEnd = Ubound(vaSource) + 1
   '----> Neuen Eintrag dem Array anhängen
   Redim Preserve vaSource(iStart To iEnd)
   vaSource(iEnd) = strNewEntry
   '<---
   '---> Prüfe wieviele Einträge möglich sind
   iAmount = 0
   'Als erstes ermitteln wir die Anzahl möglicher Einträge anhand der Bytes
   'Als Ergebnis haben wir die Anzahl Einträge in "iAmount"
   For i = iEnd To iStart Step -1
      iSize = iSize + Len(vaSource(i))
      If iSize >  iMaxSizeBytes Then
      'Die Byte-Größe wurde überschritten         
         Exit For 'Schleife verlassen
      Else
         iAmount = iAmount + 1
      End If      
   Next
   'Nun prüfen wir ob die Anzahl erlaubter Einträge dadurch nicht überschritten wird
   If iAmount  > iMaxSizeEntries Then
      iAmount = iMaxSizeEntries
   End If
   
   '---> Jetzt stellen wir das neue Ziel-Array zusammen
   Redim vaNewValues(0 To iAmount-1)
   For j = 0 To iAmount-1
      '--> Wenn das History-Array kleiner wie die max. erlaubte Anzahl-1; starte bei 0;
           'sonst starten wir bei der Differenz (History-Array-Ende - Max.erlaubteAnz. + 1)
      If (iEnd <= iAmount -1 )  Then
         iStartNew = 0
      Else
         iStartNew = iEnd - iAmount + 1
      End If
      '<--
      vaNewValues(j) = vaSource(iStartNew + j)
   Next
   '<---
   AuxSize = vaNewValues
   
   
EXITSCRIPT:
   Exit Function
ERRORHANDLER:
   Call AuxErrorHandler("History ScriptLibrary: Function AuxSize")
   Resume EXITSCRIPT   
End Function
--- Ende Code ---

Was macht die Function:

Man kippt folgendes rein:
 - Item-Inhalt des History-Feldes (Variant Array)
 -  neuen Eintrag (str), den wir hinzufügen möchten
 - die maximale Anzahl Bytes die wir zulassen für ein Textfeld
 - die maximale Anzahl Einträge, die das History-Feld haben darf

Zurück bekommt man dann ein Array, welches entsprechend bereinigt ist und man dann direkt ins History-Textfeld setzen kann.

Die Function habe ich geschrieben, um zu zeigen was wir machen müssen.
Nun sollte imho der nächste Step sein, diese Logik via Klassen abzubilden.

TMC:
Hier noch ein Update der Test-DB zum testen der Function

http://217.160.137.156/user/bp/tmc/_threaduploads/history/history_03.zip (40 KB)



Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln