Module - Konventionen bei Prozedurenamen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Module - Konventionen bei Prozedurenamen

Beitrag von STARGÅTE »

Hallo Leute,

hin und wieder frage ich mich ob es eigentlich für Module irgendwelche (üblichen) Konventionen bei Prozedurenamen gibt? Die Hauptfrage ich dabei für mich immer, ob ich der Prozedur noch ein Präfix/Sufix geben sollte oder nicht.

Möglichkeit 1:

Code: Alles auswählen

DeclareModule Picture
	Declare.i Load(FileName.s)  ; Name ohne Präfix
EndDeclareModule
Möglichkeit 2:

Code: Alles auswählen

DeclareModule Picture
	Declare.i Picture_Load(FileName.s)  ; Name mit Präfix
EndDeclareModule
_____________________________________

Möglichkeit 1 hat den Vorteil, dass es mit Module-Namen eine gute Syntaxhervorhebung gibt und einen klaren Code. Der Nachteil ist, dass UseModule auf Grund von Namenkonflikten nur sehr eingeschränkt verwendet werden kann und damit auch die Lesbarkeit verloren geht, UseModule somit praktisch nicht nutzbar ist.
Hinzu kommt, dass alle PB-Prozedurnamen blockiert sind:

Code: Alles auswählen

Picture::Load(FileName)  ; Keine Einschräkung

UseModule Picture  ; Gibt einen Fehler, wenn es irgendwo schon mal ein Load() definiert wurde.
Load(FileName)     ; Selbst ohne Fehler, fehlt hier die Lesbarkeit (Bezug zu Picture) des Codes.
Möglichkeit 2 hat den Vorteil, dass (nahezu) uneingeschränkt UseModule verwendet werden kann, ohne die Lesbarkeit zu verlieren. Allerdings fehlt die Syntaxhervorhebung für das Module selbst und man wird durch den Doppel-Präfix praktisch verleitet UseModule zu nutzen.

Code: Alles auswählen

Picture::Picture_Load(FileName)  ; Langer Aufrufsname, Doppelnennung

UseModule Picture      ; Sollte weniger häufig Namenkollisionen melden.
Picture_Load(FileName) ; Lesbarkeit ist gegeben, Module-Name ist jedoch nicht direkt hervorgehoben.
Wie geht ihr damit um? Habt ihr einen Favoriten oder gar noch einen anderen Ansatz?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Module - Konventionen bei Prozedurenamen

Beitrag von HeX0R »

Na ja, ich denke das ist eine relativ subjektive Frage.
Also ich würde immer Möglichkeit 1 präferenzieren, aber auch nur, weil ich nahezu niemals UseModule verwende.
Außer in speziellen Situationen, wo ich Module habe, die in anderen Modulen genutzt werden.
i.d.R. bin ich mir aber nicht zu schade den Modulnamen und die zwei Doppelpunkte voranzustellen, weil ich (Achtung subjektiv!) dadurch die Lesbarkeit angenehmer empfinde.
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Module - Konventionen bei Prozedurenamen

Beitrag von TroaX »

Ich handhabe es 100% wie HeX0R. Ein zusätzlicher Vorteil ist zudem, das Module sich im Kern wie statische Klassen verhalten. Das macht den Umgang mit Modulen logischer, da man in anderen Sprachen ein wenig anders mit Modulen umgeht (Siehe B4J, Node.js, Python usw.). Und zu guter letzt sollen Module ja Namenskonflikte entgegenwirken. Da macht es recht wenig Sinn, trotz Modulen den Prozeduren einem Präfix voran zu stellen. Wenn man Module nur zur Konfliktlösung einsetzt, kann man sich dann Module auch sparen. ;)
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Module - Konventionen bei Prozedurenamen

Beitrag von DarkDragon »

UseModule ist genauso wie using namespace in C++ und da führt das auch mehr zu Problemen, insbesondere in Headern gilt es als schlechter Stil. Da in PB nicht zwingend zwischen Header und Source getrennt wird muss man immer damit rechnen inkludiert zu werden und dann hat das UseModule in der äußeren Datei Auswirkungen. Eigentlich hat es für mich daher keine Daseinsberechtigung mehr.

Btw @STARGATE, im englischen Forum hätten einige Leute gerne einen Thanks button wie in deinen Signaturbildchen (eventuell Projektbezogen?), aber ich glaube die funktionieren momentan nicht mehr, oder? https://www.purebasic.fr/english/viewto ... 81#p609181
Zuletzt geändert von DarkDragon am 14.10.2023 10:27, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Module - Konventionen bei Prozedurenamen

Beitrag von Kurzer »

