Entwicklerrichtlinien/Styleguide: Unterschied zwischen den Versionen
(Qualitätssicherung) |
Kirmse (Diskussion | Beiträge) (→Styleguide: Beginn (Initialisierung)) |
||
Zeile 12: | Zeile 12: | ||
Für das einheitliche Aussehen aller delixs-Werkzeuge, folgend "Admin-Interface" genannt, wird ein Styleguide erstellt. | Für das einheitliche Aussehen aller delixs-Werkzeuge, folgend "Admin-Interface" genannt, wird ein Styleguide erstellt. | ||
'''Warum ein Styleguide?''' | |||
Es handelt sich bei Quellcodes nach heute herrschender Meinung um technische Produkte und nicht um künstlerische Artefakte. Daher sind 'abgefahrene' und individuelle Formatierungen fehl am Platze. Es ist erwünscht, dass man bei den Quelltexten von mehreren Software-Entwicklern in einem Team nicht unterscheiden kann, wer welchen Code verfasst hat. | |||
Es gibt eine weitere Argumentation, warum man soviel Wind um einen guten Stil macht. Das Boehm's Gesetz sagt, dass die Wartungskosten im Schnitt viermal größer sind als die Erstellungskosten. Das bedeutet, dass es sehr sinnvoll ist, den Code in Hinsicht Lesbarkeit zu optimieren. | |||
Noch besser ist es, wenn in Hinsicht Verständlichkeit optimiert wird. Bitte immer vergegenwärtigen: einfach zu lesen und einfach zu verstehen ist nicht unbedingt das Gleiche. | |||
Deshalb wurden für alle (Perl-)Scripte, die für dieses Projekt erstellt werden, die folgenden Festlegungen getroffen. Diese orientieren sich an der "Bibel für Perlprogrammierer", dem Buch "Perl Best Practices" von Damian Conway. Es wird aber nur ein ganz kleines Subset der Regeln dieses Buches hier herangezogen und auf Änderungen im Vergleich zu den dort angegebenen Regeln wird explizit hingewiesen. (Es ist damit kaum sinnvoll möglich, das bekannte Testmodul "Perl::Critic" einzusetzen.) | |||
In Hinblick auf die Kommentierung wird davon ausgegangen, dass eine typische Perldoc-Dokumentation erstellt wird, die aber debian-typisch als Man-Page bereitgestellt wird. | |||
=== Codelayout === | |||
==== Klammerung ==== | |||
wir klammern generell im '''K&R-Stil''': | |||
my @names = ( | |||
'schoffer', | |||
'flesch', | |||
'kirmse' | |||
) | |||
''oder'' | |||
foreach my $zeile (@zeilen) { | |||
if ($zeile ne '') { | |||
print $zeile; | |||
} | |||
} | |||
==== Schlüsselwörter ==== | |||
Schlüsselwörter bei Kontrollstrukturen sollen klar erkennbar sein und nicht fälschlich als Funktionsaufrufe interpretiert werden können. Zwischen Schlüsselwörtern und den Klammern schreiben sie unbedingt Leerzeichen wie in den zwei gerade angegebenen Beispielen. | |||
Im Gegensatz dazu: bei Unterroutinen und Variablennamen schreiben Sie die Klammern direkt hinter diese Bezeichner. | |||
my $password = &get_password($datei); | |||
''oder'' | |||
my $element = $hash[2]{$nummer}; | |||
==== Operatoren ==== | |||
Nutzen Sie (ein) Leerzeichen, um binäre Operatoren von den Operanden abzuheben. | |||
my $tage = time / 3600 / 24; | |||
==== Einrückung ==== | |||
Verwenden Sie 2 Leerzeichen für eine Einrückungsebene ''Anm.: Conway - 4 Lerrzeichen'' | |||
while ($zeile = <DATEI>) { | |||
if ($zeile ne '') { | |||
($erstes_element) = split ',', $zeile; | |||
print $erstes_element, "\n"; | |||
} | |||
} | |||
==== Blöcke ==== | |||
Geben Sie niemals 2 Anweisungen in der gleichen Zeile ein | |||
if ($a > $b) { # tauschen von $a und $b | |||
$c = $b; | |||
$b = $a; | |||
$a = $c; | |||
} | |||
==== Else-Konstrukte ==== | |||
"Herzen" Sie das <code>else</code> nicht. Das bedeutet, das Folgendes '''NICHT''' in einer Zeile stehen soll: | |||
} else { | |||
sondern schreiben Sie es wie in dem folgenden Beispiel: | |||
if ($a > $b) { | |||
print "$a ist größer als $b \n"; | |||
} | |||
else { | |||
print "$a ist nicht größer als $b \n"; | |||
} | |||
=== Namenskonventionen === | |||
==== Namen für Variablen ==== | |||
folgende Bildungsvorschrift liefert verständliche Bezeichner: | |||
variable -> [adjektiv_]* substantiv | |||
Beispiele: <code>$naechster_client, $letzter_zeitpunkt, $aktueller_aufruf</code> | |||
Ein besonderer Fall sind Hashs und Arrays für Lookup-Tabellen. Hier ist folgende Bildungsvorschrift zu empfehlen: | |||
lookup_variable -> [adjektiv_]* nomen präposition | |||
Beispiele: <code>%titel_von, %ISBN_fuer</code> | |||
Das liest sich dann im Quelltext so: | |||
foreach my $buch (@katalog) { | |||
print "Buch: $titel_von{$buch} - ISBN: $ISBN_fuer{$buch} \n"; | |||
} | |||
==== Namen für Subroutinen und Methoden ==== | |||
Vorschlag für Bildungvorschrift | |||
routine -> imperatives_verb [_adjektiv]? _nomen | |||
Beispiele: <code>&lies_datensatz, &generiere_profil, &schreibe_aktuellen_zaehler</code> | |||
==== Boolsche Variablen bzw. Routinen ==== | |||
Diese Variablen und Routinen sollten (als Sonderfall) nach ihren Test benannt werden. | |||
Beispiele: <code>&ist_gueltig, $hat_fehlerhaften_datensatz_gefunden</code> | |||
if (&ist_gueltig($naechster_datensatz)) { | |||
# ... | |||
} | |||
else { | |||
$hat_fehlerhaften_datensatz_gefunden = 1; | |||
} | |||
==== Referenzvariablen ==== | |||
Um sofort erkennen zu können, dass eine skalare Variable eine Referenz ist, sollte das Kürzel _ref angehangen werden. | |||
$opts_ref, $user_ref ... | |||
sub demo { | |||
my $parameter_ref = shift; | |||
my %parameter = %{$parameter_ref}; | |||
# ... | |||
} | |||
==== Hashs und Arrays ==== | |||
Benennen Sie ('''normalerweise''') Hashs in der Einzahl und Arrays in der Mehrzahl. Bei Hash ist es häufig noch besser lesar, wenn dem singulären Nomen eine Präposition folgt. | |||
Beispiele: <code>%titel, %titel_von, %option, @ereignisse, @pcs ...</code> | |||
==== Unterstriche ==== | |||
Im Englischen werden Namen, die aus mehreren Wörtern bestehen, durch Bindestiche oder durch Leerzeichen "verbunden". z.B. "input stream", "double-click" | |||
Da dies in Perl keine gültigen Bezeichner ergibt, ist nächstbeste Alternative der Unterstrich, wie sie in den vorangegangenen Beispielen verwendet wurden. | |||
Die <code>AlternativeMitEingestreutenGrossbuchstaben</code> ist nicht so gut lesbar. | |||
==== Gross- bzw. Kleinschreibung ==== | |||
Verwenden Sie | |||
* verwenden Sie '''nur''' Kleinbuchstaben für Variablen, Subroutinen und Methoden. | |||
* verwenden Sie die gemischte Gross- und Kleinschreibweise für Namen von Paketen und Klassen (z.B. Delixs::LDAP) | |||
* Verwenden Sie Grossbuchstaben für Filehandle und Konstanten (z.B. DATEI, MAX_ANZAHL, LEERZEICHEN) | |||
==== Utility-Routinen ==== | |||
Stellen Sie Routinen, die nur für den internen Gebrauch bestimmt sind, einen Unterstrich voran | |||
Beispiel: <code>&_finde_groesste_uid</code> | |||
Da diese Hilfsfunktion nicht exportiert wird (besser: werden sollte), fällt der Bezeichner mit den Unterstrich am Anfang im Hauptprogramm doch hoffentlich auf. ;) | |||
=== Kontrollstrukturen === | |||
Verwenden sie bei Schleifen benannte Iteratoren, nicht <code>$_</code> | |||
== Qualitätssicherung == | == Qualitätssicherung == |
Version vom 1. Mai 2008, 12:47 Uhr
Diese Seite sollte nochmals überarbeitet werden. Eine Begründung befindet sich in der Regel unter Diskussion (oben). |
Leben mit Debian: Die Entwickler Richtlinien
Alles was programmiert wird, soll sich an diese Richtlinien halten. Einige Dinge wie die Paketerstellung & -verwaltung, sowie die Konfiguration des Installers müssen sich auch an die "Debian Policy" halten.
Styleguide
Für das einheitliche Aussehen aller delixs-Werkzeuge, folgend "Admin-Interface" genannt, wird ein Styleguide erstellt.
Warum ein Styleguide?
Es handelt sich bei Quellcodes nach heute herrschender Meinung um technische Produkte und nicht um künstlerische Artefakte. Daher sind 'abgefahrene' und individuelle Formatierungen fehl am Platze. Es ist erwünscht, dass man bei den Quelltexten von mehreren Software-Entwicklern in einem Team nicht unterscheiden kann, wer welchen Code verfasst hat.
Es gibt eine weitere Argumentation, warum man soviel Wind um einen guten Stil macht. Das Boehm's Gesetz sagt, dass die Wartungskosten im Schnitt viermal größer sind als die Erstellungskosten. Das bedeutet, dass es sehr sinnvoll ist, den Code in Hinsicht Lesbarkeit zu optimieren.
Noch besser ist es, wenn in Hinsicht Verständlichkeit optimiert wird. Bitte immer vergegenwärtigen: einfach zu lesen und einfach zu verstehen ist nicht unbedingt das Gleiche.
Deshalb wurden für alle (Perl-)Scripte, die für dieses Projekt erstellt werden, die folgenden Festlegungen getroffen. Diese orientieren sich an der "Bibel für Perlprogrammierer", dem Buch "Perl Best Practices" von Damian Conway. Es wird aber nur ein ganz kleines Subset der Regeln dieses Buches hier herangezogen und auf Änderungen im Vergleich zu den dort angegebenen Regeln wird explizit hingewiesen. (Es ist damit kaum sinnvoll möglich, das bekannte Testmodul "Perl::Critic" einzusetzen.) In Hinblick auf die Kommentierung wird davon ausgegangen, dass eine typische Perldoc-Dokumentation erstellt wird, die aber debian-typisch als Man-Page bereitgestellt wird.
Codelayout
Klammerung
wir klammern generell im K&R-Stil:
my @names = ( 'schoffer', 'flesch', 'kirmse' )
oder
foreach my $zeile (@zeilen) { if ($zeile ne ) { print $zeile; } }
Schlüsselwörter
Schlüsselwörter bei Kontrollstrukturen sollen klar erkennbar sein und nicht fälschlich als Funktionsaufrufe interpretiert werden können. Zwischen Schlüsselwörtern und den Klammern schreiben sie unbedingt Leerzeichen wie in den zwei gerade angegebenen Beispielen.
Im Gegensatz dazu: bei Unterroutinen und Variablennamen schreiben Sie die Klammern direkt hinter diese Bezeichner.
my $password = &get_password($datei);
oder
my $element = $hash[2]{$nummer};
Operatoren
Nutzen Sie (ein) Leerzeichen, um binäre Operatoren von den Operanden abzuheben.
my $tage = time / 3600 / 24;
Einrückung
Verwenden Sie 2 Leerzeichen für eine Einrückungsebene Anm.: Conway - 4 Lerrzeichen
while ($zeile = <DATEI>) { if ($zeile ne ) { ($erstes_element) = split ',', $zeile; print $erstes_element, "\n"; } }
Blöcke
Geben Sie niemals 2 Anweisungen in der gleichen Zeile ein
if ($a > $b) { # tauschen von $a und $b $c = $b; $b = $a; $a = $c; }
Else-Konstrukte
"Herzen" Sie das else
nicht. Das bedeutet, das Folgendes NICHT in einer Zeile stehen soll:
} else {
sondern schreiben Sie es wie in dem folgenden Beispiel:
if ($a > $b) { print "$a ist größer als $b \n"; } else { print "$a ist nicht größer als $b \n"; }
Namenskonventionen
Namen für Variablen
folgende Bildungsvorschrift liefert verständliche Bezeichner:
variable -> [adjektiv_]* substantiv
Beispiele: $naechster_client, $letzter_zeitpunkt, $aktueller_aufruf
Ein besonderer Fall sind Hashs und Arrays für Lookup-Tabellen. Hier ist folgende Bildungsvorschrift zu empfehlen:
lookup_variable -> [adjektiv_]* nomen präposition
Beispiele: %titel_von, %ISBN_fuer
Das liest sich dann im Quelltext so:
foreach my $buch (@katalog) { print "Buch: $titel_von{$buch} - ISBN: $ISBN_fuer{$buch} \n"; }
Namen für Subroutinen und Methoden
Vorschlag für Bildungvorschrift
routine -> imperatives_verb [_adjektiv]? _nomen
Beispiele: &lies_datensatz, &generiere_profil, &schreibe_aktuellen_zaehler
Boolsche Variablen bzw. Routinen
Diese Variablen und Routinen sollten (als Sonderfall) nach ihren Test benannt werden.
Beispiele: &ist_gueltig, $hat_fehlerhaften_datensatz_gefunden
if (&ist_gueltig($naechster_datensatz)) { # ... } else { $hat_fehlerhaften_datensatz_gefunden = 1; }
Referenzvariablen
Um sofort erkennen zu können, dass eine skalare Variable eine Referenz ist, sollte das Kürzel _ref angehangen werden.
$opts_ref, $user_ref ...
sub demo { my $parameter_ref = shift; my %parameter = %{$parameter_ref}; # ... }
Hashs und Arrays
Benennen Sie (normalerweise) Hashs in der Einzahl und Arrays in der Mehrzahl. Bei Hash ist es häufig noch besser lesar, wenn dem singulären Nomen eine Präposition folgt.
Beispiele: %titel, %titel_von, %option, @ereignisse, @pcs ...
Unterstriche
Im Englischen werden Namen, die aus mehreren Wörtern bestehen, durch Bindestiche oder durch Leerzeichen "verbunden". z.B. "input stream", "double-click"
Da dies in Perl keine gültigen Bezeichner ergibt, ist nächstbeste Alternative der Unterstrich, wie sie in den vorangegangenen Beispielen verwendet wurden.
Die AlternativeMitEingestreutenGrossbuchstaben
ist nicht so gut lesbar.
Gross- bzw. Kleinschreibung
Verwenden Sie
- verwenden Sie nur Kleinbuchstaben für Variablen, Subroutinen und Methoden.
- verwenden Sie die gemischte Gross- und Kleinschreibweise für Namen von Paketen und Klassen (z.B. Delixs::LDAP)
- Verwenden Sie Grossbuchstaben für Filehandle und Konstanten (z.B. DATEI, MAX_ANZAHL, LEERZEICHEN)
Utility-Routinen
Stellen Sie Routinen, die nur für den internen Gebrauch bestimmt sind, einen Unterstrich voran
Beispiel: &_finde_groesste_uid
Da diese Hilfsfunktion nicht exportiert wird (besser: werden sollte), fällt der Bezeichner mit den Unterstrich am Anfang im Hauptprogramm doch hoffentlich auf. ;)
Kontrollstrukturen
Verwenden sie bei Schleifen benannte Iteratoren, nicht $_
Qualitätssicherung
Wenn sie ihr Script bzw. ihre Lösung dem delixs-Projekt zur Verfügung stellen wollen, dann muss es wegen der langfristigen Sicherung des Supports bestimmten Ansprüchen genügen. Diese Qualitätsansprüche werden im Folgenden angegeben:
- Passworte, Hostnamen, IP-Adressen oder kurz: sämtliche variablen Daten sind nie im Script direkt anzugeben, sondern sollten immer aus der jeweiligen Datei (Beispiel: "ldap.secret") eingelesen werden.
- da jede Schule eine andere Suchbasis (hier LDAP-Base genannt) hat, sollte das Script diese aus der /etc/ldap.conf auslesen. Das kann so geschehen:
# wir holen uns die Such-Basis ($ldap_base) aus der ldap.conf open DATEI, '<', '/etc/ldap.conf' or die "konnte ldap.conf nicht oeffnen, $!\n"; while (my $zeile = <DATEI>) { if ($zeile =~ m/^\s*base\s+(\w.*\w)\s*$/) { $ldap_base = $1; last; } } close DATEI;