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.
quelle
Antworten:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
Code-Generierung ist gut, wenn:
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.
quelle
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.
quelle
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:
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.
quelle
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!
quelle
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.
quelle
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 umschriebx=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 ...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 ...
quelle
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.
quelle