Erhöht die Codegenerierung die Codequalität?


12

In meinem Streben nach Code-Generierung suche ich nach Beispielen, wie sich die Code-Qualität verbessern lässt. Um zu verdeutlichen, was ich mit Codegenerierung meine, kann ich nur über ein Projekt von mir sprechen:

Wir verwenden XML-Dateien, um Entitätsbeziehungen in unserem Datenbankschema zu beschreiben, damit wir unser ORM-Framework und HTML-Formulare generieren können, mit denen Entitäten hinzugefügt, gelöscht und geändert werden können.

Meiner Meinung nach erhöht es die Codequalität, weil menschliche Fehler reduziert werden. Wenn etwas falsch implementiert ist, ist es im Modell fehlerhaft, was gut ist, da der Fehler möglicherweise früher auftritt, da auch mehr generierter Code fehlerhaft ist.

Da ich nach der Definition der Codequalität gefragt wurde , möchte ich klarstellen, was ich unter Softwarequalität verstehe .

Softwarequalität : Es sind nicht nur ein Attribut, sondern viele, z. B. Effizienz, Modifizierbarkeit, Lesbarkeit, Korrektheit, Robustheit, Verständlichkeit, Benutzerfreundlichkeit, Portabilität usw., die sich gegenseitig beeinflussen.


3
Wie definieren Sie Codequalität?
NoChance

@EmmadKareem Ich habe der ursprünglichen Frage eine kurze Definition hinzugefügt.
platzhirsch

1
Ich denke, dass die automatische Codegenerierung dazu beiträgt, die Konsistenz und Einheitlichkeit Ihres Codes zu erhöhen. In einigen Fällen steigert dies die Qualität, aber ich denke nicht, dass dies ein Allheilmittel ist.
Joshin4colours

Antworten:


38

Codegeneratoren können keinen besseren Code generieren als die Person, die den Generator geschrieben hat.

Meine Erfahrung mit Codegeneratoren ist, dass sie in Ordnung sind , solange Sie den generierten Code nie bearbeiten müssen . Wenn Sie sich an diese Regel halten können, können Sie loslegen. Auf diese Weise können Sie diesen Teil des Systems zuverlässig und schnell neu generieren und bei Bedarf automatisch weitere Funktionen hinzufügen. Ich denke, das könnte für die Qualität zählen.

Ich habe einmal ein Argument für Codegeneratoren gehört, dass ein einzelner Programmierer so viele Codezeilen pro Tag produzieren kann, und mit Codegeneratoren könnten sie Tausende von Zeilen produzieren! Das ist natürlich nicht der Grund, warum wir Generatoren verwenden.


6
+ der kursiv geschriebene Abschnitt tausendmal. Codegeneratoren sollten wie Ihr Compiler oder der C ++ - Vorlagenmechanismus funktionieren: Sie sollten ihre Ausgabe niemals manuell bearbeiten müssen. Sie sollten die Ausgabe nur dann lesen, wenn Sie einen Fehler vermuten.
anon

1
Es ist eine Schande, dass ich nicht mehr abstimmen kann ...
Fabricio Araujo

@anon: Homans sollte die Ausgabe von Codegeneratoren oder Compilern im Allgemeinen nicht bearbeiten. Manchmal kann es jedoch durchaus sinnvoll sein, einen Build-Prozess auszuführen, bei dem ein Teil des maschinengenerierten Codes durch ein Programm ausgeführt wird, das einige Änderungen daran vornimmt. Es kann auch vorkommen, dass die Ausgabe eines Erstellungsprozesses manuell bearbeitet werden muss, wenn Feldcode gepatcht werden muss, während eine minimale Anzahl von Bytes geändert wird. Wenn der Code jedoch manuell auf diese Weise optimiert wird, sollte dies geschehen archivieren Sie auch alle Dateien aus dem Build-Prozess (nicht nur Quelle!) und ...
Supercat

... aktualisieren Sie auch den Quellcode, um ihn an die Semantik des handbearbeiteten Objektcodes anzupassen.
Supercat

20

Ich würde das Gegenteil argumentieren - vorausgesetzt, Sie schreiben interessante Anwendungen, verringert die Codegenerierung die Codequalität. Die Art der Codegenerierung belohnt sehr ausschneidende, überzogene, überspezifizierte Frameworks, die sehr schwer zu verarbeiten sind, ohne sich ständig auf das Codegenerierungs-Tool verlassen zu müssen, um ständig größere, komplexere und hässlichere Codebündel zu generieren. Es kann zwar ein gutes Werkzeug sein, sollte aber nicht das primäre Werkzeug in der Verpackung sein.


3
Ein gutes Beispiel ist der Müll, der aus einigen ORMs stammt (Müll aus der Sicht von jemandem, der weiß, wie man leistungsfähigen Datenbankcode schreibt). Es funktioniert oft genug für jemanden, der nicht weiß, was er tut, um zu glauben, dass es funktioniert. Und neue Programmierer sind nicht in der Lage, die schwierigeren Aufgaben außerhalb des Generators zu erledigen, da sie grundlegende Konzepte nicht verstehen.
HLGEM

1
Ooh, +1 oder -1 ... Einerseits ist die Codegenerierung sehr nützlich, um sich langweilig wiederholenden Code zu entfernen, bei dem Sie eine Definition haben, die einfach zu Code erweitert wird "Zeit sparende" Komplexität, die in sich selbst ein Anti-Pattern ergibt.
Gbjbaanb

13

Ich denke, automatisierte Codegenerierung und Codequalität sind etwas orthogonal und müssen nicht unbedingt korrelieren.

Die Codegenerierung ist lediglich eine Möglichkeit, eine bestimmte technische Aufgabe zu lösen. Ob sich dadurch die Codequalität erheblich verbessert, hängt davon ab, was Sie tun.

Ihre Situation ist ein gutes Beispiel für die Codegenerierung, die zu einer Verbesserung der Codequalität führt, indem potenzielle Fehler frühzeitig erkannt werden.

Ich kann Ihnen ein weiteres Beispiel geben, wenn die automatische Codegenerierung die Codequalität verringert. Es ist aus allmächtigen ASP.NET WebForms. Die automatische Codegenerierung erfolgt durch die Übersetzung einer Hierarchie von UI-Steuerelementen in HTML-Markup, das alles andere als stabil, vorhersehbar und verwaltbar ist.

Um die Schlussfolgerung zu ziehen, kann die automatische Codegenerierung bei ordnungsgemäßer Verwendung zur Erhöhung der Codequalität beitragen.


11

Codegenerierung beeinflusst Code nicht Qualität , per se, so viel wie Code Konsistenz .

Der generierte Code ist zwischen den Generierungsinstanzen konsistent. Wenn der Generator so ausgelegt ist, dass er einen Code mit guter Qualität ausgibt, ist der generierte Code von gleichbleibend guter Qualität. Wenn der Codegenerator jedoch einen Code mit schlechter Qualität ausgibt, erhalten Sie durchgehend schlechten Code.

Die Codegenerierung kann auch zum schnelleren Erstellen von Code verwendet werden . Schneller bedeutet jedoch nicht besser ... Es kann bedeuten, dass Sie Ihren Code mit schlechter Qualität viel schneller erhalten.


6

Code-Generierung ist gut, wenn:

  • Der generierte Code soll nicht bearbeitet werden
  • Der Codegenerator bietet Ihnen genügend Flexibilität, um das zu tun, was Sie tun müssen
  • Die Eingabesprache für den Codegenerator ist besser (dh DRY) als das, was Sie sonst schreiben müssten
  • Der Codegenerator erstellt zuverlässigen Code, über den Sie sich keine Sorgen machen müssen, auch wenn er wortreich ist

In diesem Fall ist der Code, dessen Qualität Sie berücksichtigen müssen, der Code, der in den Generator eingegeben wird.

Ein einfaches Maß für die Qualität ist, bei typischen Änderungen der Anforderungen, wie viel manuelle Bearbeitung Sie vornehmen müssen. Je weniger desto besser.


und dass der generierte Code transparent auf das Original zurückgeführt wird, so dass Sie nicht auf generierten Code debuggen müssen.

@ Thorbjørn: Da stimme ich zu. Auf einer App, die ich dort warten musste, wird Fortran generiert. Die Notwendigkeit, es zu debuggen, ging im Laufe der Jahre verloren, und ich bin der einzige, der dumm genug ist, immer noch da zu sein, um die Serviceanrufe entgegenzunehmen :)
Mike Dunlavey,

Ich bin nicht einverstanden, dass der Codegenerator flexibel sein sollte. Es muss zielgerichtet sein - eine Sache gut machen, nicht viele Dinge. Es sollte eine kleine, gut definierte Eingabe erfordern und ein Stück Code für Sie schreiben. Wenn es beginnt zu sein , das Programm, sein für das Scheitern geleitet.
gbjbaanb

@ gbjbaanb: Ich stimme zu. Deshalb habe ich genug Flexibilität gesagt . Für mich ist das Problem nicht der Codegenerator selbst, sondern die domänenspezifische Sprache, die als Eingabe dient. Wenn dieses DSL zu flexibel ist, muss der Benutzer in Optionen herumschwimmen. Wenn es nicht spezifisch genug ist, muss der Benutzer seine Einschränkungen umgehen. Ich kann Beispiele dafür geben.
Mike Dunlavey

4

Erhöhte Codequalität durch DRY (Wiederholen Sie sich nicht).

Die Codegenerierungsregeln werden einmal geschrieben. Sie sind nicht für jede Instanz des generierten Codes fest codiert und verringern daher das Risiko menschlicher Fehler beim Kopieren / Einfügen des Inhalts mit geringfügigen Änderungen.


Es ist überhaupt nicht angenehm, es sei denn, Sie müssen den generierten Code bearbeiten, der überhaupt nicht trocken ist. Ich musste das kürzlich tun . Wenn ich eine automatisch generierte Codebasis erneut manuell bearbeiten musste, werde ich dreimal berechnen !!!
Fabricio Araujo

1
Sie sollten diesen Code niemals bearbeiten müssen. Bearbeiten Sie den Code, der die Generierung selbst durchgeführt hat, und erweitern Sie ihn bei Bedarf mit zusätzlichen Regeln. Das Bearbeiten des generierten Codes sollte der letzte Ausweg sein.
EarlNameless

1
Ich hätte gerne diese Wahl. Hab ich nicht.
Fabricio Araujo

2

Ich gehe davon aus, dass Sie proprietäre Codegeneratoren meinen, die für eine bestimmte interne Verwendung handrolliert sind, da ansonsten alles, was nicht aus Maschinencode besteht, ein Codegenerator ist. Aber los geht's:

Bildbeschreibung hier eingeben

Ich halte es für sehr umstritten, dass das Knotendiagramm in Blueprints einfacher zu warten und weitaus weniger fehleranfällig ist als der von ihm generierte GLSL / HLSL-Code (und ansonsten handgeschrieben werden müsste).

Es ist auch viel produktiver, neue Shader zu entwickeln, da Sie in Echtzeit ein visuelles Feedback erhalten, wie das Endergebnis aussieht, wenn Sie das Diagramm ändern. Ich würde es definitiv vorziehen, Tausende von Shadern, die mit Knotengraphen auf diese Weise dargestellt werden, anstelle von GLSL / HLSL-Code beizubehalten, und ich bin eigentlich mit dem Schreiben von GLSL / HLSL besser vertraut als mit der Verwendung von Blueprints. Ich denke, es ist praktisch unmöglich, einen großen Fehler zu verursachen, abgesehen von einigen kleinen visuellen Fehlern, die Sie wahrscheinlich sofort bemerken würden, da die "visuelle Sprache" vernünftige Einschränkungen mit häufig rein funktionalen Stilen auferlegt, die es Ihnen nicht erlauben, beispielsweise stürze einen Shader ab, zumindest AFAIK (ich bin zugegebenermaßen kein Experte für Blaupausen).

