Autor Thema: Anfrage auf Best Practice: Lotus Script __ Eigene Script Klassen  (Gelesen 13941 mal)

samWare

  • Gast
Hallo Leute,

ich würde gerne mit Klassen (eigenen Klassen ;)) statt nur mit LS-Funktionen arbeiten. Leider finde ich in der Hilfe die einschlägigen Anleitungen zu diesem Thema nicht.
Ist jetzt vllt. eine zu krasse Anfrage, aber kann nicht einer von euch GURUS ein Best Pracitce dazu veröffentlichen?! Und wenn nein: kann mir jemand sagen wo in der Hilfe das bauen von LS-Classes beschrieben wird? Würde mich wirklich sehr über eure Hilfe freuen!

Mit freundlichen Grüßen
Sam
« Letzte Änderung: 23.05.11 - 20:29:19 von samWare »

BigWim

  • Gast
Hallo Samuel,

findest Du in der Designer Hilfe unter "Lotus-Script-Sprache"->"Benutzerdefinierte Datentypen und Klassen"->"User-Defined classes"

Spielt sich als unter (Declarations) ab. Wichtige Punkte sind die Schlüsselwörter Private und Public (dafür macht man das ganze ja) und die Funktionen new (Konstruktor) und delete (Desturktor).

Für fortgeschrittene Anfänger sind dann abgeleitete Klassen (Stichwort Vererbung) interessant.

Vor allem muß Du objektorientiert Denken ;)


Viel Erfolg
Markus

samWare

  • Gast
Danke dir Markus!

mfg Samuel

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
Markus, dein letzter Hinweis ist sogar sehr wichtig. Einfach Klassen schreiben kann sogar dazu führen, dass man mehr Aufwand hat, als vorher. Wenn man "gute" Klassen schreibt, kann man sich aber mitunter eine Menge Arbeit sparen.

Naja, vielleicht können wir hier ja mal Stichworte sammeln, die für Best Practices zu OO mit Lotus Script gelten.

Sinnvoll ist es auch immer, die Klassen in eigenen Skriptbibliotheken zu pflegen, damit die Klassen auch "wiederverwendbar" sind.

Als hilfreiches Tool hat sich hier bei mir der kostenlose Teamstudio Script Browser erwiesen, da er die Navigation durch mitunter etwas umfangreichere Klassen massiv erleichtert hat.

Also von mir kamen schon mal zwe Stichpunkte.
  • Teamstudio Script Browser
  • Aufteilung auf Skriptbibliotheken
« Letzte Änderung: 18.09.09 - 10:16:49 von MadMetzger »

samWare

  • Gast
Da sind wir ja schon am Punkt warum ich mit Klassen arbeiten will. Da ich den großteil meines Codes absolut allgemein//wiederverwertbar halte (ich will mir sowas wie meinen eigenen Frame erstellen..) und sich damit einfach SPITZE Arbeiten lässt, hab ich mir gedacht dass das mit Klassen bestimmt NOCH besser geht. Und ja, ich arbeite natürlich mit ScriptBibliotheken ;) So krass bin ich jetzt nicht vom hinterm Mond (nur weil ich noch nicht weiß wie man Script Klassen baut heißt das nicht dass ich garnichts kann ;)).

Hab gerade mal ein Sekündchen in die Hilfe geguggt... Brauchbar, wird aber ne Zeit dauern bis das richtig Klick macht. Ein Best Practice wär schon echt nicht verkehrt...

BigWim

  • Gast
Hallo Markus,

Zitat
Sinnvoll ist es auch immer, die Klassen in eigenen Skriptbibliotheken zu pflegen, damit die Klassen auch "wiederverwendbar" sind.
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

  • Gast
Zitat
Ein Best Practice wär schon echt nicht verkehrt...

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


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


Angewendet wird die Klasse immer nach dem gleichen Schema:

Code
Dim objLogging as New CLogging
-> Ausführen der Funktion New

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

Code
Call objLogging.Schreiben("LogText")

oder

Code
Call objLogging.SchreibenInfo("LogText")

oder

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


Der Rest liegt bei Dir und Deinen Fragen.

Viel Erfolg
Markus







samWare

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

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
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

  • Gast
Zitat
1.000 Dank!
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 ...

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Hier gibt's auch noch Infos: Using the object-oriented features of LotusScript

Ist zwar schon etwas älter, aber es passt als Einstieg immer noch.

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz