2       <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 
   3    <title>4.5. Stil-Richtlinien</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="Lx-Office: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch04.html" title="Kapitel 4. Entwicklerdokumentation"><link rel="prev" href="ch04s04.html" title="4.4. Translations and languages"><link rel="next" href="ch04s06.html" title="4.6. Dokumentation erstellen"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">4.5. Stil-Richtlinien</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s04.html">Zurück</a> </td><th width="60%" align="center">Kapitel 4. Entwicklerdokumentation</th><td width="20%" align="right"> <a accesskey="n" href="ch04s06.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="4.5. Stil-Richtlinien"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="devel.style-guide"></a>4.5. Stil-Richtlinien</h2></div></div></div><p>Die folgenden Regeln haben das Ziel, den Code möglichst gut les-
 
   4       und wartbar zu machen. Dazu gehört zum Einen, dass der Code einheitlich
 
   5       eingerückt ist, aber auch, dass Mehrdeutigkeit so weit es geht vermieden
 
   6       wird (Stichworte "Klammern" oder "Hash-Keys").</p><p>Diese Regeln sind keine Schikane sondern erleichtern allen das
 
   7       Leben!</p><p>Jeder, der einen Patch schickt, sollte seinen Code vorher
 
   8       überprüfen. Einige der Regeln lassen sich automatisch überprüfen, andere
 
   9       nicht.</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>Es werden keine echten Tabs sondern Leerzeichen
 
  10           verwendet.</p></li><li class="listitem"><p>Die Einrückung beträgt zwei Leerzeichen. Beispiel:</p><pre class="programlisting">foreach my $row (@data) {
 
  12     # do something with $row
 
  16     $row->{modules} = MODULE->retrieve(
 
  17       id   => $row->{id},
 
  18       date => $use_now ? localtime() : $row->{time},
 
  22   $report->add($row);
 
  23 }</pre></li><li class="listitem"><p>Öffnende geschweifte Klammern befinden sich auf der gleichen
 
  24           Zeile wie der letzte Befehl. Beispiele:</p><pre class="programlisting">sub debug {
 
  26 }</pre><p>oder</p><pre class="programlisting">if ($form->{item_rows} > 0) {
 
  28 }</pre></li><li class="listitem"><p>Schließende geschweifte Klammern sind so weit eingerückt wie
 
  29           der Befehl / die öffnende schließende Klammer, die den Block
 
  30           gestartet hat, und nicht auf der Ebene des Inhalts. Die gleichen
 
  31           Beispiele wie bei 3. gelten.</p></li><li class="listitem"><p>Die Wörter "<code class="function">else</code>",
 
  32           "<code class="function">elsif</code>", "<code class="function">while</code>" befinden
 
  33           sich auf der gleichen Zeile wie schließende geschweifte Klammern.
 
  34           Beispiele:</p><pre class="programlisting">if ($form->{sum} > 1000) {
 
  36 } elsif ($form->{sum} > 0) {
 
  44 } until ($a > 0);</pre></li><li class="listitem"><p>Parameter von Funktionsaufrufen müssen mit runden Klammern
 
  45           versehen werden. Davon nicht betroffen sind interne Perl-Funktionen,
 
  46           und grep-ähnliche Operatoren. Beispiel:</p><pre class="programlisting">$main::lxdebug->message("Could not find file.");
 
  47 %options = map { $_ => 1 } grep { !/^#/ } @config_file;</pre></li><li class="listitem"><p>Verschiedene Klammern, Ihre Ausdrücke und Leerzeichen:</p><p>Generell gilt: Hashkeys und Arrayindices sollten nicht durch
 
  48           Leerzeichen abgesetzt werden. Logische Klammerungen ebensowenig,
 
  49           Blöcke schon. Beispiel:</p><pre class="programlisting">if (($form->{debug} == 1) && ($form->{sum} - 100 < 0)) {
 
  54 $form->{sum}              += $form->{"row_$i"};
 
  55 $form->{ $form->{index} } += 1;
 
  57 map { $form->{sum} += $form->{"row_$_"} } 1..$rowcount;</pre></li><li class="listitem"><p>Mehrzeilige Befehle</p><div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem"><p>Werden die Parameter eines Funktionsaufrufes auf mehrere
 
  58               Zeilen aufgeteilt, so sollten diese bis zu der Spalte eingerückt
 
  59               werden, in der die ersten Funktionsparameter in der ersten Zeile
 
  60               stehen. Beispiel:</p><pre class="programlisting">$sth = $dbh->prepare("SELECT * FROM some_table WHERE col = ?",
 
  61                     $form->{some_col_value});</pre></li><li class="listitem"><p>Ein Spezialfall ist der ternäre Oprator "?:", der am
 
  62               besten in einer übersichtlichen Tabellenstruktur organisiert
 
  63               wird. Beispiel:</p><pre class="programlisting">my $rowcount = $form->{"row_$i"} ? $i
 
  64              : $form->{oldcount} ? $form->{oldcount} + 1
 
  65              :                     $form->{rowcount} - $form->{rowbase};</pre></li></ol></div></li><li class="listitem"><p>Kommentare</p><div class="orderedlist"><ol class="orderedlist" type="a"><li class="listitem"><p>Kommentare, die alleine in einer Zeile stehen, sollten
 
  66               soweit wie der Code eingerückt sein.</p></li><li class="listitem"><p>Seitliche hängende Kommentare sollten einheitlich
 
  67               formatiert werden.</p></li><li class="listitem"><p>Sämtliche Kommentare und Sonstiges im Quellcode ist bitte
 
  68               auf Englisch zu verfassen. So wie ich keine Lust habe,
 
  69               französischen Quelltext zu lesen, sollte auch der Lx-Office
 
  70               Quelltext für nicht-Deutschsprachige lesbar sein.
 
  71               Beispiel:</p><pre class="programlisting">my $found = 0;
 
  79 $i  = 0        # initialize $i
 
  81 $i *= $const;  # do something crazy
 
  82 $i  = $n;      # recover $i</pre></li></ol></div></li><li class="listitem"><p>Hashkeys sollten nur in Anführungszeichen stehen, wenn die
 
  83           Interpolation gewünscht ist. Beispiel:</p><pre class="programlisting">$form->{sum}      = 0;
 
  84 $form->{"row_$i"} = $form->{"row_$i"} - 5;
 
  85 $some_hash{42}    = 54;</pre></li><li class="listitem"><p>Die maximale Zeilenlänge ist nicht beschränkt. Zeilenlängen
 
  86           unterhalb von 79 Zeichen helfen unter bestimmten Bedingungen, aber
 
  87           wenn die Lesbarkeit unter kurzen Zeilen leidet (wie zum Biespiel in
 
  88           grossen Tabellen), dann ist Lesbarkeit vorzuziehen.</p><p>Als Beispiel sei die Funktion
 
  89           <code class="function">print_options</code> aus
 
  90           <code class="filename">bin/mozilla/io.pl</code> angeführt.</p></li><li class="listitem"><p>Trailing Whitespace, d.h. Leerzeichen am Ende von Zeilen sind
 
  91           unerwünscht. Sie führen zu unnötigen Whitespaceänderungen, die diffs
 
  92           verfälschen.</p><p>Emacs und vim haben beide recht einfache Methoden zur
 
  93           Entfernung von trailing whitespace. Emacs kennt das Kommande
 
  94           <span class="command"><strong>nuke-trailing-whitespace</strong></span>, vim macht das gleiche
 
  95           manuell über <code class="literal">:%s/\s\+$//e</code> Mit <code class="literal">:au
 
  96           BufWritePre * :%s/\s\+$//e</code> wird das an Speichern
 
  97           gebunden.</p></li><li class="listitem"><p>Es wird kein <span class="command"><strong>perltidy</strong></span> verwendet.</p><p>In der Vergangenheit wurde versucht,
 
  98           <span class="command"><strong>perltidy</strong></span> zu verwenden, um einen einheitlichen
 
  99           Stil zu erlangen. Es hat sich aber gezeigt, dass
 
 100           <span class="command"><strong>perltidy</strong></span>s sehr eigenwilliges Verhalten, was
 
 101           Zeilenumbrüche angeht, oftmals gut formatierten Code zerstört. Für
 
 102           den Interessierten sind hier die
 
 103           <span class="command"><strong>perltidy</strong></span>-Optionen, die grob den beschriebenen
 
 104           Richtlinien entsprechen:</p><pre class="programlisting">-syn -i=2 -nt -pt=2 -sbt=2 -ci=2 -ibc -hsc -noll -nsts -nsfs -asc -dsm
 
 105 -aws -bbc -bbs -bbb -mbl=1 -nsob -ce -nbl -nsbl -cti=0 -bbt=0 -bar -l=79
 
 106 -lp -vt=1 -vtc=1</pre></li><li class="listitem"><p>
 
 107                   <code class="varname">STDERR</code> ist tabu. Unkonditionale
 
 108           Debugmeldungen auch.</p><p>Lx-Office bietet mit dem Modul <code class="classname">LXDebug</code>
 
 109           einen brauchbaren Trace-/Debug-Mechanismus. Es gibt also keinen
 
 110           Grund, nach <code class="varname">STDERR</code> zu schreiben.</p><p>Die <code class="classname">LXDebug</code>-Methode
 
 111           "<code class="function">message</code>" nimmt als ersten Paramter außerdem
 
 112           eine Flagmaske, für die die Meldung angezeigt wird, wobei "0" immer
 
 113           angezeigt wird. Solche Meldungen sollten nicht eingecheckt werden
 
 114           und werden in den meisten Fällen auch vom Repository
 
 115           zurückgewiesen.</p></li><li class="listitem"><p>Alle neuen Module müssen use strict verwenden.</p><p>
 
 116                   <code class="varname">$form</code>, <code class="varname">$auth</code>,
 
 117           <code class="varname">$locale</code>, <code class="varname">$lxdebug</code> und
 
 118           <code class="varname">%myconfig</code> werden derzeit aus dem main package
 
 119           importiert (siehe <a class="xref" href="ch04.html#devel.globals" title="4.1. Globale Variablen">Globale Variablen</a>. Alle anderen
 
 120           Konstrukte sollten lexikalisch lokal gehalten werden.</p></li></ol></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch04s04.html">Zurück</a> </td><td width="20%" align="center"><a accesskey="u" href="ch04.html">Nach oben</a></td><td width="40%" align="right"> <a accesskey="n" href="ch04s06.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top">4.4. Translations and languages </td><td width="20%" align="center"><a accesskey="h" href="index.html">Zum Anfang</a></td><td width="40%" align="right" valign="top"> 4.6. Dokumentation erstellen</td></tr></table></div></body></html>