Ist es möglich, langen Code, der eine Berechnung darstellt, leichter lesbar zu machen?

9

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?

Michael Tsang
quelle
Gibt es für Sie keine Möglichkeit, die Abfrage auf irgendeine Weise zu parametrisieren? Ich vermute, dass diese Abfrage abhängig davon variiert, was in der erstellten Methode vor sich geht. Vielleicht können Sie es in kleinere Teile zerlegen und in mehreren Schritten konstruieren, um die Lesbarkeit zu verbessern.
Zalomon
Unterstützt Ihr ORM Ansichten? Sie können eine (Gruppe von) Verknüpfungen in eine Ansicht extrahieren und dann die Ansicht auswählen. Selbst wenn die Ansicht nicht anderweitig verwendet wird, kann dies dazu beitragen, eine große SQL-Anweisung
aufzulösen
Unterstützt Ihr ORM eine SQL-ähnliche Abfragesprache? Wenn ja, können Sie die Abfrage in eine eigene Datei verschieben und die Hervorhebung der IDE-Syntax aktivieren. Laden Sie in Ihrer Anwendung die Abfrage aus der Datei. Wenn Ihre IDE diese bestimmte Abfragesprache nicht genau unterstützt, können Sie mit der SQL-Formatierung zurechtkommen, auch wenn dies möglicherweise nicht perfekt ist. Die Lesbarkeit wird jedoch durch eine gute Formatierung erheblich verbessert. Dies hat auch den Vorteil, dass es einfach ist, die Abfrage auf ein Notizblock zu kopieren und dort Änderungen vorzunehmen.
SpaceTrucker

Antworten:

17

Sie schrieben

Wird solch schwer lesbarer Code als schlechter Code angesehen?

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.

Doc Brown
quelle
Ich bin mit dem Kommentarteil nicht einverstanden. Wenn es einen komplexen Teil des Codes gibt, der komplex ist, weil er nicht anders sein kann UND keinen Weg gefunden hat, ihn zu vereinfachen, ist es unwahrscheinlich, dass Kommentare einen Überblick über das geben, was getan wird. Dokumentieren Sie es mit einem Diagramm wäre viel besser. Und ein Kommentar, der sich auf diese externe Dokumentation bezieht, sollte hinterlassen werden. Natürlich muss diese Situation außergewöhnlich sein, da wir alle wissen, dass die Pflege externer Dokumentationen selten durchgeführt wird. Je weniger, desto besser. Im Übrigen eine gute Antwort wie immer.
Walfrat
@Walfrat: Meine Absicht war es, eine allgemeine Richtlinie über den Prozess bereitzustellen, nicht ausschließlich für "50 Zeilen SQL-Code" und nicht als "Out-of-the-Box" -Lösung mit allen möglichen Ansätzen.
Doc Brown
Ich weiß, ich wollte nur vorschlagen, dass, wenn etwas nach mehrmaliger Überprüfung nicht genug vereinfacht werden kann (was auch immer es ist), Kommentare höchstwahrscheinlich nicht dazu beitragen, was diese Sache komplex macht, so dass wahrscheinlich nur eine minimale externe Dokumentation erforderlich ist. Im speziellen Fall der Datenbankabfrage ist dies noch einfacher, indem ein Diagramm angezeigt wird, das zeigt, wie die einzelnen Teile der Abfrage miteinander korrelieren.
Walfrat
4

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.

gnasher729
quelle
Genau. Versuchen Sie nach besten Kräften, den Code selbst zu dokumentieren, und füllen Sie die Lücken mit Kommentaren aus. (bearbeitet: Ich habe nach dem Posten meines Kommentars festgestellt, dass sich das OP auf ORM-Datenbankabfragen bezieht, nicht auf SQL.)
Kyle A
1

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.

John Wu
quelle
2
Ehrlich gesagt ist die Tatsache, dass Sie ORMs nicht mögen, für die Frage völlig irrelevant.
Doc Brown
Ich mag ORMs ganz gut. Ich behaupte, dass sie kein gutes Werkzeug sind, wenn der Code "mehrere Spalten verbindet, mehrere Wherees anwendet und mehrere unterschiedliche Spalten auswählt, um ein erforderliches dokumentiertes Ausgabeformat zu erstellen", das das Thema dieses Threads ist.
John Wu
0

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:

query(join(map(condition1, condition2), blah, blah, something(bah, blah, blah))) 

Wird:

// Why are we doing such an awful single query rather than a sequence of selects?
query( // Description of query
  join( // Why are you doing a join here
    map( // Why a map
      condition1, // What is this
      condition2  // And this
   ), // End Map
   blah, // What, Why?
   blah, // What, Why?
   something( // What does this do?
      bah, // What, Why?
      blah, // What, Why?
      blah // What, Why?
      ) // End Something
   ) // End Join
) // End Query
Steve Barnes
quelle
Ich bin nicht eindeutig in Bezug auf Ihr Beispiel. Kommentare sollten erklären, warum der Code so ist, wie er ist. Das, was durch die Identifikatoren ausgedrückt werden sollte ...
Timothy Truckle
@TimothyTruckle Ich stimme zu, dass Bezeichner eindeutig identifizieren sollten , was sie sind, aber allzu oft sind sie im normalen Code unklar. Bei Datensatzfeldnamen besteht häufig ein Mangel an Klarheit aufgrund historischer Einschränkungen, bei denen ich auf Fälle gestoßen bin, in denen die Feldnamen aufgetreten sind waren auf 5 Zeichen begrenzt, bei denen es sich alle um ASCII-Großbuchstaben handeln mussten. Sie konnten aufgrund von Kompatibilitätsanforderungen nicht geändert werden, z. B. mit dem bevorzugten Berichtstool des MD.
Steve Barnes
0

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.

Neville Kuyt
quelle