Stargate hat geschrieben:Wie geht ihr damit um? Habt ihr einen Favoriten oder gar noch einen anderen Ansatz?
Ich hatte mir die Frage auch schon mal gestellt und mache es (als überzeugter Anwender der "ungarischen Notation") momentan so:
Modulname als Kürzel und auch vor allen Prozedurnamen das Kürzel gesetzt, um Namenskonfilkte zu verhindern (bei mir ging um Prozedurnamen wie OpenWindow usw., also auch PB Schlüsselwörter)

Auf dein Beispiel gemünzt würde es so aussehen:

Z.B. "pc" als Modulname und "pcLoadPicture" als Prozedurname
Verhindert zwar auch keine Doppelnennung, wenn man UseModul weglässt, aber ist nicht so viel Tipparbeit.

Code: Alles auswählen

pc::pcLoadPicture(FileName)

bzw.

pcLoadPicture(FileName)
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
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: Module - Konventionen bei Prozedurenamen

Beitrag von NicTheQuick »

Ich nutze UseModule eigentlich auch nur so wie HeXOR es bereits beschrieben hat, also vermeide es im MainScope, wo es geht, und nutze es maximal für eine Art Common-Module, das innerhalb eines anderen Modules benutzt werden soll. Im MainScope hilft UseModule meiner Meinung nach eher seltener und ist fast schon vergleichbar mit einem XIncludeFile. Der einzige grobe Unterschied ist dann ja nur noch die Trennung zwischen den Deklarationen und Definitionen.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Module - Konventionen bei Prozedurenamen

Beitrag von STARGÅTE »

Vielen dank für die Antworten.
Auch mir gefällt Lösung 1 besser also immer mit Modulname.

Auch bezüglich der Namenskonflikte gegenüber PB-Funktionen habe ich mir Gedanken gemacht und folgenden "Trick" gefunden:

Code: Alles auswählen

DeclareModule C
	
	Structure Complex
		Re.d
		Im.d
	EndStructure
	
	Declare.d Absolute(*Z_In.Complex)
	
	Macro Abs(Z) : C::Absolute(Z) : EndMacro  ; Überladen der PB Abs() Funktion durch die Modulfunktion Absolute
	
EndDeclareModule


Module C
	
	Procedure.d Absolute(*Z.Complex)
		
		ProcedureReturn Sqr(*Z\Re * *Z\Re + *Z\Im * *Z\Im)
		
	EndProcedure
	
EndModule



Define  Z.C::Complex

Z\Re = 3.0
Z\Im = 4.0

Debug C::Abs(Z) ; Ruft das Macro Abs(Z) -> C::Absolute(Z) auf.
Debug Abs(-5)   ; Bleibt unberührt, wenn kein UseModule verwendet wird.
So kann ich außen die Modul-Funktion Abs() für komplexe Zahlen nutzen ohne Konflikt mir der PB Abs() Funktion.
Einziger Nachteil ist halt, dass ich dadurch innerhalb meines Moduls diese PB-Funktion(en) nicht mehr verwenden kann.
Meint ihr das ist ok oder sollte ich diese Trickserei lieber sein lassen?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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: Module - Konventionen bei Prozedurenamen

Beitrag von NicTheQuick »

Ja, ich hatte auch schon solche Tricksereien gemacht mit Macros, aber ich erinnere mich an irgendwelche Merkwürdigkeiten, die dadurch entstanden sind. Ich komme nur nicht mehr ganz drauf. Ich versuche es mal zu finden.
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: Module - Konventionen bei Prozedurenamen

Beitrag von NicTheQuick »

Hm, alle Bugs, die ich zu Modulen mal gemeldet hatte, scheinen gelöst zu sein. Und die hatten auch nichts mit Macros, sondern mit Strukturen zu tun. Also hab ich mich vielleicht geirrt.
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Module - Konventionen bei Prozedurenamen

Beitrag von TroaX »

Ich frage mich bei solchen Tricksereien immer, ob eine andere Prozeduren-Bezeichnung nicht sinnvoller wäre. Ich mein die PB internen Prozeduren sind ja dokumentiert. Es mag ja durchaus sein, das man dem Drang nicht widerstehen kann, eine bereits existierende Prozedur durch eine eigene Implementierung ersetzen möchte. Aber ich persönlich nenne sie nicht genauso. Man verfolgt ja immer ein Ziel mit der eigenen Implementierung. Für eine erweierte Variante kann man Ex hinterhängen. Eine optimierte Variante würde ein Opt bekommen. Ich würde hier also, anstatt eine Prozedur Abs zu nennen, sie AbsOpt nennen.

Aber ich mag auch solche Hacks einfach nicht.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Antworten