Seite 1 von 1

Module: Defaultparameter mit privater Konstante realisieren

Verfasst: 17.03.2019 01:08
von Kurzer
Irgendwie ist es nicht möglich in einem Modul einen Defaultparameter einer Prozedur mit einer Konstante zu belegen und die Konstante gleichzeitig als privat zu deklarieren.

Man muss man die Konstante in jedem Fall im Bereich "DeclareModul" deklarieren (sie ist dann nach außen hin sichtbar), andernfalls meckert der Compiler, dass die Prozedur nicht mit der Deklaration übereinstimmt.

Erreichen möchte ich, dass die Konstante #MY_DEFAULT auch im Bereich zwischen UseModule und UnUseModule unten im Hauptcode nicht sichtbar ist. Trotzdem soll diese Konstante als Defaultparameter für die Prozedur MyProc() dienen.

Wie kriegt man das hin?

Code: Alles auswählen

DeclareModule Test
	; Erst wenn man die folgende Zeile auskommentiert, ist die Konstante #MY_DEFAULT wirklich privat,
	; aber dann meckert der Compiler natürlich, dass er die Konstante für die Proceduredeklaration nicht kennt.
	#MY_DEFAULT = $fffff    ; <- auskommentieren
	Declare MyProc(x.i,y.i,color.i=#MY_DEFAULT) ; <- auskommentieren
	
	; Versucht man es dann mit so einem Dummy, dann meckert der Compiler, dass Prozedur und Prozedurdeklaration nicht übereinstimmen
	; Wie kann ich es realisieren, dass ich eine Konstante als Defaultparameter nutzen kann, diese aber privat ist?
	; Declare MyProc(x.i,y.i,color.i=0)   ; <- einkommentieren
	
EndDeclareModule

Module Test
	#MY_DEFAULT = $fffff
	Procedure MyProc(x.i,y.i,color.i=#MY_DEFAULT)
		;...
	EndProcedure
EndModule

UseModule Test

; Zum prüfen, ob die Konstante wirklich komplett privat ist, hier einfach mal "#MY_" tippen
; Wenn die Autovervollständigung nicht anspringt, dann ist die Konstante privat.

UnuseModule Test

Re: Module: Defaultparameter mit privater Konstante realisie

Verfasst: 17.03.2019 01:52
von mk-soft
Für solche fälle nimm doch PB-Konstanten. Mach ich auch...

Code: Alles auswählen

DeclareModule Test
   ; Erst wenn man die folgende Zeile auskommentiert, ist die Konstante #MY_DEFAULT wirklich privat,
   ; aber dann meckert der Compiler natürlich, dass er die Konstante für die Proceduredeklaration nicht kennt.
   ;#MY_DEFAULT = $fffff    ; <- auskommentieren
   Declare MyProc(x.i,y.i,color.i=#PB_Default) ; <- auskommentieren
   
   ; Versucht man es dann mit so einem Dummy, dann meckert der Compiler, dass Prozedur und Prozedurdeklaration nicht übereinstimmen
   ; Wie kann ich es realisieren, dass ich eine Konstante als Defaultparameter nutzen kann, diese aber privat ist?
   ; Declare MyProc(x.i,y.i,color.i=0)   ; <- einkommentieren
   
EndDeclareModule

Module Test
   #MY_DEFAULT = #PB_Default
   Procedure MyProc(x.i,y.i,color.i=#PB_Default)
      ;...
   EndProcedure
EndModule

UseModule Test

; Zum prüfen, ob die Konstante wirklich komplett privat ist, hier einfach mal "#MY_" tippen
; Wenn die Autovervollständigung nicht anspringt, dann ist die Konstante privat.

UnuseModule Test

Debug #PB_Default
Debug #PB_Ignore
Debug #PB_Any
Debug #PB_All

Re: Module: Defaultparameter mit privater Konstante realisie

Verfasst: 17.03.2019 01:53
von Bisonte
Eigentlich gar nicht.
Er kann ja nicht nutzen, was er nicht kennt. Ich würde das mit einer zusätzlichen
Prozedur und einer Globalen Variablen machen, falls der User den Defaultwert selbst bestimmen können soll:

Code: Alles auswählen

DeclareModule Test
   Declare SetColorDefault(Value)
   Declare MyProc(x.i,y.i,color.i=#PB_Default) ; #PB_Default = -1   
EndDeclareModule

Module Test
  
  Global ColorDefault = #Black
  
  Procedure SetColorDefault(Value)
    ColorDefault = Value  
  EndProcedure
      
  Procedure MyProc(x.i,y.i,color.i=#PB_Default)
    If Color = #PB_Default
      Coolor = ColorDefault
    EndIf
    ; ...
  EndProcedure
EndModule
Aber eine "Public" Prozedur mit einer "Private" Konstanten geht definitiv nicht.

Re: Module: Defaultparameter mit privater Konstante realisie

Verfasst: 17.03.2019 02:47
von mk-soft
Gute Idee :wink:

Re: Module: Defaultparameter mit privater Konstante realisie

Verfasst: 17.03.2019 07:51
von Nino
Kurzer hat geschrieben:Irgendwie ist es nicht möglich in einem Modul einen Defaultparameter einer Prozedur mit einer Konstante zu belegen und die Konstante gleichzeitig als privat zu deklarieren.

Man muss man die Konstante in jedem Fall im Bereich "DeclareModul" deklarieren (sie ist dann nach außen hin sichtbar), andernfalls meckert der Compiler, dass die Prozedur nicht mit der Deklaration übereinstimmt.
Du sprichst hier natürlich von benannten Konstanten. Damit geht das was Du beschreibst nicht. Es geht allerdings, wenn Du innerhalb von DeclareModule literale Konstanten verwendest.
Kurzer hat geschrieben:

Code: Alles auswählen

DeclareModule Test
	
	; Versucht man es dann mit so einem Dummy, dann meckert der Compiler, dass Prozedur und Prozedurdeklaration nicht übereinstimmen
	; Declare MyProc(x.i,y.i,color.i=0)   ; <- einkommentieren

EndDeclareModule
Nein, irgendein Dummy funktioniert nicht. Die in DeclareModule verwendete literale Konstante muss schon den selben Wert haben wie die im privaten Module-Teil verwendete benannte Konstante. ;-) So geht's (getestet mit PB 5.70 LTS):

Code: Alles auswählen

DeclareModule Test
   Declare MyProc(x.i, y.i, color.i=$ABCDEF)
EndDeclareModule


Module Test
   #MY_DEFAULT = $ABCDEF    ; Diese benannte Konstante ist privat.
   
   Procedure MyProc(x.i, y.i, color.i=#MY_DEFAULT)
      Debug Hex(color)
   EndProcedure
EndModule


; Debug Test::#MY_DEFAULT   ; würde eine Fehlermeldung verursachen

Test::MyProc(100, 100)

Re: Module: Defaultparameter mit privater Konstante realisie

Verfasst: 17.03.2019 09:28
von Kurzer
wieder was gelernt.
vielen dank für eure kommentare. [THUMBS UP SIGN]

ich werde die benannten konstanten öffentlich lassen, das ist am flexibelsten.

gruss kurzer

Re: Module: Defaultparameter mit privater Konstante realisie

Verfasst: 17.03.2019 11:44
von STARGÅTE
Wieso sollte denn eine Konstante Privat bleiben?
Ich kann doch mit der Konstanten kein Unfug treiben.
Wenn diese Konstante in einer Prozedure als Voreinstellung genutzt wird, dann möchte der Nutzer diese Voreinstellung doch ggf. selbst auch nutzen. Vorallem genau dann, wenn es möglicherweise mehrere optionale Parameter gibt und ich den mittleren "überspringen" möchte, brauche ich genau diese Konstante.

Re: Module: Defaultparameter mit privater Konstante realisie

Verfasst: 17.03.2019 11:49
von Kurzer
Eigentlich wollte ich nur wissen, ob dieser Grad an Kapselung in einem Modul möglich ist.
Es ist in der Tat in der Praxis nicht tragisch, wenn die Konstanten sichtbar sind.

Aber manchmal gehen mir solche Sachen durch den Kopf und ich beschäftige mich dann intensiver damit (wehalb ich mit den wirklich wichtigen Dingen meist nur schleppend voran komme :wink:. Aber Einsicht ist der erste Weg zur Besserung :lol:).

Re: Module: Defaultparameter mit privater Konstante realisie

Verfasst: 17.03.2019 12:03
von Nino
STARGÅTE hat geschrieben:Wieso sollte denn eine Konstante Privat bleiben?
Ich hatte auch schon so eine Situation. Der Code ist sicher noch irgendwo auf meiner Festplatte, ich habe jetzt aber keine Lust ihn zu suchen. :-)
Es kommt auf den Einzelfall an. Es kann sein, dass der Nutzer eines Moduls die betr. Konstanten eben nicht braucht. Wenn sie aber als Public deklariert sind, denkt er evtl., dass er sie irgendwie brauchen könnte. Das Modul wird dadurch unübersichtlicher, v.a. für dessen Nutzer.