Define vs. Protected in Prozeduren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Define vs. Protected in Prozeduren

Beitrag von mhs »

RSBasic hat geschrieben: Innerhalb einer Prozedur solltest du nicht Define nehmen, sondern Protected.
Ich würde innerhalb einer Prozedur grundsätzlich immer Define verwenden :o

Wenn eine Variable bereits als Global definiert ist wirft der Compiler einen Fehler bei einem Define des gleichen Variablennamens, bei Protected logischerweise nicht. Wenn nun aus Versehen eine Variable innerhalb der Prozedur nochmal als Protected definierst, obwohl du eigentlich auf die globale Variable zugreifen wolltest, läuft das Programm u.U. verhält sich aber nicht wie erwartet. Ich sehe das als zusätzlich Fehlerquelle und setzte Protected deswegen nur explizit dort ein, wo es auch benötigt wird.

__________________________________________________
Thread geteilt
Bresenham-Algorithmus>Define vs. Protected in Prozeduren
Code, Tipps und Tricks>Allgemein
07.02.2018
RSBasic
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
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: Bresenham-Algorithmus

Beitrag von NicTheQuick »

@mhs:
Das sehe ich anders. Protected ist solange Pflicht bis du auf eine globale Variable zugreifen willst. Aber dann musst du sie ja eh nicht mehr neu deklarieren, da das schon von Global gemacht wurde. Und wenn du eine Prozedur schreibst mit Variablen, die nicht Protected sind, und du später eine globale Variable einführst, die zufällig genauso heißt, du aber nicht dran denkst, dann hast du auch schon deinen Salat. Und auch wenn du Codes miteinander tauschst, im Forum veröffentlichst oder ähnliches, sollte da ebenfalls immer mit Protected gearbeitet werden.
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Bresenham-Algorithmus

Beitrag von Josh »

RSBasic hat geschrieben: [*]Innerhalb einer Prozedur solltest du nicht Define nehmen, sondern Protected.
Natürlich soll es jeder handhaben wie er will, aber für mich ist das ein ausgemachter Blödsinn, egal wie oft es im Forum geschrieben wird.

Ich will in meinen Programmen keine lokalen und globalen Variablen mit dem gleichen Namen, dies ist nur verwirrend. Die Überprüfung überlasse ich dem Compiler, weshalb es bei mir auch bei einem 'Define' innerhalb von Prozeduren bleibt.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Bresenham-Algorithmus

Beitrag von Josh »

NicTheQuick hat geschrieben:Protected ist solange Pflicht bis du auf eine globale Variable zugreifen willst. Aber dann musst du sie ja eh nicht mehr neu deklarieren, da das schon von Global gemacht wurde.
Was willst du damit sagen? Kapiere ich überhaupt nicht.
NicTheQuick hat geschrieben:Und wenn du eine Prozedur schreibst mit Variablen, die nicht Protected sind, und du später eine globale Variable einführst, die zufällig genauso heißt, du aber nicht dran denkst, dann hast du auch schon deinen Salat.
Ich hatte schon oft den Eindruck, dass etliche Pb-Benutzer Compilermeldungen für etwas ganz, ganz Böses halten, das man nicht bekommen darf. Ich habe dann gar keinen Salat, sondern sehe das als einen Vorteil.
NicTheQuick hat geschrieben:Und auch wenn du Codes miteinander tauschst, im Forum veröffentlichst oder ähnliches, sollte da ebenfalls immer mit Protected gearbeitet werden.
Das Forum ist ohne Zweifel ein riesiger Fundus an Code, aber dass ein Programmierer einen Code aus dem Forum nimmt und 1:1 in seinen Code einfügen kann, bleibt wohl eine reine Wunschvorstellung. Also für mich auch kein Grund um Protected zu verwenden.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
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: Bresenham-Algorithmus

Beitrag von NicTheQuick »

Ich formuliere es mal so: Der Code muss mit EnableExplicit laufen.
Bild
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Bresenham-Algorithmus

Beitrag von #NULL »

Das lokale Variablen einen Namen bekommen der bereits ausserhalb verwendet wird ist doch ganz normal, wieviele verschiedene 'i' Variablennamen für Schleifen wollt ihr denn erfinden? Ob nun mit Define oder Protected. Define gibt einen Compiler Fehler wenn die Variable bereits Global, was geht das aber die Prozedur an? Mit Protected ist es ihr egal. Ausserdem wenn man unbedingt keine Namen wiederverwenden will: Protected erlaubt keine Redeklarationen, Define und Global teilweise schon.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Bresenham-Algorithmus

Beitrag von RSBasic »

@mhs & @Josh
Es geht hier darum, um unnötige Fehler zu vermeiden.
Vor dem Definieren einer Variable muss man natürlich wissen, ob man eine lokale oder globale Variable erstellen möchte. Wenn man eine Variable definieren möchte, die nur innerhalb der Prozedur gültig und verfügbar sein soll, dann soll man diese auch korrekt definieren, also mit Protected. Define in Prozeduren ist das falsche Schlüsselwort.
Josh hat geschrieben:egal wie oft es im Forum geschrieben wird.
Die PB-Hilfe ist deiner Meinung nach auch falsch? Genauso wie die festgelegten Regeln bei anderen Programmiersprachen? Und Fred und freak (Entwickler von PB) machen es auch falsch?

