Seite 1 von 2

Quellcode strukturieren

Verfasst: 13.04.2011 12:44
von Renovatio
Mit diesem Thema möchte ich mal das kritisieren an meinen Quellcodes angehen.

Inzwischen wirklich bei jedem mal wenn ich euch um eure Unterstützung bei einem Fehler/einer Optimierung bitte, bekomme ich sehr oft "Wie Du programmierst, kann das nichts werden" oder auch "Dein Stil ist komisch" zu hören bzw. zu lesen.

Alles was ich mir beigebracht habe, oder eben durch euch gelernt habe, verwende ich so.
So habe ich auch unter PureArea und verschiedenen Beispielcodes hier im Forum mir einiges "abgekupfert".

Nun zu meiner "Quellcode-Struktur".

- Ich verwende sehr oft nur 1 Quellcode, damit ich alles in einem Quellcode habe/bearbeiten kann
- Außerdem verwende ich meistens Prozeduren allgmein, soll bedeuten das ich für ALLES Prozeduren verwende
(Gibt mir das Gefühl meine Prozeduren übersichtlicher bzw meinen Quellcode übersichtlicher zu halten)
- If ElseIf EndIf und Select EndSelect verwende ich aus Beispielcodes vom PB-Board, PureArea und aus der Hilfe
(Bekomme dann doch immer öfter zu hören "Vergiß den Quatsch mit If usw." Hö? Steht das nicht anders in der Hilfe?)
- Ich bin gerade dabei mich mit XIncludeFile anzufreunden wobei ich schon beim ersten Anlauf feststellen musste das bei mir die Programme dann nicht mehr wie gewünscht funktionieren

Nun mal eure Meinungen dazu.
Was MUSS man beachten, habe dazu noch kein Standard gefunden.
Ist eine Auslagerung von Quellcode in *.pbi wirklich immer sinnvoll?
Was sollte in Prozeduren, was weniger?


Nun hoffe ich das mich jemand eines besseren belehrt und mir aufzeigen kann wieso das alles oder größtenteils so falsch sein soll wie ich programmiere.


Gruß

Renovatio

Re: Quellcode strukturieren

Verfasst: 13.04.2011 13:25
von c4s
Wenn du selber (noch!) nicht das Bedürfnis hast deinen Code in Includes aufzuteilen, als Projekt zu verwalten & Co., sehe ich keinen Grund, dich damit befassen zu müssen.
Ich denke jeder muss für sich selbst merken, dass es "so" nicht mehr funktioniert und dann entsprechend handeln...

Re: Quellcode strukturieren

Verfasst: 13.04.2011 13:30
von Sunny
Ich hab mir mal kurz einen Code von dir aus dem Forum rausgepickt und zwar diesen hier:

Code: Alles auswählen

Repeat
Event = WaitWindowEvent()
If Event
X = WindowMouseX(#WinMain)
Y = WindowMouseY(#WinMain)
  If (oldx<>X) Or (oldy<>Y)
  If gadgetcheck(X,Y,#GadgetBtnAreaStart)
   SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaStart))
   SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaStartHover))
  Else
   SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaNoHelp))
   SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaStart))
  EndIf
  EndIf
EndIf
Diesen nehme ich jetzt mal als kleines Beispiel für ein paar anmerkungen.
1. Auch wenn du hier im Forum nur Auszüge deines Codes postest solltest du Sie vorher so bearbeiten, dass sie von anderen Usern kopiert und gleich Kompiliert werden können
2. Deine Einrückung ist ziemlich unübersichtlich, mal nimmst du dafür ein Leerzeichen und dann mal wieder nen Tab... ich würde dir empfehlen es beim Tab zu belassen.
3. Du musst nicht in jede Zeile Code reinschreiben... es ist ganz nützlich, wenn man auch mal ne Zeile frei lässt

Hier mal ein Beispiel, wie der Code aussehen könnte:

Code: Alles auswählen

Repeat
  Event = WaitWindowEvent()
  
  If Event
    
    X = WindowMouseX(#WinMain)
    Y = WindowMouseY(#WinMain)
  
    If (oldx<>X) Or (oldy<>Y)
      If gadgetcheck(X,Y,#GadgetBtnAreaStart)
        SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaStart))
        SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaStartHover))
      Else
        SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaNoHelp))
        SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaStart))
      EndIf
    EndIf

  EndIf
  
Until ;Bedingung
Zum Thema Prozeduren wird die Sache ein bischen komplizierter aber übern Daumen kann man Sagen, dass Dinge wie z.B. Berechnungen, die öfter Benötigt werden in eine Prozedur rein sollten, damit man nur die Prozedur aufrufen muss, wenn sie benötigt wird.

Re: Quellcode strukturieren

Verfasst: 13.04.2011 14:17
von bobobo
Einrücken kann die IDE von alleine
Einmal Strg-A und dann Strg-I und schon isses passiert.

(Die aktuelle Zeilennummer vorher merken, weil die dabei flöten geht)

Re: Quellcode strukturieren

Verfasst: 13.04.2011 14:18
von Renovatio
So, nach bestimmt wieder 20 Minuten meines Lebens nach etwas suchen xD habe ich es dann doch gefunden.

http://forum.purebasic.com/english/view ... c&start=15

