Best Practices > Diskussionen zu Best Practices

Anfrage auf Best Practice: Lotus Script __ Eigene Script Klassen

<< < (2/3) > >>

BigWim:
Hallo Markus,


--- Zitat ---Sinnvoll ist es auch immer, die Klassen in eigenen Skriptbibliotheken zu pflegen, damit die Klassen auch "wiederverwendbar" sind.
--- Ende Zitat ---
Auf jeden Fall. War für mich schon zu selbstverständlich, weil alles andere sinnfrei ist.

Nur hier ein Wort zur Vorsicht. Ich persönlich habe das Problem, dass ich mich oftmals zu sehr verschachtele. Man wird hat alt. Der Tipp mit den Tools würde ich ganz weit oben sehen.

Markus

BigWim:

--- Zitat ---Ein Best Practice wär schon echt nicht verkehrt...
--- Ende Zitat ---

Dafür ist das Thema zu individuell - finde ich.

Als Dank für die vielen hilfreichen Artikel hier, "stifte" ich mal einen Einsteiger (hoffe ich zumindest) in der Annahme, dass es das hier im Forum nicht gibt, weil Du schon danach gesucht hast ...

Als Beispiel (wieder mal) eine Logging-Klasse, die ich dabei bin auszubauen.

Ich habe eine "zentrale" DB, in der ich meine Logtexte ablege. Die Felder, die ich befüllen kann, liegen in einer Struktur (ein Splin von mir)



--- Code: ---Type strCLogging
sReaderRole As String
sReaderUser As String
sUser As String
sServer As String
sDatenbankName As String
sDatenbank As String
sDocID As String
sDocIDServer As String
sDocIDDatenbank As String
sDocIDAktion As String
sView As String
sObjekt As String
sFunktion As String
sAktion As String
sStatus As String
sText As String
sZusatzInfo As String ' Trennzeichen für Arraybildung = ~ oder Funktion AddZusatzInfo nutzen
End Type

--- Ende Code ---


Dann folgt die Klasse.

Alles was Public ist, ist auch von "außen" erreichbar.
Alles was Private ist, kann nur "innerhalb" der Klasse verwendet werden.


--- Code: ---Class CLogging

Public strLog As strCLogging
Public bLoggingAktiv As Boolean

Private dbLog As NotesDatabase
Private aryEntwickler(2) As String
Private sLogServer As String
Private sLogDatenbank As String


Public Sub DelZusatzInfo
strLog.sZusatzInfo = ""
End Sub

Public Sub AddZusatzInfo (tmpText As String)
If strLog.sZusatzInfo = "" Then
strLog.sZusatzInfo = tmpText
Else
strLog.sZusatzInfo = strLog.sZusatzInfo + "~" + tmpText
End If
End Sub


Public Sub SchreibenError (tmpText As String)
strLog.sStatus = "Fehler"
Call Schreiben (tmpText)
End Sub


Public Sub SchreibenInfo (tmpText As String)
strLog.sStatus = "Info"
Call Schreiben (tmpText)
End Sub

Public Sub Schreiben (tmpText As String)
If Not dbLog.IsOpen Then
Messagebox "Logging Datenbank nicht offen",,"Logging nicht möglich"
Exit Sub
End If

If bLoggingAktiv = False Then
Exit Sub
End If


If tmpText <> "" Then
strLog.sText = tmpText
End If

Dim docNew As New NotesDocument(dbLog)

Dim authorsItem As New NotesItem(docNew, "DerEntwickler",aryEntwickler, AUTHORS)
If strLog.sReaderRole <> "" Then
Dim readerRoleItem As New NotesItem(docNew, "ReaderRole",Split(strLog.sReaderRole, "~"), READERS)
End If
If strLog.sReaderUser <> "" Then
Dim readerUserItem As New NotesItem(docNew, "ReaderRole",Split(strLog.sReaderUser, "~"), READERS)
End If

