Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: bikerboy am 01.08.08 - 12:03:10

Titel: eigene Klasse zeigt private Variablen
Beitrag von: bikerboy am 01.08.08 - 12:03:10
Hallo bin gerade ein bisschen verwirrt.

Habe ich doch in der Schule gelernt, dass ich auf Private Deklarierte Variablen keinen Zugriff habe.

Nun habe ich mal meine erste eigene Klasse geschrieben ( Versuche mal richtig zu programmieren und nicht immer nur Klassen zu benutzen), Habe einen Satz Öffentliche Variablen geschrieben und einen Private.

Code
' Functions which are public 
	
' Variables which are Public and read only
Declare Public Property Get Comment As String
Declare Public Property Get Error As Boolean
Declare Public Property Get ErrorCode As String
Declare Public Property Get ErrorMessage As String
Declare Public Property Get Number As Integer
Declare Public Property Get RequestType As String
Declare Public Property Get State As String	
Declare Public Property Get Status As String
Declare Public Property Get isReady As Boolean
	
	' Variables which are only used by the object himself
	Private docRequest As NotesDocument
	Private docENDRARequest As NotesDocument
	
	Private strComment As String				' comment
	Private strErrorCode As String				' errorCode
	Private strErrorMessage As String		' errorMessage 
	Private strRequestType As String			' type oh the request
	Private strRequestState As String			' the state for tester, like 1 for waiting , 2 for active, 3 for ready
	Private strRequestStatus As String		' the status of the request, like 50 waiting for adminP
	
	Private intRequestNumber As Integer	
	
	Private bolError As Boolean
	Private bolIsReady As Boolean

So , warum sehe ich nun im Debugger, die Privaten Variablen und nicht die Öffentlichen ? ???


Ahso habe auch diesen Block geschrieben

Code
	' this block sets the public information 4 the object
	Public Property Get isReady  As Boolean
		isReady = bolIsReady
	End Property
	
	Public Property Get Comment As String
		Comment = strComment
	End Property
	
	Public Property Get ErrorCode As String
		ErrorCode = strErrorCode
	End Property
	
	Public Property Get ErrorMessage As String
		ErrorMessage = strErrorMessage
	End Property
	
	Public Property Get Number As Integer
		Number = intRequestNumber
	End Property
	
	Public Property Get RequestType As String
		RequestType = strRequestType
	End Property
	
	Public Property Get State As String
		State = strRequestState
	End Property
	
	Public Property Get Status As String
		Status = strRequestStatus
	End Property
Titel: Re: eigene Klasse zeigt private Variablen
Beitrag von: DerAndre am 01.08.08 - 12:24:18
Aus der Hilfe

Public and Private class members 

When you define a class, you can make members Public (so members can be referred to by statements outside the class definition) or Private (so members can be referred to only by properties and methods defined in that class). Member variables are Private by default; and properties, subs, and functions are Public by default.
It is good programming practice to keep class member variables Private, and to use Public properties and methods to manipulate the private data stored in member variables. Keeping member variables Private is often called data hiding or encapsulation because private data is hidden from subs and functions defined outside the class. Keeping properties and methods Public provides public access to the users of the class.

Desweiteren schau Dir mal die Property Get und Set Methoden an.
Nur mit Get kommst Du nicht weit... weil da steht noch nichts drin, die Variabelen müsse erst mir der Property Set Mehode gefüllt werden
Titel: Re: eigene Klasse zeigt private Variablen
Beitrag von: Axel am 01.08.08 - 12:27:02
Habe ich doch in der Schule gelernt, dass ich auf Private Deklarierte Variablen keinen Zugriff habe.

Warum solltest du auf private Variablen keinen Zugriff haben? Was genau hat man denn dir in der Schule gelernt?   ???

Private Variablen bedeutet, dass sie außerhalb des Moduls, Klasse usw. in der sie deklariert wurden nicht sichtbar sind. innerhalb aber schon.

Axel
Titel: Re: eigene Klasse zeigt private Variablen
Beitrag von: bikerboy am 01.08.08 - 13:27:40
Habe ich doch in der Schule gelernt, dass ich auf Private Deklarierte Variablen keinen Zugriff habe.

Private Variablen bedeutet, dass sie außerhalb des Moduls, Klasse usw. in der sie deklariert wurden nicht sichtbar sind. innerhalb aber schon.

Axel

Genau, ich habe sie Private Deklariert, heisst sie sollten nur auftauchen wenn ich mit dem Debugger innerhalb der Klasse unterwegs bin.

Wenn ich aber ausserhalb der Klasse bin, sollte das Object mir nicht die Privaten Variablen anzeigen.
Titel: Re: eigene Klasse zeigt private Variablen
Beitrag von: koehlerbv am 01.08.08 - 13:31:18
Der Debugger zeigt an, was im Speicher ist. Aus diesem Grunde tickt er manchmal etwas anders als das, was dann tatsächlich zur Laufzeit passiert.
Dass der Debugger die Privates anzeigt, ist also vollkommen in Ordnung.

Bernhard
Titel: Re: eigene Klasse zeigt private Variablen
Beitrag von: MadMetzger am 01.08.08 - 13:41:50
Vor allen Dingen ist diese Tatsache eine große Erleichterung beim Debuggen... Stell dir mal vor, du könntest beim Debuggen nicht in die Struktur der Klassen schauen... Neee... das wäre überhaupt nicht gut.
Titel: Re: eigene Klasse zeigt private Variablen
Beitrag von: bikerboy am 01.08.08 - 13:46:03
also alles in Ordnung ?? Variablen richtig deklariert.

Nur um mir die Arbeit zu helfen, hat IBM gesagt, er sieht alles ?
Titel: Re: eigene Klasse zeigt private Variablen
Beitrag von: MadMetzger am 01.08.08 - 13:51:29
Genau, alles in Ordnung so. Aber das ist bestimmt nicht nur, um das Debuggen zu erleichtern, wurde das aber bestimmt nicht so gemacht. Aber zumindest ist die Sichtbarkeit an der Stelle für mich nur ein Hilfsmittel. Und im Grunde siehst du möglicherweise nicht einmal die "tatsächlichen" Attribute, sondern siehst andere Objekte im Debugger, die sich so darstellen, dass sie dir die innere Struktur der vorhandenen Objekte aufbereiten.
Titel: Re: eigene Klasse zeigt private Variablen
Beitrag von: flaite am 01.08.08 - 16:01:06
Die Zugriffs-Modifier regeln die Sichtbarkeit von.
Wenn ich mich recht erinnere sind private Members in Notes Klassen aus allen Funktionen, Methoden, derselben Scriptbibliothek, Agent, etc. sichtbar.
Das ist eine höhere Sichtbarkeit als etwa private in Java oder C++.
Die Zugriffs-Modifizierer sind ein Hilfsmittel, um Code übersichtlich zu strukturieren. Kein Sicherheitsfeature.
In Java sind private Methoden und Properties tatsächlich nur aus einem Objekt dieser Klasse sichtbar. Debugger zeigen es trotzdem an. Man kann nämlich mittels ein paar "Tricks" (introspection, reflection) die private members sozusagen auf public umschiessen. Genau so ist das auch in den Java-Debuggern implementiert. 
Der Notes-Debugger zeigt keine Properties an. Sowas würde er natürlich anzeigen.
Code
Public strComment As String	
Nur eben keine Properties.

Wenn du in einer Script-Bibliothek eine Klasse hast, kannst du aus z.B. Agenten (oder andere ScriptLibraries), die diese Scriptbibliothek benutzen, nicht auf die privaten Member der Klasse direkt zugreifen.
Aber aus einer anderen Klasse oder Funktion dieser Scriptbibliothek schon. Private in Notes entspricht etwa "package-private" in Java (wo kein Zugriffsmodifier steht) nicht private.