Es gibt nicht einmal mehr "Code" zu pflegen. Sie platzieren einfach Knoten in einem Diagramm und zeichnen Verknüpfungen zwischen ihnen. Voila, es generiert Shader-Code für Sie. Wer pflegt dieses Zeug und sagt: " Weißt du, mein Leben wäre so viel einfacher und ich hätte so viel mehr Freizeit, wenn dies nur in GLSL-Code geschrieben wäre, anstatt Blueprints zu verwenden. " Wahrscheinlich nie.

Das heißt, ich habe viele proprietäre Codegeneratoren kennengelernt, die mir das Leben erschwert haben. Dadurch lernte ich diese blöde Metasprache, die nur sehr eingeschränkte Vorteile hat, wenn sie Code in der Sprache des generierten Codes schreibt. Für mich ist ein verräterisches Zeichen der Codegenerierung ein Zeichen, das nicht viel mehr bewirkt, als eine kleine Menge an Boilerplate zu reduzieren, und beispielsweise die Möglichkeit von Fehlern nicht wirklich verringert. Sie wissen, dass es besonders schade ist, wenn es tatsächlich neue Wege einführt, um Fehler zu verursachen, die die Originalsprache nicht hatte. Aber es gibt Fälle für die Codegenerierung, wie die oben genannten, in denen der Produktivitätsschub so massiv ist, dass akribische Dinge, die enorm viel Zeit kosten, jetzt ein paar Cent kosten, dass niemand sie jemals benutzen und dann zurückblicken würde.

Für mich gibt es ein legitimeres Argument für die proprietäre Entwicklung von Blueprints im Epic-Team als viele überflüssige Programmiersprachen für die breite Öffentlichkeit, die kaum etwas Neues auf den Tisch bringen.


1

Ich würde in Ihrem Fall sagen, dass dies die Qualität ein wenig verbessert, aber die Entwicklungszeit um ein Vielfaches verkürzt. Manchmal ist der generierte Code flockig, umständlich oder einfach nur schlecht. In diesen Fällen kann der generierte Code die Qualität verringern und dem Projekt mehr Test- / Korrektur- / Regressionstestzeit hinzufügen. Und einige Aufgaben sind einfach zu komplex, um einfach generiert zu werden - der Generator wird zu einem eigenen System (möglicherweise größer und komplexer als das Hauptprojekt).

Codegeneratoren sind in Ordnung, aber seien Sie vorsichtig mit ihnen!


1

Früher habe ich in einem Geschäft gearbeitet, das sich stark auf die Codegenerierung stützte. In meinen Augen war der Code für das Projekt sehr einheitlich. Und in dieser Hinsicht war die Qualität in Ordnung.

Wenn Sie jedoch keinen benutzerdefinierten Code mehr schreiben dürfen, weil alles durch den Generator laufen muss, verlieren Sie meiner Meinung nach einen Teil des Vorteils, ein Programmierer zu sein.

Daher denke ich, dass dies mit Sicherheit ein Thema mit doppelter Klinge ist. Ja, Generatoren sind großartig, weil sie Fehler reduzieren und die Codestandards erhöhen. Sie machen jedoch auch einige Programmierer dumm, weil sie auf Generatoren angewiesen sind, anstatt sich die Hände schmutzig machen zu müssen.

Nur meine 2 Cent.