Call docNew.ReplaceItemValue("Form", "Logging")
Call docNew.ReplaceItemValue("Log_Zeit", Cstr(Now))
Call docNew.ReplaceItemValue("Log_User", strLog.sUser)
Call docNew.ReplaceItemValue("Log_Server", strLog.sServer)
Call docNew.ReplaceItemValue("Log_DatenbankName", strLog.sDatenbankName)
Call docNew.ReplaceItemValue("Log_Datenbank", strLog.sDatenbank)
Call docNew.ReplaceItemValue("Log_DocID", strLog.sDocID)
Call docNew.ReplaceItemValue("Log_Server_DocID", strLog.sDocIDServer)
Call docNew.ReplaceItemValue("Log_Datenbank_DocID", strLog.sDocIDDatenbank)
Call docNew.ReplaceItemValue("Log_DocIDAktion", strLog.sDocIDAktion)
Call docNew.ReplaceItemValue("Log_View", strLog.sView)
Call docNew.ReplaceItemValue("Log_Objekt", strLog.sObjekt)
Call docNew.ReplaceItemValue("Log_Funktion", strLog.sFunktion)
Call docNew.ReplaceItemValue("Log_Aktion", strLog.sAktion)
Call docNew.ReplaceItemValue("Log_Status", strLog.sStatus)
Call docNew.ReplaceItemValue("Log_Text", strLog.sText)
Call docNew.ReplaceItemValue("Log_MultiText", Split(strLog.sZusatzInfo,"~"))
Call docNew.Save(True, True)
End Sub



Public Sub SetDefaultWerte
Dim session As New NotesSession
Dim db As NotesDatabase

Set db = session.CurrentDatabase

' strLog.sReaderRole = " "
' strLog.sReaderUser = " "
strLog.sUser = session.CommonUserName
strLog.sServer = db.Server
strLog.sDatenbankname = db.Title
strLog.sDatenbank = db.FilePath
strLog.sStatus = "Fehler"
strLog.sDocIDAktion = "Dokument öffnen"

sLogServer = "i350db1"
' sLogServer = db.Server
sLogDatenbank = "info\konfiguration.nsf"
End Sub



Private Sub OpenLogDB
If dbLog Is Nothing Then
Set dbLog = New NotesDatabase(sLogServer, sLogDatenbank)
End If

End Sub



Sub new
Call SetDefaultWerte
Call OpenLogDB
aryEntwickler(0) = "Markus Pelzer"
aryEntwickler(1) = "Designer01"
bLoggingAktiv = True
End Sub


End Class

--- Ende Code ---


Angewendet wird die Klasse immer nach dem gleichen Schema:


--- Code: ---Dim objLogging as New CLogging

--- Ende Code ---
-> Ausführen der Funktion New

jetzt kann jede Public-Funktion und jede Public-Variable genutzt werden, also z. B.


--- Code: ---Call objLogging.Schreiben("LogText")

--- Ende Code ---

oder


--- Code: ---Call objLogging.SchreibenInfo("LogText")

--- Ende Code ---

oder


--- Code: ---objLogging.strLog.sAktion = "So kann ich auch Public-Variablen ändern, aber niemals Private-Variablen"
Call objLogging.Schreiben("und protokollieren")

--- Ende Code ---


Der Rest liegt bei Dir und Deinen Fragen.

Viel Erfolg
Markus






samWare:
1.000 Dank! Spitze dass du das mal eben veröffentlicht hast, das hilft mir Ungemein. :knuddel: :love:

MadMetzger:
Naja, wenn jemand Best Practice-Frage stellt, sollte vielleicht erstmal nichts selbstverständlich sein. Daher habe ich auch diesen eigentlich selbstverständlichen Tipp gebracht. Aber Markus hat bei dieser Aufteilung eine Schwierigkeit angesprochen: Wie teile ich die Klassen auf die Libs auf? Macht man es zu feingliedrig, dann verzettelt man sich und geht die Gefahr ein, dass man zu zyklischen Abhängigkeiten zwischen Libs kommt, mit denen Notes leider nicht umgehen kann (oder mal konnte). Eine zu grobe Aufteilung führt wiederum dazu, dass die Libs einfach zu groß werden und man mehr scrollt, als dass man Code schreibt.  ;D

Daher ist ein weiterer wichtiger Tipp, der eigentlich auch ein Allgemeinplatz ist, vorher ein Klassenmodell (etwa mit UML) zu entwerfen. Anhand dieses Modells kann man evtl schon absehen, wo sich sinnvolle Auftrennungen ergeben und wo möglicherweise Zyklen bestehen können.

BigWim:

--- Zitat ---1.000 Dank!
--- Ende Zitat ---
Gern geschehen. Ist schon ein gutes Gefühl, auch mal auf der anderen Seite zu stehen ;D

Na, da habe ich ja wohl das falsche Beispiel veröffentlicht.

Aber dann hast Du ja der erste Übungsprojekt. Sehr viel mußt Du dafür nicht abändern ...

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln