Frage

Ich habe nun schon seit einigen Jahren Perl geschrieben und es ist meine bevorzugte Sprache für die Textverarbeitung (viele der Genetik / Genomik Probleme, die ich auf Arbeit ist, um Textverarbeitungsprobleme leicht reduziert). Perl als Sprache kann sehr nachsichtig sein, und es ist möglich, sehr schlecht zu schreiben, aber funktional, Code in Perl. Erst neulich, mein Freund sagte, er ruft Perl eine write-only Sprache:. Schreiben Sie es einmal, es zu verstehen, einmal und nie versuchen, es zurück zu gehen und zu beheben, nachdem es fertig ist

Während ich auf jeden Fall schuldig gemacht habe, zu Zeiten des Schreibens schlechten Skripte, ich fühle mich wie ich auch einig sehr klaren und wartbaren Code in Perl geschrieben. wenn jemand fragt mich, aber was macht der Code klar und wartbar, würde ich nicht in der Lage sein, eine selbstbewusste Antwort zu geben.

Was macht Perl-Code wartbar? Oder vielleicht eine bessere Frage ist, was Perl-Code schwer macht, zu halten? Nehmen wir an, ich bin nicht der einzige, der den Code werden beibehalten wird, und dass die anderen Mitwirkenden, wie ich, sind keine professionellen Perl-Programmierer aber die Wissenschaftler mit Erfahrung programmieren.

War es hilfreich?

Lösung

Was macht Perl-Code wartbaren? So ziemlich alles, was ein anderes Programm wartbaren macht. Unter der Annahme, etwas anderes als ein kurzes Skript eine gut definierte Aufgabe erfüllen sollte, ist diese:

  • Globale Variablen
  • fehlende Trennung von Bedenken: Monolithische Skripte
  • NICHT mit selbstdokumentiere Kennungen (Variablennamen und Methodennamen). Z.B. Sie sollen wissen, was ein Variablen Zweck von seinem Namen. $c schlecht. $count besser. $token_count gut.
    • Rechtschreibkennungen aus. Programmgröße ist nicht mehr von größter Bedeutung.
    • Ein Unterprogramm oder eine Methode namens doWork sagt nichts
    • Machen Sie es einfach, die Quelle von Symbolen aus einem anderen Paket zu finden. Entweder explizite Paketpräfix verwenden oder explizit jedes Symbol über use MyModule qw(list of imports) verwendet importieren.
  • Perl-spezifisch:
    • Übermäßiges Vertrauen auf Short-Cuts und obskure builtin Variablen
    • Missbrauch von Unterprogramm Prototypen
    • nicht strict verwenden und nicht mit warnings
  • Das Rad neu erfinden, anstatt mit etablierten Bibliotheken
  • Nicht eine konsistente Einrückungsstil mit
  • Nicht horizontal und vertikal weißen Raum mit dem Leser führen

etc etc etc.

Grundsätzlich, wenn Sie Perl denken ist -f>@+?*<.-&'_:$#/%! , und Sie streben zu schreiben Sachen wie, dass in der Produktion Code, dann, ja, werden Sie Probleme haben.

neigen die Menschen zu verwirren Sachen Perl-Programmierer tun für Spaß (zum Beispiel JAPHs, Golf, etc.) mit dem, was gut Perl-Programme sollen, aussehen.

Ich bin nach wie vor unklar, wie sie in der Lage, in ihren Köpfen zu trennen Code geschrieben für IOCCC von wartbar C.

Andere Tipps

Ich schlage vor:

  1. Lassen Sie sich nicht zu gescheit mit dem Perl. Wenn Sie Golf spielen mit dem Code beginnen, es wird in schwieriger zu lesenden Codes zur Folge hat. Der Code, den Sie benötigen Schreib lesbar zu sein und deutlich mehr, als es braucht, klug zu sein.
  2. Dokumentieren Sie den Code. Wenn es ein Modul ist, fügen Sie typische Verwendung und Methoden POD beschreibt. Wenn es ein Programm ist, fügen Sie POD Kommandozeilenoptionen und typische Verwendung zu beschreiben. Wenn es ein haariges Algorithmus, Dokument sich und verweist (URLs), wenn möglich.
  3. Verwenden Sie die /.../x Form von regulären Ausdrücken und dokumentieren sie. Nicht jeder versteht Regexes gut.
  4. wissen, was Kopplung ist und die Vor / Nachteile von High / Low-Kopplung.
  5. wissen, was Zusammenhalt ist, und die Vor / Nachteile der hohen / niedrigen Kohäsion.
  6. Verwenden Sie Module entsprechend. Eine schöne gut definierte, gut enthaltene Konzept macht ein großes Modul. Wiederverwendung solcher Module ist das Ziel. Verwenden Sie keine Module einfach die Größe eines monolithischen Programm zu reduzieren.
  7. schreiben Unit-Tests für Sie Code. Ein guter Test Suite wird nicht nur ermöglichen es Ihnen, Ihren Code arbeitet heute, sondern auch morgen zu beweisen. Es wird auch Sie kühne Änderungen in der Zukunft, mit Zuversicht, dass Sie nicht ältere Anwendungen brechen. Wenn Sie brechen die Dinge tun, dann, na ja, Ihre Tests Suite war nicht breit genug.

