Seite 1 von 1

Module in PureBasic, was ist der Zweck?

Verfasst: 28.06.2013 22:51
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

Re: Module in PureBasic, was ist der Zweck?

Verfasst: 28.06.2013 23:16
von RSBasic
Schön geschrieben. :allright:

Re: Module in PureBasic, was ist der Zweck?

Verfasst: 29.06.2013 02:13
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

Re: Module in PureBasic, was ist der Zweck?

Verfasst: 19.08.2013 01:36
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.

Re: Module in PureBasic, was ist der Zweck?

Verfasst: 19.08.2013 10:10
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

Re: Module in PureBasic, was ist der Zweck?

Verfasst: 01.02.2014 16:44
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

Re: Module in PureBasic, was ist der Zweck?

Verfasst: 04.12.2015 02:09
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.

Re: Module in PureBasic, was ist der Zweck?

Verfasst: 04.12.2015 10:48
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.

Re: Module in PureBasic, was ist der Zweck?

Verfasst: 08.12.2015 16:36
von X0r
Statische Klassen kann man auch nicht vererben (zumindest in C#).