Define vs. Protected in Prozeduren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Bresenham-Algorithmus

Beitrag von Josh »

#NULL hat geschrieben:
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.
Das macht einen riesen Unterschied. Wenn ich standardmäßig 'Define' verwende, gibt es keine Variablenbezeichner die lokal und global verwendet werden. Gerade bei 'i' würde mir irgendeine Prozedur anschlagen, wenn ich 'i' auch global verwenden würde. Nun, ich habe kein 'i' im globalen Bereich und wenn ich dann in einer Prozedur mein 'Define i' vergesse, dann schlägt der Compiler Alarm, bei dir würde er einfach dein globales 'i' verwenden und deine globale Schleife (sofern du halt gerade in einer bist' verändern.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Define vs. Protected in Prozeduren

Beitrag von RSBasic »

Josh hat geschrieben: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.
Josh hat geschrieben: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
Es wird zwar nicht explizit gesagt, dass Define falsch sei, aber es wird darauf hingewiesen, dass man Protected verwenden soll. Wenn Define in Ordnung wäre, dann würde folgendes stehen:
Beispieltext, der in der Hilfe stehen könnte hat geschrieben: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, Define und Static an.
Ist aber nicht der Fall und ich bezweifle, dass Fred, freak oder André das vergessen hat.
Aber man könnte gerne freak direkt fragen, wie seine Meinung ist.
Josh hat geschrieben: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.
Aber wenn es nicht ohne Grund gibt, warum sollte man Protected deiner Meinung nach nicht verwenden? Das ist so, wie wenn in PB eine Funktion gibt, die du für dein Vorhaben benötigst, aber trotzdem was ganz anderes verwendest, weil du glaubst, dass die andere Funktion, die nicht dafür gemacht wurde, zu benutzen, nur weil es damit ebenfalls funktioniert und kein Fehler entsteht?
Zum Beispiel Konstanten. Du hast ein EditorGadget und möchtest auf ReadOnly setzen. Also gibt es die Konstante #PB_Editor_ReadOnly, die du verwenden kannst. Deiner Meinung nach wäre es auch korrekt, wenn man stattdessen die Konstante #PB_FileSystem_Compressed verwendet, nur weil es damit ebenfalls funktioniert, weil der Konstantenwert derselbe ist? Da meckert PB auch nicht, ist aber trotzdem falsch.
Josh hat geschrieben:Das heißt aber noch lange nicht, dass andere Programmierer so schreiben müssen wie DU.
Ich programmiere nicht so, wie ich es gerne hätte, sondern ich beachte die Regeln, die vorgegeben sind. Das ist das A und O für eine saubere Programmierung.
Josh hat geschrieben:Wenn ich Codefragmente aus anderen Projekten verwende, dann müssen die ohnehin angepasst werden
Wenn die Codefragmente gut geschrieben sind, dann musst du überhaupt nichts anpassen, sondern nur die jeweilige Prozedur aufrufen. Aber das ist ein anderes Thema.
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:Das macht einen riesen Unterschied. Wenn ich standardmäßig 'Define' verwende, gibt es keine Variablenbezeichner die lokal und global verwendet werden. Gerade bei 'i' würde mir irgendeine Prozedur anschlagen, wenn ich 'i' auch global verwenden würde.
- Wenn es eine Globale gibt und du vergisst Define oder Protected, wird in beiden Fällen einfach die Globale verwendet.
- Wenn es keine Globale gibt und du vergisst Define oder Protected gibt's in beiden Fällen einen Fehler (mit EnableExplicit).
- Wenn es eine Globale gibt und du verwendest Define, dann musst du dir einen neuen Namen ausdenken. Mit Protected kann dir das egal sein.
- Wenn es keine Globale gibt dann ist Define oder Protected einerlei. (Das ist auch zumindest für mich der Grund gewesen warum ich oft Define verwendet habe, da es einfach schneller von der Hand geht, schätze ich)
Josh hat geschrieben:Nun, ich habe kein 'i' im globalen Bereich und wenn ich dann in einer Prozedur mein 'Define i' vergesse, dann schlägt der Compiler Alarm, bei dir würde er einfach dein globales 'i' verwenden und deine globale Schleife (sofern du halt gerade in einer bist' verändern.
Mit dem Satz stimmt was nicht. Wie soll er mein Globales 'i' verwenden, wenn ich keins habe? Ansonsten siehe Punkt 2 und 4 :)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Define vs. Protected in Prozeduren

Beitrag von Josh »

RSBasic hat geschrieben:Es wird zwar nicht explizit gesagt, dass Define falsch sei, aber es wird darauf hingewiesen, dass man Protected verwenden soll.
Jetzt musst du mir noch erklären, wo darauf hingewiesen wird, dass man Protected verwenden soll. Aber interpretiere bitte nicht wieder was aus der Hilfe, das dort gar nicht steht. Deine Zitate aus der Hilfe waren bis jetzt ja wohl ein Schuss in das eigene Knie.
RSBasic hat geschrieben:Wenn Define in Ordnung wäre, dann würde folgendes stehen:
Beispieltext, der in der Hilfe stehen könnte hat geschrieben: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, Define und Static an.
Ist aber nicht der Fall und ich bezweifle, dass Fred, freak oder André das vergessen hat.
Aber man könnte gerne freak direkt fragen, wie seine Meinung ist.
Ich könnte jetzt auch zum fabulieren anfangen und mir was zusammenreimen, was in der Hilfe stehen könnte. Mach ich aber nicht, weil ich ganze Sätze lesen und verstehen kann und nicht nur Wortfetzen, die mir gerade in den Kram passen. In diesem Satz steht eindeutig 'Für den Fall, dass Sie in einer Prozedur 'lokale' Variablen, die den gleichen Namen wie globale Variablen haben, verwenden möchten'.
RSBasic hat geschrieben:
Josh hat geschrieben: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.
Aber wenn es nicht ohne Grund gibt, warum sollte man Protected deiner Meinung nach nicht verwenden?
Sorry RS, was stimmt mit dir nicht? Liest du auch die Beiträge zu denen du was schreibst? In meinem ersten Beitrag ganz oben und noch drei weitere male (1x davon fett) habe ich geschrieben, dass es jeder handhaben soll wie er will und habe NIE gesagt, dass man 'Protected' nicht verwenden sollte. Im Gegensatz zu mir, behauptest du aber immer, dass die Verwendung von 'Define' in Prozeduren falsch ist, ohne es belegen zu können. Auf jeden Fall wiederhole ich meine Darstellung jetzt zum fünften mal, diesmal in rot und groß, in der Hoffnung, dass es jetzt hängen bleibt:

Ich möchte nochmals sagen, dass es jeder handhaben soll wie er will, aber einfach zu behaupten, dass Define in Prozeduren falsch ist, ist eben auch nicht korrekt.
RSBasic hat geschrieben:
Josh hat geschrieben:Das heißt aber noch lange nicht, dass andere Programmierer so schreiben müssen wie DU.
Ich programmiere nicht so, wie ich es gerne hätte, sondern ich beachte die Regeln, die vorgegeben sind. Das ist das A und O für eine saubere Programmierung.
Ach, du willst behaupten, dass andere nicht sauber programmieren, weil sie offizielle Befehle verwenden die dir nicht in den Kram passen? Beziehe dich nicht auf irgendwelche Regeln, die du bis jetzt nicht mal ansatzweise belegen konntest.
Zuletzt geändert von Josh am 07.02.2018 19:33, insgesamt 1-mal geändert.
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Define vs. Protected in Prozeduren

Beitrag von mhs »

Oje... da hab ich was losgetreten... :(

Der Hintergedanke warum ich Define verwende ist ganz einfach: Fehlervermeidung

Stellt euch vor ihr definiert eine globale Variable xyz und verwendet die ganz fleissig in verschiedensten Prozeduren. Nach 3, 4 Monaten müsst ihr eine Erweiterung vornehmen schaut kurz an einigen Stellen in den Quellcode, hier und da Copy & Paste in eine neue Prozedur und schreibt wie selbstverständlich und ohne groß nachzudenken Protected xyz an den Anfang der Prozedur, weil die Variable in dem kopierten Codeschnippsel vorkommt. Das Programm lässt sich einwandfrei kompilieren und läuft ggf. auch Wochenlang ohne Probleme, bis eines Tages euer Kunde mekert und euch mitteilt, dass sporadisch falsche Werte berechnet werden.

Ein ganz triviales Beispiel...

Bei mir ist der Ansatz so, dass ich eben immer Define verwende, sollte der Kompiler meckern, dass die Variable schon definiert ist, kann ich der Sache nachgehen und entscheiden ob ich an dieser Stelle auf die globable Variable zugreifen möchte, besser einen anderen Variablennamen verwende oder Protected verwende.

Ein ganz klar Fall von Auslegungssache und der jeweiligen Sichtweise. Ich denke nicht dass eine der beiden Variante verkehrt ist, nur finde ich es falsch das als "Regel" zu manifestieren, wenn es keine ist und gute Gründe für eine andere Sichtweise gibt.
NicTheQuick hat geschrieben:Ich formuliere es mal so: Der Code muss mit EnableExplicit laufen.
Voll deiner Meinung.
RSBasic hat geschrieben:...
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.
[...]
...
Tut mir leid RSBasic, aber zu zitierst die Punkte aus der Hilfeseite zu "Define" und da steht ganz klar:
Für den Fall, dass Sie in einer Prozedur 'lokale' Variablen, die den gleichen Namen wie globale Variablen haben, verwenden möchten
Es steht da weder, dass Define in Prozeduren falsch ist, noch dass Protected verwendet werden muss. Von einer Regel ist auch keine Rede. Da steht wenn man lokale und globale Variablen mit dem gleichen Namen verwenden möchte, dann soll man sich Protected/Static anschauen.

Ich verwende, so wie es auch in der Hilfe steht, immer dann Protected wenn ich den gleichen Namen verwenden möchte. Möchte ich das nicht verwende ich Define, weil mich der Kompiler dann darauf hinweist, dass bereits eine globale Variable mit dem Namen vorhanden ist.
...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?...
Innerhalb jeder Prozedur kann man natürlich i, x, etc auch als Define jedes neu mal definieren, kein Problem. Ich käme aber auch ehrlich gesagt nie auf die Idee eine "i" Variable global zu machen.

Wie Josh auch schon geschrieben hat, es gibt hier eindeutig zwei Sichtweisen und ich denke jede hat ihre Daseinsberechtigung.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
HeX0R
Beiträge: 2959
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Define vs. Protected in Prozeduren

Beitrag von HeX0R »

Ihr seid doch alle Banane, wie kann man so ein Furzthema nur so aufblähen?
Codes, in denen Defines in Prozeduren stehen, nutze ich nicht oder schreibe sie um.
Simples Copy&Paste und dieser Murks* ist behoben.

*persönliche Meinung des Autors
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Define vs. Protected in Prozeduren

Beitrag von RSBasic »

Mein letzter Beitrag in diesem Thread...
mhs hat geschrieben:Da steht wenn man lokale und globale Variablen mit dem gleichen Namen verwenden möchte, dann soll man sich Protected/Static anschauen.
Josh hat geschrieben:In diesem Satz steht eindeutig 'Für den Fall, dass Sie in einer Prozedur 'lokale' Variablen, die den gleichen Namen wie globale Variablen haben, verwenden möchten'.
Ja, ihr habt Recht. Da steht, dass man Protected verwenden soll, wenn man eine lokale und globale Variable mit dem gleichen Namen verwenden möchte. Wenn man nur eine lokale Variable innerhalb der Prozedur verwenden möchte, dann zählt diese Aussage nicht?
Josh hat geschrieben:Ach, du willst behaupten, dass andere nicht sauber programmieren, weil sie offizielle Befehle verwenden
Wo steht bitte schön, dass man Define in Prozeduren verwenden soll? -> "Beziehe dich nicht auf irgendwelche Regeln, die du bis jetzt nicht mal ansatzweise belegen konntest."
Ich konnte keine Anleitung und kein Beispielcode in der PB-Hilfe finden, in dem Define innerhalb von Prozedur verwendet wird, sondern komischerweise nur Protected oder Static oder Shared. Komisch, woran das wohl liegt? Oder ist das nur ein Zufall? :lol:
Josh hat geschrieben:Ach, du willst behaupten, dass andere nicht sauber programmieren, weil sie offizielle Befehle verwenden
#PB_FileSystem_Compressed ist auch eine offizielle Konstante. Darf ich sie für EditorGadget verwenden? Diese Logik muss ich nicht verstehen.
Nur weil es was existiert, heißt es noch lange nicht, dass man es auch falsch anwenden kann. Darum geht es mir nur. Und ja zum x. Mal, es steht in der PB-Hilfe nicht explizit, dass man Define nicht verwenden soll. Es steht aber auch nicht, dass man Define in Prozeduren verwenden soll.

Im englischen Forum gibt es bezüglich dieses Themas zwei Threads mit der Frage, welches Schlüsselwort (Define oder Protected) man verwenden sollte: Im ersten Thread wurde z.B. gefragt, ob man Define oder Protected verwenden soll, wenn es darum geht, Variablen in der Prozedur zu definieren und nicht, wenn man lokale und globale Variablen definieren möchte. Fred sagt Proteced.
Und wahrscheinlich sagst du gleich wieder: "Fred hat aber nicht gesagt, dass Define falsch ist." :freak:

Es bringt nichts. Ich bin raus. Du kannst gerne so programmieren, wie du möchtest, egal wie. Ich habe doch in meinem Beitrag im ursprünglichen Thread nur einen Tipp und keine Aufforderung gegeben:
RSBasic hat geschrieben:[...] möchte dir ein paar Tipps geben: [...]
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Define vs. Protected in Prozeduren

Beitrag von mhs »

RSBasic hat geschrieben: Im ersten Thread wurde z.B. gefragt, ob man Define oder Protected verwenden soll, wenn es darum geht, Variablen in der Prozedur zu definieren und nicht, wenn man lokale und globale Variablen definieren möchte. Fred sagt Proteced.
Und wahrscheinlich sagst du gleich wieder: "Fred hat aber nicht gesagt, dass Define falsch ist." :freak:
Nunja, genau genommen sagt er nur, dass Protected eine Prozedur portabler macht und nicht welches der beiden man verwenden sollte. Und im zweiten Thread äußert sich Fred auch nicht.

Auch für mich ist das der letzte Beitrag, wer das Beispiel als schlechen Stil empfindet, der soll gerne Protected verwenden. Ich für meinen Teil bin froh, dass PB Schlüsselwörter wie Define bietet, die z.B. C/C++ nicht haben und zur Vermeidung von logischen und teilweise schwer zu findenden Programmfehlern helfen.

Code: Alles auswählen

Declare ABC()

Global.i x, y
Define.i i

x= 3
y= 5

For i = 0 To 5
  Debug "Main Scope " + Str(i)
Next i

ABC()

Debug "Global Scope x " + Str(x)
Debug "Global Scope y " + Str(y)


Procedure ABC()

  Define.i i
  Protected.i y
  
  For i = 0 To 3
    Debug "Local Scope " + Str(i)
  Next i
  
  x = 10
  y = 2
  
  Debug "Local Protected " + Str(y)
  
EndProcedure
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: Intel Core i3-4170 CPU 3,70 GHz
8,00 GB Arbeitsspeicher
WIN 10 Pro 64 Bit Betriebssystem
Wohnort: Bremen

Re: Define vs. Protected in Prozeduren

Beitrag von Pelagio »

Eigentlich soll jeder machen was er will,
Es geht dann oder es geht eben nicht.
Bei mir selber fangen alle globalen Variablen mit einem g an (gX;gY) und alle in Proceduren laufenden Variablen mit einem p (pX, pY).
In diesem Sinne kann es mir nicht passieren das ich gleiche Variablennamen habe und auch im Lesen des Source durcheinander komme.
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.10 LTS]. :allright:
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Define vs. Protected in Prozeduren

Beitrag von diceman »

Tut mir auch Leid, daß das so ausgeartet ist. :(
Ich für meinen Teil wurde so erzogen, daß ich von niemandem erwarten kann, 1:1 übernehmbaren Code für mich zu schreiben. Ich kann nur für meinen eigenen Code verantwortlich sein, den möglichst wartbar und fehlerfrei und elegant aufzusetzen, und bin daher auch für jeden Tip dankbar, wie man das erreichen kann. Wenn ich in einem Forum um Hilfe bittet, und jemand postet ein funktionierendes Beispiel-Snippet, bleibt es immer noch meine eigene Verantwortung, den Code auch für mich funktionierend umzusetzen. "EnableExplicit" aber sollte Konsens sein, ich glaube, da sind wir uns einig. :)
Nach etwas Rumprobieren gefällt mir selbst die Global / Define-Variante jetzt doch am besten, da ich niemals auf die Idee käme doppelte Namen bei globalen und lokalen Variablen zu verwenden. Meine Laufvariablen heißen meistens a,i,x,y ("funktionelle" lokale Variablen haben natürlich deskriptive Namen) und wenn ich diese am Anfang jeder Prozedur mit Define initialisiere, bin ich auf der sicheren Seite. Und sollte ich mal versehentlich einen globalen Variablen-Namen vergeben, möchte ich sehr gerne vom Compiler darauf hingewiesen werden (was dieser bei Protected nicht tun würde).
Ansonsten muß ich sagen, gefällt mir das Forum bislang richtig gut; ich bin hochmotiviert was meine Einarbeitung in PureBasic angeht, und habe auch die Community als sehr hilfreich und freundlich erlebt. Freue mich auf weitere fruchtbare Zusammenarbeit! :)
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Antworten