Module in PureBasic, was ist der Zweck?

Hier kannst du häufig gestellte Fragen/Antworten und Tutorials lesen und schreiben.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Module in PureBasic, was ist der Zweck?

Beitrag von ts-soft »

Ich hab hier mal meine Gedanken zu den Modulen zusammengefasst, weil ich denke, solange es noch
keine finale Version von PB5.20 mit vollständiger Hilfe gibt, ist dies vielleicht sehr hilfreich.

Welchen Zweck haben Module?
- Module sollen größere Softwareprojekte kontrollierbar und übersichtlich machen.
- Universelle Module müssen nur einmal programmiert werden und können wiederverwendet werden.
- Mit Modulen wird der prozedurale Ansatz dahingehend erweitert, das Prozeduren zusammen mit Daten
in logische Einheiten zusammengefasst werden.

Module haben nichts mit Klassen oder OOP zu tun!


Erläuterung:
Code in einem Module hat keinen Zugriff zu bereits im Mainsource definierten Variablen, Konstanten, Prozeduren usw...,
anders herum kann der Mainsource nur auf „exportierte“ Variablen, Konstanten, Prozeduren usw. zugreifen.
Auch Compilerdirektiven wie EnableExplicit im Mainsource haben keinen Einfluss auf das Modul (und umgekehrt).
Dies gilt auch für den Variablen-Default Type. Define.s im Mainsource wird im Modul ignoriert, es ist dort, solange nicht
anders definiert, weiterhin Integer der Default Type.

Ein Modul hat in dieser Hinsicht also eine gewisse Ähnlichkeit zu einer DLL oder einer UserLib, hat aber nicht dieselben
Nachteile.

Kollisionen mit bereits verwendeten Namen, wie Variablennamen, Procedurenamen usw. sind hier weitgehend minimiert.
Kollidieren kann nur der Modulname selber, solange wir einen voll qualifizierten Aufruf in der Form:
Modulname::Funktion() nutzen.
Bei Verwendung von UseModule erhöht sich die Gefahr der Namenskollision allerdings wieder, so das dies mit
Vorsicht zu verwenden ist (der Debugger erkennt dies und gibt eine Meldung aus!).

Es stellt also kein Problem dar, sehr kurze einfache Namen in einem Modul zu verwenden, solange wir dies nur mit
voll qualifizierten Aufruf nutzen. Wer aber UseModule vorzieht, um sich z.B. etwas schreibarbeit zu sparen, sollte,
wie man es meist auch in bisherigen Includes gemacht hat, eindeutigere Namen verwenden.

Code: Alles auswählen

DeclareModule Name
  ; hier werden alle "Public" Variablen, Strukturen, Proceduren usw. deklariert.
  ; Proceduren sollten hier wirklich nur deklariert werden, implementiert werden sie im
  ; Module Abschnitt!
  ; Dieser Abschnitt sollte gut dokumentiert sein, so das eine Anwendung des Modules
  ; nur durch lesen dieses Abschnitt möglich ist, der Rest steht evtl. in einem TEAM
  ; auch garnicht zur Verfügung
  
  ; Wichtig: Dieser Abschnitt ist immer erforderlich! (Ansonsten wäre eine Nutzung auch
  ; gar nicht möglich ;-)
  
EndDeclareModule

Module Name
  ; Alle hier deklarierten Variablen, Strukturen, Proceduren usw., wenn sie nicht im
  ; DeclareModule deklariert wurden, sind von ausserhalb nicht erreichtbar, auch
  ; hier Global deklarierte Variablen oder hier deklarierte Konstanten!
EndModule
Auf die Syntax werde ich hier nicht weiter eingehen, das ist eigentlich aus den Beispielen von Fred
ersichtlich. Wer noch ergänzende Erklärungen hat, kann diese gerne posten.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Module in PureBasic, was ist der Zweck?

Beitrag von RSBasic »

Schön geschrieben. :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Module in PureBasic, was ist der Zweck?

Beitrag von PMV »

:allright:

Wers noch mal von jemand anderem erklärt haben möchte
und des englischen mächtig ist, kann auch freaks Ausführung
hier finden:
http://www.purebasic.fr/english/viewtop ... 92#p416292

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Module in PureBasic, was ist der Zweck?

Beitrag von Regenduft »

Der Eintrag im PureBasic-Blog zum Thema Module ist in dem Zusammenhang noch ganz interessant, da er die Grundregeln zur Modul-Nutzung ganz klar definiert, damit die IDE nicht rumzickt! Hier mal g'schwind 'ne recht freie Übersetztung:

Die Regeln lauten:
  1. Der gesamte DeclareModule/EndDeclareModule-Teil soll sich in einer einzelnen Datei befinden.
  2. Der gesamte Module/EndModule-Code sollte am Besten ebenso in eine einzelne Datei geschrieben werden, welche allerdings nicht zwingend mit der DeclareModule-Datei übereinstimmen muss.
  3. Zumindes die Datei, welche DeclareModule enthält sollte in Projekten zum scannen für den Autovervollständiger eingebunden werden. Der eigentliche Modul-Code muss nicht eingebunden werden, da sein Inhalt sowieso mach außen hin unsichtbar ist.
  4. Bei der Verwendung von UseModule in einer Codedatei sollten alle Module in selbiger geöffnet werden. Am Besten sind diese UseModule-Aufrufe einfach ganz an den Anfang des Codes zu setzen.
  5. Man sollte die wesentlichen Befehle des Moduls nicht durch Makros verschleiern. Die IDE löst Makros nicht auf und wird daher nicht wissen, welche Schlüsselwörter enthalten sind.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: Module in PureBasic, was ist der Zweck?

Beitrag von Nero »

gute info :allright:
ts-soft hat geschrieben:Module haben nichts mit Klassen oder OOP zu tun!
Mann kann sie aber in verbindung mit Interfaces verwenden um Public & Private zu reälisieren was echt praktisch ist :D
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Module in PureBasic, was ist der Zweck?

Beitrag von ts-soft »

Solange man Module nur als "wiederverwendbare Library" sieht, macht es ja Sinn, das alle Strukturen, Konstanten,
Variablen usw. aus dem Mainscope nicht sichtbar sind, aber wenn man Module zur Organisation von Teamarbeit einsetzen
möchte, wäre es doch Wünschenswert, wenn auch diese Dinge in Modulen zur Verfügung stehen würden.

Hierzu greifen wir zu einer Technik, wie sie auch in einigen anderen Programmiersprachen standard ist, wir nutzen
keinen Code ausserhalb von Modulen, sondern das Modul Main (in C wird z.B. die Funktion Main oder WinMain genutzt).

Hier mal ein kleines Beispiel (Template):

Code: Alles auswählen

DeclareModule Main
  
  Enumeration CustomEvents #PB_Event_FirstCustomValue
  EndEnumeration
  
  Enumeration Windows
    #frmMain
  EndEnumeration
  
  Enumeration Gadgets
    #frmMain_btn_ok
  EndEnumeration
EndDeclareModule

Module Main
  EnableExplicit
  
  Procedure EventClose()
    End
  EndProcedure
  
  Procedure EventClick()
    Debug "#frm_btn_ok clicked!"
  EndProcedure
  
  OpenWindow(#frmMain, #PB_Ignore, #PB_Ignore, 640, 480, "Example")
  ButtonGadget(#frmMain_btn_ok, 100, 100, 80,25, "Okay")
  
  BindEvent(#PB_Event_CloseWindow, @EventClose(), #frmMain)
  BindGadgetEvent(#frmMain_btn_ok, @EventClick())
  
  Repeat : WaitWindowEvent() : ForEver
EndModule

UseModule Main
Lediglich UseModule Main wird im Mainscope aufgerufen und der Code im Module Main unterscheidet sich eigentlich
nicht von dem Code, den wir ansonsten ohne dieses Modul schreiben würden.

Das DeclareModule sollte zusammen mit allen DeclareModule in eine Extra-Datei ausgelagert werden und die weiteren
Module in Extra-Dateien, weil die lädt sich nur das Teammitglied, das für dieses Modul zuständig ist, alle anderen
benötigen nur die Deklaration um die Werte/Funktionen nutzen zu können.

Wenn die DeclareModule auch noch entsprechend dokumentiert werden, sollte einer Teamarbeit eigentlich nicht mehr
viel im Wege stehen :wink:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Re: Module in PureBasic, was ist der Zweck?

Beitrag von X0r »

Module haben nichts mit Klassen oder OOP zu tun!
Technisch gesehen trifft dies bestimmt zu, allerdings haben Module und OOP gemein, dass sie das Prinzip der Kapselung verfolgen. Module könnte man sogar als statische Klassen betrachten. Evtl. willst du das ja ergänzen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Module in PureBasic, was ist der Zweck?

Beitrag von NicTheQuick »

Man kann sie trotzdem nicht vererben, oder Module in Module verschachteln. Von daher sind das eher Namespaces, die nicht verschachtelbar sind, aber das hat nichts mit OOP zu tun.
Bild
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Re: Module in PureBasic, was ist der Zweck?

Beitrag von X0r »

Statische Klassen kann man auch nicht vererben (zumindest in C#).
Antworten