3
Assembler-Programmierer pflegten dies über Compiler zu sagen. Ich bin mir nicht sicher, ob dies ein gutes Argument ist. Sich die Hände schmutzig machen zu müssen, kann eine gute Lernerfahrung sein, aber wenn Sie erst einmal gelernt haben, sollten Sie das produktivste verfügbare Tool verwenden.
MarkJ

@ MarkJ: Manchmal kann Assemblierung tatsächlich besser sein als eine kompilierte Sprache, um die Einheitlichkeit zu gewährleisten. In einigen eingebetteten Systemen ist es beispielsweise nützlich, das Äquivalent von x=someValue ^ 0xFF ^ 0xFF ^ 0xFF ^ 0xFF;vier XOR-Literal-Befehlen codieren zu können und diese codieren zu lassen. Wenn das Codespeichermedium nur leere (0xFF) Bytes schreiben kann, ermöglicht das obige Konstrukt vier willkürliche Änderungen des Werts. Selbst wenn man den Ausdruck als umschrieb x=someValue; x = x ^ 0xFF ^ 0xFF ^ 0xFF ^ 0xFF;und der Compiler zur Laufzeit alle xors auswertete, könnte er dennoch ein "alle Bits ergänzen" verwenden ...
supercat

... eher eine Anweisung als eine xor-unmittelbare.
Supercat

1

Zusätzlich zu Martins Antwort möchte ich hinzufügen, dass die SQL-Codegenerierung sehr gut ist, wenn Sie Datensatz für Datensatz arbeiten tab1.pkcolumn =: parameter, etc). Und Ihr ORM wird in diesem Szenario glänzen, da sich die zu generierende SQL tatsächlich wiederholt.

Meine Hauptsorge sind Metaabfragen - Abfragen zu Objekteigenschaften, die der ORM mit einem beliebigen Algorithmus in SQL umsetzt. Sehr ähnliche Metaqueries können SQL generieren, das völlig anders ist - und es kann nicht garantiert werden, dass dieses generierte SQL performatisch ist.

Eine Metaquery-Sprache, die in eine andere Sprache (SQL) übersetzt wird, die in einen Abfrageplan übersetzt wird, um die Datenerfassung effektiv auszuführen. Und das generierte Ergebnis muss Objekte sein, also muss der ORM die betroffenen Objekte instanziieren - damit ein weiterer Regen von Abfragen ausgelöst wird, um die Attribute der Objekte zu füllen, die nicht von der Metaquery selbst gebracht wurden ...


0

Ich stimme voll und ganz denen zu, die sagen, dass die Codegenerierung in Ordnung ist, solange Sie den generierten Code nie bearbeiten müssen (am besten nie anschauen müssen).

Wenn wir akzeptieren können, dass der generierte Code ungefähr so ​​viele Zeilen enthält, wie von Hand geschrieben, und wenn wir sagen können, dass er fehlerfrei ist, hat sich die Anzahl der Zeilen, die möglicherweise Fehler enthalten, verringert. Ergo sollte die Codequalität erhöht werden.


Nachtrag: Natürlich können auch andere Faktoren wie die Ausführungszeit eine Rolle spielen.

Persönlich habe ich einige Codegeneratoren geschrieben, aber nie als erster Ansatz.

Es war schon immer so, als ich ein sich wiederholendes Muster im vorhandenen Code bemerkte, sodass mein Generator beim Hinzufügen von neuem, aber ähnlichem Code und beim Parametrisieren einiger variabler Teile davon vorhandenen Code verwendet.

Insofern ist mein generierter Code fast identisch mit vorhandenem handgeschriebenem Code (abgesehen davon, dass er dazu tendiert, visuell übersichtlicher und einheitlicher zu sein, was meiner Meinung nach die Lesbarkeit erleichtert, wenn er jemals betrachtet werden muss).

Übrigens empfehle ich, öffnende / schließende Kommentare einzufügen, die darauf hinweisen, dass der Code generiert wurde, einschließlich der Details des Tools und seines Betreuers.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.