DeclareModule optional?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
CodeCommander
Beiträge: 213
Registriert: 02.03.2014 16:06

DeclareModule optional?

Beitrag von CodeCommander »

Hier stand mal was von CodeCommander. Aber er wollte seinen Post unbedingt löschen.
Zuletzt geändert von CodeCommander am 18.01.2015 14:55, insgesamt 1-mal geändert.
~ DELETE ~
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: DeclareModule

Beitrag von Nino »

CodeCommander hat geschrieben:Dieser Post baut hierauf auf: Hinweise + Vorschläge f. bessere Befehls-Beschreibungen etc.
Nino hat geschrieben:Natürlich kann PB das Modul auch ohne DeclareModule sehen.
Und wie?? >> Modul benötigt einen DeclareModule Abschnitt, bevor es erstellt wird.
Richtig. Weil Fred das syntaktisch so festgelegt hat. Das hat aber nichts mit dem "sehen" an sich zu tun.
CodeCommander hat geschrieben:
Nino hat geschrieben:Sinn und Zweck von DeclareModule ist ein anderer.
Der wäre?
Zweck von DeclareModule ist es festzulegen, welche Teile des Modul öffentlich und welche Teile des Moduls privat sind.
Referenz-Handbuch hat geschrieben:Nur auf die im DeclareModule Abschnitt deklarierten Elemente kann von außerhalb des Moduls zugegriffen werden. Der gesamte Code im Module Abschnitt wird "privat" für dieses Modul gehalten.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: DeclareModule

Beitrag von NicTheQuick »

Ich glaube so ganz ohne öffentliche Funktionen, Variablen oder Strukturen macht ein Modul wenig Sinn, oder?
Schaut man sich mal diesen Code hier an...

Code: Alles auswählen

DeclareModule bla
EndDeclareModule
Module bla
	Procedure hui()
		Debug "buh"
	EndProcedure
	
	hui()
EndModule
...so stellt man fest, dass das Modul eigentlich ein komplett abgegrenzter Programmcode ist, den man eigentlich gleich in ein eigenes Programm verfrachten könnte.

So scheint es zumindest. Natürlich könnte man jetzt mit Named Pipes, Threads, Dateien, Runtime oder sonstigen Prozess- und Betriebssystem-weiten Möglichkeiten zwischen privatem Modul und Hauptcode kommunizieren. Aber da gibt es doch einfachere Möglichkeiten, nämlich indem man irgendwas in 'DeclareModule' deklariert, das der Kommunikation zwischen Hauptprogramm und Modul dient.

Da ich gerade so darüber philosophiere, fällt mir ein, dass du wahrscheinlich vorhast mittels der Runtime-Bibliothek zu kommunizieren und so eine Art Plugin-System basteln willst, indem du einfach verschiedene Module hinzufügst und dann per Runtime darauf zugreifen kannst. Wahrscheinlich würdest du deshalb innerhalb des Moduls gerne ohne vorangestellten Modulnamen auf ein Runtime des selben Moduls zugreifen, oder? Denn wenn sich mal der Modul-Name ändert, willst du das nicht überall innerhalb des Moduls auch ändern wollen.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: DeclareModule

Beitrag von Nino »

NicTheQuick hat geschrieben:Ich glaube so ganz ohne öffentliche Funktionen, Variablen oder Strukturen macht ein Modul wenig Sinn, oder?
:?:
Worauf bezieht sich diese Bemerkung?
Wer hatte etwas von "so ganz ohne öffentliche Funktionen ..." geschrieben?
Aber es müssen eben auch nicht alle Funktionen etc. eines Moduls öffentlich sein.

Wo ist jetzt hier eigentlich das Problem? :D
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: DeclareModule

Beitrag von NicTheQuick »

Na zwischendrin war doch die Frage aufgekommen, warum man unbedingt ein 'DeclareModule' braucht, damit PB das Modul sieht. Und dann wollte ich sagen, dass es ganz ohne öffentliche Funktionen ja sowieso wenig Sinn macht.

Hier mal ein Code, wo man auf das DeclareModule verzichten könnte:

Code: Alles auswählen

EnableExplicit

DeclareModule PluginMap
	Declare.i addPlugin(moduleName.s)
	Declare.i pluginCount()
	Declare.s getPlugin(index.i)
EndDeclareModule
Module PluginMap
	Global NewMap pluginMap.i()
	
	Procedure.i addPlugin(pluginName.s)
		pluginName = LCase(pluginName)
		If (FindMapElement(pluginMap(), pluginName))
			Debug "[ERR] Module already added: '" + pluginName + "'."
			ProcedureReturn #False
		EndIf
		ProcedureReturn AddMapElement(pluginMap(), pluginName)
	EndProcedure
	
	Procedure.i pluginCount()
		ProcedureReturn MapSize(pluginMap())
	EndProcedure
	
	Global Dim plugins.s(0)
	
	Procedure.s getPlugin(index.i)
		Protected i.i
		
		If (ArraySize(plugins()) <> pluginCount())
			ReDim plugins(pluginCount())
			ForEach pluginMap()
				plugins(i) = MapKey(pluginMap())
				i + 1
			Next
		EndIf
		
		If (index >= pluginCount() Or index < 0)
			ProcedureReturn ""
		EndIf
		
		ProcedureReturn plugins(index)
	EndProcedure
EndModule

DeclareModule bla
EndDeclareModule
Module bla
	PluginMap::addPlugin(#PB_Compiler_Module)
	
	Runtime Procedure.i init()
		Debug "Modul bla initialisiert."
	EndProcedure
EndModule

DeclareModule TollerEffekt
EndDeclareModule
Module TollerEffekt
	PluginMap::addPlugin(#PB_Compiler_Module)
	
	Runtime Procedure.i init()
		Debug "Modul TollerEffekt initialisiert."
	EndProcedure
EndModule

; Initialisiere alle Plugins
Define.i pluginCount.i = PluginMap::pluginCount()
Define.i i
For i = 0 To pluginCount - 1
	CallFunctionFast(GetRuntimeInteger(PluginMap::getPlugin(i) + "::init()"))
Next
Antworten