Diesen Code nutze ich seit dem ich das vor über ein Jahr mal gebraucht habe.
Ich will damit sagen, wenn jemand sagt, wie ts-soft zum Beispiel, dann kann ich nur sagen, dass der Code die ganze Zeit funktioniert hat und seinen Zweck erfüllt.

Dann zu der Einrückung, keine Ahnung wieso der Leerzeichen anzeigt, habe IMMER Tabs benutzt zum Einrücken.


Worauf sollte ich noch achten?
Also Proceduren zur Aufteilung des Quellcodes eher schlecht?
Dann doch wie oben geschrieben mit ";{" und ";}" arbeiten?


Gruß

Re: Quellcode strukturieren

Verfasst: 13.04.2011 14:20
von TomS
Ich nehm mal Sunnys Beispiel und mach es noch ein wenig übersichtlicher (imho) ;)

Code: Alles auswählen

Repeat
  Event = WaitWindowEvent()
 
  If Event
   
    X = WindowMouseX(#WinMain)
    Y = WindowMouseY(#WinMain)
 
    If (oldX <> X) Or (oldY <> Y) ;Hier Leerzeichen zwischen den Variablen und Operatoren
    
      If gadgetcheck(X, Y, #GadgetBtnAreaStart) ;Hier Leerzeichen nach jedem Komma
        SetGadgetState(#GadgetHelpArea, ImageID(#GFXHelpAreaStart)) ;Genau so wie bei allen anderen Funktionsaufrufen       
        SetGadgetState(#GadgetBtnAreaStart, ImageID(#GFXBtnAreaStartHover))

      Else
        SetGadgetState(#GadgetHelpArea, ImageID(#GFXHelpAreaNoHelp))
        SetGadgetState(#GadgetBtnAreaStart, ImageID(#GFXBtnAreaStart))
      EndIf
    EndIf

  EndIf
 
Until ;Bedingung
oldX oder OldX ist besser, als alles klein zu schreiben. Man sollte jedes Wort, oder logisches Modul groß schreiben.
Bei #GadgetBtnAreaStart hast du's ja richtig gemacht. Anstatt: #gadgetbtnareastart
Aus #GFXHelpAreaStart würde ich noch #GFX_HelpAreaStart machen.
Renovatio hat geschrieben:Dann zu der Einrückung, keine Ahnung wieso der Leerzeichen anzeigt, habe IMMER Tabs benutzt zum Einrücken.
Du kannst in den IDE Optionen einstellen, ob ein echter Tab (Chr(9)) verwendet werden soll, oder eine bestimmte Anzahl von Leerzeichen.

Re: Quellcode strukturieren

Verfasst: 13.04.2011 16:20
von NicTheQuick
Im Forum wird jedes echte Tab durch Leerzeichen ersetzt. Da kann man nichts dran ändern.

In dem Code sind aber noch ein Fehler und eine Unsinnigkeit.
Als Fehler würde ich mal bezeichnen, dass 'oldX' und 'oldY' nicht neu gesetzt werden. Falls das in 'gadgetCheck' passiert, ist es noch schlimmer. Das würde bedeuten, dass die beiden Variablen entweder global sind oder die Procedure sie 'shared'. Das wäre inkonsequent.
Als Unsinnigkeit bezeichne ich das 'If Event', denn nach 'WaitWindowEvent()' ist auf jeden Fall ein Event eingetreten und somit wird 'Event' nie 0 sein. 0 kann nur passieren, wenn man noch den optionalen 'Timeout'-Parameter verwendet oder 'WindowEvent()' nutzt.

Re: Quellcode strukturieren

Verfasst: 13.04.2011 16:41
von Sunny
@NicTheQuick
Naja, der Beispiel-Quellcode von ihm, den ich gepostet habe, endete nicht mit einem "Until" bzw "Forever" daher gehe ich mal davon aus, dass da später nochwas folgt, was er allerdings nicht ins Forum gepostet hat. Ich habe bei meinem Beispiel nur ein "Until" angehangen, damit man einen sauberen Abschluss sieht. Kann also sein, dass er einiges davon in seinem Original-Code geregelt hat.

Allerdings unterstreicht das was du geschrieben hast, die 1. Anmerkung in meinem vorherigen Beitrag.

Re: Quellcode strukturieren

Verfasst: 13.04.2011 16:53
von NicTheQuick
@Sunny:
Okay, das habe ich übersehen. :wink:

Re: Quellcode strukturieren

Verfasst: 13.04.2011 18:34
von Renovatio
Sunny hat geschrieben:@NicTheQuick
Naja, der Beispiel-Quellcode von ihm, den ich gepostet habe, endete nicht mit einem "Until" bzw "Forever" daher gehe ich mal davon aus, dass da später nochwas folgt, was er allerdings nicht ins Forum gepostet hat. Ich habe bei meinem Beispiel nur ein "Until" angehangen, damit man einen sauberen Abschluss sieht. Kann also sein, dass er einiges davon in seinem Original-Code geregelt hat.

Allerdings unterstreicht das was du geschrieben hast, die 1. Anmerkung in meinem vorherigen Beitrag.
Auf meiner Festplatte steht ganz unten:

Until Event = #PB_Event_CloseWindow

;)