Lange Methoden werden im Allgemeinen als schlecht angesehen, aber in meinem Code habe ich einige schwer verständliche lange Methoden (mehr als 50 Zeilen). Ich habe Probleme, diese Methoden leichter lesbar zu machen, da eine einzelne Anweisung bereits mehr als 50 Zeilen lang ist und diese schwer lesbare einzelne Anweisung darin besteht, eine Datenbankabfrage mithilfe eines ORM zu erstellen, um einen bestimmten Job dort auszuführen, wo der Job ausgeführt wird deutlich auf dem Methodennamen angegeben. Der Grund dafür, dass die Anweisung so lang ist, weil sie mehrere Spalten verknüpft, mehrere wherees anwendet und mehrere unterschiedliche Spalten auswählt, um ein erforderliches dokumentiertes Ausgabeformat zu erstellen.
Wird solch schwer lesbarer Code als schlechter Code angesehen? Wenn ich Code für einen komplizierten Algorithmus schreibe, der zu schwer lesbarem Code führt, der in eine klar benannte Methode eingeschlossen ist, ist dieser Code dann fehlerhafter Code?
quelle
Antworten:
Sie schrieben
Sie stimmen also definitiv zu, dass es sich um schwer lesbaren Code handelt, und wenn es schwer zu lesen ist, ist es schwierig, ihn zu pflegen und weiterzuentwickeln. Ich denke, Sie betrachten den Code nach Ihren eigenen Maßstäben als "schlecht". Manchmal ist es jedoch nicht offensichtlich, wie man eine SQL-Anweisung mit 50 Zeilen verbessert. Die einfachen Refactorings der "Extraktionsmethode" funktionieren nicht, und Sie haben wahrscheinlich keine Ahnung, wo Sie anfangen sollen, um den Code besser lesbar zu machen. In diesen Fällen können Sie weiterhin eine oder alle der folgenden Methoden ausprobieren
Zeigen Sie den Code einer anderen Person, die mehr Erfahrung als Sie mit der Bereinigung von Code hat. Wenn Sie keine Person in Ihrer Organisation haben, die Sie fragen können, versuchen Sie es mit codereview.stackexchange
Versuchen Sie, nach dem spezifischen Problem zu suchen. In Ihrem Beispiel könnten Dinge wie "Bereinigen einer langen SQL-Anweisung" ein guter Anfang sein. Sie werden erstaunt sein, wie viele Artikel Sie zu diesem Thema finden, und selbst wenn Sie kein Braindead-Rezept für Ihren Fall finden, erhalten Sie möglicherweise neue Ideen
statt für die Dinge , für eine Rechtfertigung zu fragen Sie nicht tun können, konzentrieren sich auf die Dinge , die Sie können den Code zu bereinigen tun zumindest ein wenig, wie das Hinzufügen von richtigen Zeilenumbrüche, die richtige Vertiefung, das Hinzufügen einiger Erklärung Kommentare, geben einige Variablen eine bessere Name. Es ist nicht unwahrscheinlich, dass Sie sich während dieses Vorgangs dazu zwingen, die Details des Codes erneut zu lesen, und eine Möglichkeit finden, den Code in kleinere Einheiten umzugestalten
üben, üben, üben. "Sauberes Codieren" lernen Sie nicht an einem Tag, es wird mit mehr Erfahrung einfacher. Vielleicht finden Sie heute keine Lösung für Ihr Problem, aber wenn Sie in ein paar Monaten zum Code zurückkehren, sieht er für Sie anders aus.
quelle
Schwer zu lesen ist nicht schlecht - unnötig schwer zu lesen ist schlecht.
Manche Dinge sind schwierig. In diesem Fall müssen Sie das Problem vollständig verstehen, den Code schreiben und ihn so gut wie möglich kommentieren, damit der nächste Entwickler eine Chance hat.
Aber manche Dinge sind nur schwierig, weil Sie sie schwierig gemacht haben. Wenn das Problem vereinfacht und erleichtert werden kann, vereinfachen Sie es. Wenn es schwer zu verstehen ist, aber vernünftigerweise in Teilprobleme unterteilt werden kann, teilen Sie es zur Vereinfachung in Teilprobleme auf.
quelle
ORM, um einen Bericht zu erstellen? Ernsthaft? Lerne etwas SQL, Mann. Prozedurale Sprachen sind in solchen Dingen schrecklich.
SQL ist eine Sprache, die viel besser für komplizierte Verknüpfungen und Auswahlen ausgelegt ist. Und selbst wenn Sie das SQL nicht schön aussehen lassen können, stehen alle Arten von Visualisierungstools zur Verfügung, mit denen Sie Datenbankobjekte in ein Diagramm ziehen und dort ablegen können, und das SQL wird für Sie generiert. Ganz zu schweigen davon, dass Sie die Abfrage optimieren und optimieren, ihren Abfrageplan anzeigen, die Plattform dazu bringen können, zusätzliche Indizierungsoptionen vorzuschlagen usw. Sie ist einfach viel flexibler.
Ich bin mir sicher, dass einige Leute hier nicht mit mir übereinstimmen werden, aber ORM eignet sich nicht für komplizierte Berichtszwecke. Wenn es überhaupt möglich ist, würde ich in Betracht ziehen, mich davon zu entfernen und mich der strukturierten Abfragesprache zuzuwenden.
quelle
Im Allgemeinen ist schwer lesbarer Code überall eine schlechte Idee - selbst wenn Sie der einzige Betreuer sind - ich hatte mehrere Fälle, in denen ich Jahre oder sogar Wochen später zu einigen Codes zurückkehrte und es schwierig fand, meinen Kopf herumzukriegen.
Wenn Sie in einer einzelnen Abfrage viel tun müssen, teilen Sie sie mit eingebetteten Kommentaren auf mehrere Zeilen auf:
Wird:
quelle
Neben der hervorragenden Antwort von @ DocBrown ist es meiner Meinung nach erwähnenswert, dass niemand ständig "guten" Code schreibt. Das Codieren macht Kompromisse, und oft ist es besser zu akzeptieren, dass Sie etwas geschrieben haben, das etwas weniger sauber ist, als Sie möchten, und später darauf zurückzukommen. Refactoring ist der Prozess der Verbesserung des Codes im Laufe der Zeit - und meiner Erfahrung nach macht dies eine gute Codebasis aus, nicht "beim ersten Mal richtig machen".
Und Sie bewerten Code auf der Ebene der Anwendung, nicht auf der Ebene einzelner Methoden / Codezeilen. Wenn Sie also eine komplexe Methode haben, die aber eindeutig benannt ist, haben Sie wahrscheinlich keinen "schlechten" Code, solange die Methode zusammenhängend ist.
Das Benennen ist die größte Waffe, mit der Sie Code verständlich machen können. Geben Sie Ihrer Methode einen Namen, mit dem Personen, die Ihren Code lesen, den Körper bei Bedarf überspringen können. Benennen Sie Ihre Variablen usw. so, dass die Leser sehen können, was sie darstellen, ohne ihre Zuweisungsanweisungen lesen zu müssen.
Als nächstes müssen Sie sicherstellen, dass Ihre Methode wirklich nur eines tut - Nebenwirkungen machen den Code schwer verständlich. Wenn Ihre Methode also Daten für ein Ausgabeformat zurückgibt, sollte sie auch nicht den Status Ihrer Datenbank auf "gedruckt" oder was auch immer aktualisieren.
Layering / Componentization ist das nächste, was Sie tun könnten - wenn Sie über eine Reihe komplexer Methoden verfügen, die ORM-Ergebnisse generieren, bündeln Sie diese, damit die Leser Ihres Codes davon ausgehen können, dass sie sich alle gleich verhalten, keine Nebenwirkungen haben usw.
quelle