Aber alles in allem die Tatsache, dass Sie genug über die Wartbarkeit Pflege eine Frage danach zu fragen, mir sagt, dass Sie bereits in einem guten Platz sind und die richtige Art und Weise zu denken.

Ich benutze nicht alle Perl Best Practices , aber das ist die Sache, dass Damian schrieb es. Unabhängig davon, ob ich alle Vorschläge, sie sind alle im Wert von mindestens berücksichtigen.

  

Was macht Perl-Code wartbar?

Am wenigsten:

use strict;
use warnings;

Siehe Perldoc perlstyle für einige allgemeine Richtlinien, die Ihre Programme leichter lesen machen, zu verstehen, und erhalten.

Ein Faktor sehr wichtig, um die Lesbarkeit des Codes, dass ich nicht in anderen Antworten ist die Bedeutung des weißen Raumes erwähnt gesehen, die sowohl Perl-agnostisch und in gewisser Weise ist Perl spezifisch.

Perl kann Sie sehr kurzen Code schreiben, aber consise Stücke bedeuten nicht, sie haben zusammen alle gebündelten werden.

Weiß Raum hat viel Bedeutung / Anwendungen, wenn wir über die Lesbarkeit sprechen, nicht alle von ihnen weit verbreitet, aber am nützlichsten:

  • Spaces um Token leichter trennen sie visuell.

    Dieser Raum ist doppelt wichtig, in Perl aufgrund Prävalenz von Leitungsrauschen Zeichen selbst in bestem Stil Perl-Code.

    Ich finde $myHashRef->{$keys1[$i]}{$keys3{$k}} auf weniger lesbar bei 02.00 in der Mitte des producion Notfall im Vergleich zu gestaffelt: $myHashRef->{ $keys1[$i] }->{ $keys3{$k} }.

    Als Seite beachten, wenn Sie Ihren Code zu tun eine Menge tief verschachtelter Referenz Ausdrücke alle beginnend mit der gleichen Wurzel finden, sollten Sie unbedingt berücksichtigen, dass die Wurzel in einen temporären Zeiger zuweisen (siehe Sinans Kommentar / Antwort).

    Ein teilweise, aber sehr wichtiger Spezialfall ist natürlich regulären Ausdrücke. Der Unterschied wurde in allen wichtigen Materialien zum Tode dargestellt Ich erinnere mich (PBP, RegEx O'Reilly Buch, etc ..) so werde ich nicht diesen Beitrag noch weiter, es sei denn Beispiele jemand Anfragen verlängern in den Kommentaren.

  • Die korrekte und einheitliche Vertiefung. D'oh. Offensichtlich. Doch ich sehe viel zu viel Code 100% unlesbar wegen crappy Einbuchtung, und noch weniger lesbar, wenn die Hälfte des Codes mit TABs von einer Person, deren Editor verwendet 4 Zeichen Tabs und ein anderer von einer Person, deren Editor verwendet 8 Zeichen Tabulatoren eingerückt wurde. Nur stellen Sie Ihren blutigen Editor weichen (zum Beispiel Raum-emulierten) TABs zu tun und andere nicht unglücklich machen.

  • Leerzeilen um logisch getrennte Einheiten von Code (beiden Blöcke und nur Sätze von Linien). Sie können eine 10000 Leitung Java-Programm in 1000 Zeilen gut Perl schreiben. Nun fühle mich nicht wie Benedict Arnold, wenn Sie 100-200 leere Zeilen zu jenen 1000 hinzufügen, um die Dinge besser lesbar zu machen.

  • Splitting uber lange Ausdrücke in mehrere Zeilen, dicht gefolgt von ...

  • Die korrekte vertikale Ausrichtung. Zeuge der Unterschied zwischen:

    if ($some_variable > 11 && ($some_other_bigexpression < $another_variable || $my_flag eq "Y") && $this_is_too_bloody_wide == 1 && $ace > my_func() && $another_answer == 42 && $pi == 3) {
    

    und

    if ($some_variable > 11 && ($some_other_bigexpression < $another_variable || 
        $my_flag eq "Y") && $this_is_too_bloody_wide == 1 && $ace > my_func()
        && $another_answer == 42 && $pi == 3) {
    

    und

    if (   $some_variable > 11
        && ($some_other_bigexpression < $another_variable || $my_flag eq "Y")
        && $this_is_too_bloody_wide == 1
        && $ace > my_func()
        && $another_answer == 42
        && $pi == 3) {
    

    Ich persönlich ziehe die vertikale Ausrichtung eines weiteren Schritt durch Ausrichten LHS und RHS (dies ist besonders lesbar bei langen SQL-Abfragen zu beheben, aber auch in Perl-Code selbst, sowohl die langen conditionals wie diese sowie viele Linien von Zuweisungen und Hash / array Initialisierungen):

    if (   $some_variable               >  11
        && ($some_other_bigexpression   <  $another_variable || $my_flag eq "Y")
        && $this_is_too_bloody_wide    ==  1
        && $ace                         >  my_func()
        && $another_answer             ==  42
        && $pi                         ==  3  ) {
    

    Als Randbemerkung, in einigen Fällen könnte der Code noch besser lesbar / wartbar durch nicht mit solch langen Ausdrücke in erster Linie gemacht werden. Z.B. wenn der Inhalt des if(){} Block ist ein return, dann mehrere if/unless Aussagen, von denen jeder hat einen Rückkehrblock geht es besser sein kann.

Ich sehe dies als ein Problem von Menschen gesagt, dass Perl nicht lesbar ist, und sie beginnen Annahmen über die maintability von ihrem eigenen Code zu machen. wenn Sie gewissenhaft genug, um zu prüfen, Lesbarkeit als Qualitätsmerkmal Code sind, stehen die Chancen, diese Kritik nicht auf Sie zutreffen.

die meisten Leute Regexes zitieren, wenn sie die Lesbarkeit zu diskutieren. Regexes ist ein dsl in Perl eingebettet und Sie können sie oder auch nicht lesen. wenn jemand nicht die Zeit nehmen kann etwas so einfach und wichtig, viele Sprachen zu verstehen, ich bin nicht besorgt über versucht, etwas gefolgert kognitive Lücke zu überbrücken ... sie sollten nur Menschen auf, lesen Sie die perldocs, und stellen Sie Fragen, wo notwendig .

andere werden Perl die Nutzung von Kurzform zitieren vars wie @_, $! usw. diese sind alle leicht vereindeutigt ... Ich bin bei der Herstellung von Perl aussehen wie Java nicht interessiert.

der Kopf von all diesen Macken und perlisms ist, dass Codebases in der Sprache geschrieben ist oft knapp und kompakt. ich würde eher zehn Zeilen Perl als hundert Zeilen Java lesen.

zu mir gibt es so viel mehr zu „Wartbarkeit“ als einfach mit leicht zu lesende Code. Schreibtests, make Behauptungen ... tun alles, was Sie auf Perl und sein Ökosystem lehnen tun können Code korrekt zu halten.

kurzum:. Schreibprogramme zunächst korrekt, dann sichern, dann gut funktionierende .... sobald diese Ziele erreicht wurden, dann Sorgen um es schön zu machen mit der Nähe eines Feuer zum Einrollen

Ich würde sagen, die Verpackung / Objektmodelle, die in der Verzeichnisstruktur für .pm Dateien reflektiert werden. Für meine Doktorarbeit schrieb ich ziemlich viel Perl-Code, dass ich später wiederverwenden. Es war für die automatischen LaTeX Diagramm-Generator.

Ich werde ein paar positive Dinge reden zu Perl wartbar zu machen.

Es ist wahr, dass Sie in der Regel nicht zu klug von mit wirklich dichten Aussagen a la return !$@;#% und dergleichen, aber eine gute Menge von cleveren mit list-Verarbeitung Operatoren, wie map und grep und list-Kontext kehrt von Leuten bekommen sollten split und ähnliche Operatoren zu schreiben, um Code in einem funktionalen Stil können einen positiven Beitrag zur Wartbarkeit machen. Bei meinem letzten Arbeitgeber hatten wir auch einige pfiffigen Hash-Manipulation Funktionen, die in ähnlicher Weise bearbeitet (hashmap und hashgrep, obwohl technisch nur wir sie auch große Listen zugeführt). Zum Beispiel:

# Look for all the servers, and return them in a pipe-separated string
# (because we want this for some lame reason or another)
return join '|', 
       sort
       hashmap {$a =~ /^server_/ ? $b : +()} 
       %configuration_hash;

Siehe auch Higher Order Perl http://hop.perl.plover.com -. gute Verwendung von metaprogramming können Aufgaben kohärenter und lesbar machen definieren, wenn Sie die metaprogramming sich aus in die Quere halten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top