Projekt

Allgemein

Profil

Herunterladen (6,08 KB) Statistiken
| Zweig: | Markierung: | Revision:
d319704a Moritz Bunkus
Lx-Office Style Guide
---------------------

4c24a5f4 Sven Schöling
Die folgenden Regeln haben das Ziel, den Code möglichst gut les- und wartbar
zu machen. Dazu gehört zum Einen, dass der Code einheitlich eingerückt ist,
d319704a Moritz Bunkus
aber auch, dass Mehrdeutigkeit so weit es geht vermieden wird (Stichworte
"Klammern" oder "Hash-Keys").

Diese Regeln sind keine Schikane, sondern erleichtern allen das Leben!

4c24a5f4 Sven Schöling
Jeder, der einen Patch schickt, sollte seinen Code vorher überprüfen.
Einige der Regeln lassen sich automatisch überprüfen, andere nicht.
d319704a Moritz Bunkus
--------------------------------------------------------------------------

2dacd279 Sven Schöling
1. Es werden keine echten iTabs sondern Leerzeichen verwendet.
d319704a Moritz Bunkus
4c24a5f4 Sven Schöling
2. Die Einrückung beträgt zwei Leerzeichen.
d319704a Moritz Bunkus
Beispiel:

2dacd279 Sven Schöling
foreach my $row (@data) {
if ($flag) {
# do something with $row
}

if ($use_modules) {
$row->{modules} = MODULE->retrieve(
id => $row->{id},
date => $use_now ? localtime() : $row->{time},
);
}

$report->add($row);
d319704a Moritz Bunkus
}

2dacd279 Sven Schöling
4c24a5f4 Sven Schöling
3. Öffnende geschweifte Klammern befinden sich auf der gleichen Zeile wie
d319704a Moritz Bunkus
der letzte Befehl.
Beispiele:

sub debug {
8cc37098 Sven Schöling
...
d319704a Moritz Bunkus
}

oder

d629acd8 Sven Schöling
if ($form->{item_rows} > 0) {
d319704a Moritz Bunkus
...
}

4c24a5f4 Sven Schöling
4. Schließende geschweifte Klammern sind so weit eingerückt wie der Befehl/
die öffnende schließende Klammer, die den Block gestartet hat, und nicht
d319704a Moritz Bunkus
auf der Ebene des Inhalts. Die gleichen Beispiele wie bei 3. gelten.

4c24a5f4 Sven Schöling
5. Die Wörter "else" "elsif", "while" befinden sich auf der gleichen
Zeile wie schließende geschweifte Klammern.
d319704a Moritz Bunkus
Beispiele:

8cc37098 Sven Schöling
if ($form->{sum} > 1000) {
d319704a Moritz Bunkus
...
8cc37098 Sven Schöling
} elsif ($form->{sum} > 0) {
d319704a Moritz Bunkus
...
} else {
...
}

do {
...
2dacd279 Sven Schöling
} until ($a > 0);
d319704a Moritz Bunkus
4c24a5f4 Sven Schöling
6. Parameter von Funktionsaufrufen müssen mit runden Klammern versehen
2dacd279 Sven Schöling
werden. Davon nicht betroffen sind interne perl Funktionen,
4c24a5f4 Sven Schöling
und grep ähnliche Operatoren.
d319704a Moritz Bunkus
Beispiel:

8cc37098 Sven Schöling
$main::lxdebug->message("Could not find file.");
%options = map { $_ => 1 } grep { !/^#/ } @config_file;
d319704a Moritz Bunkus
4c24a5f4 Sven Schöling
7. Verschiedene Klammern, Ihre Ausdrücke und Leerzeichen:
d319704a Moritz Bunkus
8cc37098 Sven Schöling
Generell gilt: Hashkeys und Arrayindices sollten _nicht_ durch Leerzeichen
4c24a5f4 Sven Schöling
abgesetzt werden. Logische Klammerungen ebensowenig, Blöcke schon.
d319704a Moritz Bunkus

8cc37098 Sven Schöling
Beispiel:
d319704a Moritz Bunkus
8cc37098 Sven Schöling
if (($form->{debug} == 1) && ($form->{sum} - 100 < 0)) {
...
}
d319704a Moritz Bunkus
8cc37098 Sven Schöling
$array[$i + 1] = 4;
$form->{sum} += $form->{"row_$i"};
$form->{ $form->{index} } += 1;
d319704a Moritz Bunkus
8cc37098 Sven Schöling
map { $form->{sum} += $form->{"row_$_"} } 1..$rowcount;
d319704a Moritz Bunkus
8. Mehrzeilige Befehle

8.1 Werden die Parameter eines Funktionsaufrufes auf mehrere Zeilen
4c24a5f4 Sven Schöling
aufgeteilt, so sollten diese bis zu der Spalte eingerückt werden,
d319704a Moritz Bunkus
in der die ersten Funktionsparameter in der ersten Zeile stehen.
Beispiel:

$sth = $dbh->prepare("SELECT * FROM some_table WHERE col = ?",
8cc37098 Sven Schöling
$form->{some_col_value});

4c24a5f4 Sven Schöling
8.3 Ein Spezialfall ist der ternäre Oprator "?:", der am besten in einer
übersichtlichen Tabellenstruktur organisiert wird.
d319704a Moritz Bunkus
Beispiel:

8cc37098 Sven Schöling
my $rowcount = $form->{"row_$i"} ? $i
: $form->{oldcount} ? $form->{oldcount} + 1
: $form->{rowcount} - $form->{rowbase};
d319704a Moritz Bunkus
9. Kommentare

9.1 Kommentare, die alleine in einer Zeile stehen, sollten soweit wie der
4c24a5f4 Sven Schöling
Code eingerückt sein.
9.2 Seitliche hängende Kommentare sollten einheitlich formatiert werden.
d319704a Moritz Bunkus
4c24a5f4 Sven Schöling
9.3 Sämtliche Kommentare und Sonstiges im Quellcode ist bitte auf Englisch
zu verfassen. So wie ich keine Lust habe französischen Quelltext zu lesen,
sollte auch der Lx-Office Quelltext für nicht-Deutschsprachige lesbar sein.
8cc37098 Sven Schöling
Beispiel:

my $found = 0;
while (1) {
last if $found;
d319704a Moritz Bunkus
8cc37098 Sven Schöling
# complicated check
$found = 1 if //
}

$i = 0 # initialize $i
$n = $i; # save $i
$i *= $const; # do something crazy
$i = $n; # recover $i

4c24a5f4 Sven Schöling
10. Hashkeys sollten nur in Anführungszeichen stehen, wenn die Interpolation
gewünscht ist.
d319704a Moritz Bunkus
Beispiele:

8cc37098 Sven Schöling
$form->{sum} = 0;
d319704a Moritz Bunkus
$form->{"row_$i"} = $form->{"row_$i"} - 5;
8cc37098 Sven Schöling
$some_hash{42} = 54;
d319704a Moritz Bunkus
4c24a5f4 Sven Schöling
11. Die maximale Zeilenlänge ist nicht bescränkt. Zeilenlängen <= 79
8cc37098 Sven Schöling
helfen unter bestimmten Bedingungen, aber wenn die Lesbarkeit unter
kurzen Zeilen leidet (wie zum Biespiel in grossen Tabellen), dann
ist Lesbarkeit vorzuziehen.
d319704a Moritz Bunkus
4c24a5f4 Sven Schöling
Als Beispiel sei print_options aus bin/mozilla/io.pl angeführt.
d319704a Moritz Bunkus
4c24a5f4 Sven Schöling
12. Trailing Whitespace, d.h. Leerzeichen am Ende von Zeilen sind unerwünscht.
Sie führen zu unnötigen Whitespaceänderungen die diffs verfälschen.
8cc37098 Sven Schöling
4c24a5f4 Sven Schöling
Emacs und vim haben beide recht einfache Methoden dafür:
8cc37098 Sven Schöling
emacs kennt das Kommande nuke-trailing-whitespace,
4c24a5f4 Sven Schöling
vim macht das gleiche manuell über :%s/\s\+$//e, mit
ec63079e Sven Schöling
:au BufWritePre * :%s/\s\+$//e
wird das an speichern gebunden.
8cc37098 Sven Schöling
12. Es wird kein perltidy verwendet.
d319704a Moritz Bunkus
8cc37098 Sven Schöling
In der Vergangenheit wurde versucht perltidy zu verwenden um einen
einheitlichen Stil zu erlangen, es hat sich aber gezeigt, dass Perltidys
4c24a5f4 Sven Schöling
sehr eigenwilliges Verhaltes was Zeilenumbrüche angeht oftmals gut
formatierten Code zerstört. Für den Interessierten sind hier die perltidy
ec63079e Sven Schöling
Optionen, die grob den beschriebenen Richtlinien entsprechen.

-syn -i=2 -nt -pt=2 -sbt=2 -ci=2 -ibc -hsc -noll -nsts -nsfs -asc -dsm
-aws -bbc -bbs -bbb -mbl=1 -nsob -ce -nbl -nsbl -cti=0 -bbt=0 -bar -l=79
-lp -vt=1 -vtc=1

13. STDERR ist tabu. Unkonditionale Debugmeldungen auch.

Lx-Office bietet mit dem LXDebug Modul einen brauchbaren Trace/Debug
Mechanismus, es gibt also keinen Grund nach STDERR zu schreiben.

4c24a5f4 Sven Schöling
Die LXDebug Methode "message" nimmt als ersten Paramter außerdem eine
Flagmaske, für die die Meldung angezeigt wird, wobei "0" immer angezeigt
ec63079e Sven Schöling
wird. Sollte Meldungen sollten nicht eingecheckt werden, und werden in den
4c24a5f4 Sven Schöling
meisten Fällen auch vom Repository zurückgewiesen.
2dacd279 Sven Schöling
4c24a5f4 Sven Schöling
14. Alle neuen Module müssen use strict verwenden.
2dacd279 Sven Schöling
$form, $auth, $locale, $lxdebug, %myconfig sowie der Inhalt der lx-erp.conf
werden derzeit aus dem main package importiert. Alle anderen Konstrukte
sollten lexikalisch lokal gehalten werden.