Hier ein paar Zitate aus der PB-Hilfe:
Für den Fall, dass Sie in einer Prozedur 'lokale' Variablen, die den gleichen Namen wie globale Variablen haben, verwenden möchten, schauen Sie sich die Schlüsselworte Protected und Static an.
Protected ("geschützt") ermöglicht den Zugriff auf eine Variable nur innerhalb einer Prozedur, auch wenn die gleiche Variable im Hauptprogramm bereits als Global deklariert wurde.
Neben Static können Sie auch das Schlüsselwort Protected verwenden, um globale von lokalen Variablen zu trennen. Mit Protected behalten die lokalen Variablen jedoch nicht ihren Wert.
[...]

Es gibt nicht ohne Grund das Schlüsselwort Protected. Wenn es Regeln gibt, muss man diese auch anwenden. Sonst kann niemals ein sauberer Code entstehen.
Josh hat geschrieben:Ich will in meinen Programmen keine lokalen und globalen Variablen mit dem gleichen Namen
Okay, aber das heißt noch lange nicht, dass andere Programmierer genauso schreiben wie du.
Außerdem wirst du beispielsweise bei Schleifen immer das Problem haben. Du hast Variablen wie i, x, y, z u.ä. Benennst du diese Hilfsvariablen immer einzigartig? Was ist, wenn du Codes aus anderen Projekten wiederverwenden möchtest? Da musst du jedes Mal darauf achten, um Namenskonflikte zu vermeiden.
Josh hat geschrieben:weshalb es bei mir auch bei einem 'Define' innerhalb von Prozeduren bleibt.
Natürlich kannst du Define verwenden, ist aber trotzdem nicht korrekt, nur weil es bis jetzt funktioniert. Und wenn irgendwann bei einer neuen PB-Version eine Einschränkung kommt, dass Define in Prozeduren nicht mehr erlaubt sind, dann musst du natürlich anpassen. Dann lieber gleich richtig machen und anwenden.

Nenn mir bitte eine Quelle, die deine Sichtweise bestätigt.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Bresenham-Algorithmus

Beitrag von Josh »

#NULL hat geschrieben:Das lokale Variablen einen Namen bekommen der bereits ausserhalb verwendet wird ist doch ganz normal, wieviele verschiedene 'i' Variablennamen für Schleifen wollt ihr denn erfinden? Ob nun mit Define oder Protected. Define gibt einen Compiler Fehler wenn die Variable bereits Global, was geht das aber die Prozedur an? Mit Protected ist es ihr egal. Ausserdem wenn man unbedingt keine Namen wiederverwenden will: Protected erlaubt keine Redeklarationen, Define und Global teilweise schon.
Dieses 'i' ist genau eines der Horrorszenarien, wenn ich den gleichen Variablenbezeichner lokal und global verwende. Das mache ich grundsätzlich nicht und der Compiler hilft mir dabei.

