Domino 9 und frühere Versionen > Entwicklung
Wie kann ich eine Klasse sinnvoll aufbauen ?
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