Verwende ich aber 'i' global und lokal und du vergisst in einer Prozedur dein 'Protected i', dann hast du den Schlamassel fertig. Da nützt dir kein 'EnableExplicit' was, deine Prozedur verwendet ungeniert dein globales 'i'. Viel Spass bei der Fehlersuche.
RSBasic hat geschrieben:Es geht hier darum, um unnötige Fehler zu vermeiden.
Bingo, genau darum geht es. Deshalb verwende ich auch 'Define'
RSBasic hat geschrieben:Define in Prozeduren ist das falsche Schlüsselwort.
Nenn mir bitte eine Quelle, die deine Sichtweise bestätigt. Aber bitte nicht deine unten angeführten Zitate, denn da sagt keine was aus, dass Define in Prozeduren falsch ist.
RSBasic hat geschrieben:Und Fred und freak (Entwickler von PB) machen es auch falsch?
Deshalb habe ich auch in meinem Eingangsposting geschrieben, dass es jeder handhaben soll wie er will. Definitiv falsch ist es auf jeden Fall, 'Define' in Prozeduren als Fehler darzustellen.
RSBasic hat geschrieben:Die PB-Hilfe ist deiner Meinung nach auch falsch?
Hier ein paar Zitate aus der PB-Hilfe:
Für den Fall, dass Sie in einer Prozedur 'lokale' Variablen, die den gleichen Namen wie globale Variablen haben, verwenden möchten, schauen Sie sich die Schlüsselworte Protected und Static an.
Protected ("geschützt") ermöglicht den Zugriff auf eine Variable nur innerhalb einer Prozedur, auch wenn die gleiche Variable im Hauptprogramm bereits als Global deklariert wurde.
Neben Static können Sie auch das Schlüsselwort Protected verwenden, um globale von lokalen Variablen zu trennen. Mit Protected behalten die lokalen Variablen jedoch nicht ihren Wert.
[...]
Deine Zitate sind wohl ein Eigentor. Da steht definitiv nirgends, dass 'Define' in Strukturen falsch sind. Du interpretierst dir da was raus, was definitiv nirgends steht. Da steht:
- Für den Fall, dass ...
- Protected ("geschützt") ermöglicht ...
- gar nichts, was 'Define' betrifft
RSBasic hat geschrieben:Es gibt nicht ohne Grund das Schlüsselwort Protected. Wenn es Regeln gibt, muss man diese auch anwenden. Sonst kann niemals ein sauberer Code entstehen.
Sicher gibt es das Schlüsselwort 'Protected' nicht ohne Grund, aber das heißt noch lange nicht, dass 'Define' falsch ist. Nenn mir bitte eine Quelle, die deine Sichtweise bestätigt.
RSBasic hat geschrieben:
Josh hat geschrieben:Ich will in meinen Programmen keine lokalen und globalen Variablen mit dem gleichen Namen
Okay, aber das heißt noch lange nicht, dass andere Programmierer genauso schreiben wie du.
Auch wenn ich mich wiederhole, muss ich auf mein Eingangsposting verweisen, wo ich ausdrücklich schreibe, dass jeder es handhaben soll wie er will. Das heißt aber noch lange nicht, dass andere Programmierer so schreiben müssen wie DU.
RSBasic hat geschrieben:Außerdem wirst du beispielsweise bei Schleifen immer das Problem haben. Du hast Variablen wie i, x, y, z u.ä. Benennst du diese Hilfsvariablen immer einzigartig? Was ist, wenn du Codes aus anderen Projekten wiederverwenden möchtest? Da musst du jedes Mal darauf achten, um Namenskonflikte zu vermeiden.
Warum sollte ich mit Schleifen ein Problem haben und warum sollte ich diese Hilfsvariablen immer einzigartig benennen? Kann es sein, dass du das 'Define' in Prozeduren nicht verstanden hast? Irgendwie habe ich langsam diesen Eindruck.

i, j, k werden selbstverständlich in jeder Prozedur definiert wenn ich sie brauche. Sollte ich die Schleifenvariablen mal global brauchen, würde ich ihnen einen anderen Namen verpassen. Dazu habe ich aber weiter oben als Antwort aus #Null's Beitrag schon geschrieben. Wenn ich Codefragmente aus anderen Projekten verwende, dann müssen die ohnehin angepasst werden (ist eine Arbeit von Sekunden). Bei Verwendung von ganzen Pb-Files hatte ich auf jeden Fall noch nie Probleme.
RSBasic hat geschrieben:
Josh hat geschrieben:weshalb es bei mir auch bei einem 'Define' innerhalb von Prozeduren bleibt.
Natürlich kannst du Define verwenden, ist aber trotzdem nicht korrekt, nur weil es bis jetzt funktioniert. Und wenn irgendwann bei einer neuen PB-Version eine Einschränkung kommt, dass Define in Prozeduren nicht mehr erlaubt sind, dann musst du natürlich anpassen. Dann lieber gleich richtig machen und anwenden.
Nenn mir bitte eine Quelle, die deine Sichtweise bestätigt, dass Define nicht korrekt ist. Bis jetzt hast du mir nur Textstellen gezeigt, wo du dies fälschlicherweise herausinterpretierst. Sorry RS, aber kommst du dir mit dem Argument, dass 'Define' in Prozeduren in Zukunft nicht mehr erlaubt sein soll nicht ein bisschen blöd vor? Dieses Argument ist einfach nichts als lächerlich.
RSBasic hat geschrieben:Nenn mir bitte eine Quelle, die deine Sichtweise bestätigt.
Ich habe es oben schon einige male erwähnt, aber nenne du mir bitte eine Quelle, die DEINE Sichtweise bestätigt. Bis jetzt hast du gar nichts gebracht.

Abschließend möchte ich nochmals sagen, dass es jeder handhaben soll wie er will, aber es einfach falsch zu behaupten, dass Define in Prozeduren falsch sei, außer jemand hat wirklich angst vor diesen bösen, bösen Kompilermeldungen.


@diceman
Sorry dass dein Beitrag so zweckentfremdet verwendet wird ^^
Zuletzt geändert von Josh am 07.02.2018 18:03, insgesamt 2-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Define vs. Protected

Beitrag von RSBasic »

Josh hat geschrieben:@diceman
Sorry dass dein Beitrag so zweckentfremdet verwendet wird ^^
Ich habs abgeschnitten.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Bresenham-Algorithmus

Beitrag von #NULL »

Josh hat geschrieben:Verwende ich aber 'i' global und lokal und du vergisst in einer Prozedur dein 'Protected i', dann hast du den Schlamassel fertig. Da nützt dir kein 'EnableExplicit' was, deine Prozedur verwendet ungeniert dein globales 'i'. Viel Spass bei der Fehlersuche.
Naja, ob du dann 'Define' oder 'Protected vergisst macht aber keinen Unterschied.
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten