Frage

Der pragmatische Programmierer befürwortet die Verwendung von Codegeneratoren. Erstellen Sie Codegeneratoren für Ihre Projekte? Wenn ja, wofür verwenden Sie sie?

War es hilfreich?

Lösung

Codegeneratoren, wenn sie ohne korrekte Argumentation häufig verwendet werden, machen Code weniger verständlich und verringern die Wartbarkeit (die gleiche mit dynamischer SQL übrigens). Persönlich verwende ich es mit einigen Orm-Tools, da ihre Verwendung hier meist offensichtlich und manchmal für Dinge wie Sucher-Parser-Algorithmen und grammatische Analysatoren, die in letzter Zeit nicht von den Händen "von den Händen" konzipiert werden sollen. Prost.

Andere Tipps

In "Pragmatischer Programmierer" unterscheiden Hunt und Thomas zwischen passiven und aktiven Codegeneratoren.

Passive Generatoren sind verkleinert, woraufhin Sie das Ergebnis bearbeiten.

Aktive Generatoren werden so oft wie gewünscht ausgeführt, und Sie sollten das Ergebnis niemals bearbeiten, da es ersetzt wird.

IMO, Letzteres sind viel wertvoller, weil sie sich dem trockenen (nicht reparierten) Prinzip nähern.

Wenn die Eingabeinformationen in Ihr Programm in zwei Teile aufgeteilt werden können, wechselt der Teil, der selten (a) (wie Metadaten oder DSL) ändert, und der Teil, der jedes Mal unterschiedlich ist, wenn das Programm ausgeführt wird (b) (die Live -Eingabe) Sie können ein Generatorprogramm schreiben, das nur A als Eingabe aufnimmt, und ein Ad-hoc-Programm herausstellt, das B nur als Eingabe nimmt. (Ein anderer Name dafür ist eine teilweise Bewertung.)

Das Generatorprogramm ist einfacher, da es nur durch Eingabe A, nicht A und B. durchwaten muss. Außerdem muss es nicht schnell sein, da es nicht oft ausgeführt wird und sich nicht um Speicherlecks kümmern muss.

Das Ad-hoc-Programm ist schneller, da es nicht immer durch Eingaben waten muss, die fast immer gleich sind (a). Es ist einfacher, weil es nur Entscheidungen über Eingabe B, nicht A und B. treffen muss

Es ist eine gute Idee, dass das generierte Ad-hoc-Programm ziemlich lesbar ist, sodass Sie leichter Fehler darin finden können. Sobald Sie die Fehler vom Generator entfernt haben, sind sie für immer verschwunden.

In einem Projekt, an dem ich arbeitete, entwarf ein Team eine komplexe Datenbankanwendung mit einer Entwurfsspezifikation von zwei Zoll dick und einem langwierigen Implementierungsplan, der mit Bedenken hinsichtlich der Leistung behaftet ist. Durch das Schreiben eines Codegenerators haben zwei Personen in drei Monaten den Job gemacht, und die Quellcode-Listings (in C) waren etwa einen halben Zoll dick, und der generierte Code war so schnell, dass es kein Problem war. Das Ad-hoc-Programm wurde wöchentlich zu trivialen Kosten regeneriert.

So aktive Codegenerierung, Wenn Sie es verwenden können, ist eine Win-Win-Situation. Und ich denke, es ist kein Zufall, dass dies genau das ist, was Compiler tun.

Im Hardware -Design ist es ziemlich üblich, dies auf mehreren Ebenen des "Stapels" zu tun. Zum Beispiel schrieb ich einen Codegenerator, um Verilog für verschiedene Breiten, Topologien und Strukturen von DMA -Motoren und Querlattenschalter auszugeben, da die zur Ausdruck dieser Parametrisierung erforderlichen Konstrukte in den Synthese- und Simulation -Tool -Flows noch nicht reif waren.

Es ist auch Routine, logische Modelle bis hin zu Layoutdaten für sehr regelmäßige Dinge auszugeben, die algorithmisch ausgedrückt und generiert werden können, wie SRAM-, Cache- und Registerdateistrukturen.

Ich habe auch ein bisschen Zeit damit verbracht, im Wesentlichen einen Codegenerator zu schreiben, der eine XML-Beschreibung aller Register auf einem System-On-Chip aufnimmt und HTML ausgibt (ja, ja, ich weiß über XSLT, ich habe gerade herausgefunden, Es ist programmatisch zeitlich effizienter), Verilog, Systemverilog, C, Montage usw. "Ansichten" dieser Daten für verschiedene Teams (Front-End- und Back-End-ASIC-Design, Firmware, Dokumentation usw.), die sie verwenden (und Halten Sie sie aufgrund dieser einzelnen XML -Codebasis ") konsistent. Zählt das?

Menschen schreiben auch gerne Codegeneratoren für z.

Wir verwenden Codegeneratoren zum Generieren von Datenentitätsklassen, Datenbankobjekten (wie Auslöser, gespeicherten Procs), Service -Proxies usw. Überall, wo Sie viele repititive Code folgen, folgt ein Muster und eine Menge manueller Arbeiten, können Codegeneratoren helfen. Sie sollten es jedoch nicht zu viel verwenden, um zu verlängern, dass Wartbarkeit ein Schmerz ist. Einige Probleme treten auch auf, wenn Sie sie regenerieren möchten.

Tools wie Visual Studio, Codesmith haben für die meisten gemeinsamen Aufgaben ihre eigenen Vorlagen und erleichtern diesen Vorgang. Aber es ist einfach, alleine auszutreten.

Es ist oft nützlich, einen Codegenerator zu erstellen, der Code aus einer Spezifikation generiert - normalerweise eines mit regelmäßigen tabellarischen Regeln. Es verringert die Wahrscheinlichkeit, einen Fehler über einen Tippfehler oder eine Auslassung einzuführen.

Ja, ich habe meinen eigenen Codegenerator für AAA -Protokolldurchmesser (RFC 3588) entwickelt. Es könnte Strukturen und APIs für Durchmessernachrichten erzeugen, die von einer XML -Datei gelesen werden, die die Grammatik der Anwendung des Durchmessers beschrieben hat.

Dies reduzierte die Zeit für die Entwicklung eines vollständigen Durchmesserschnittels (wie Sh/CX/RO usw.).

Meiner Meinung nach würde eine gute Programmiersprache keine Codegeneratoren benötigen, da die Erzeugung von Selbstbeobachtungs- und Laufzeitcode Teil der Sprache in Python -Metaklasse und neuem Modul usw. ist.

Codegeneratoren generieren in der Regel mehr unüberschaubarer Code in langfristiger Verwendung.

Wenn es jedoch absolut unerlässlich ist, einen Codegenerator zu verwenden (Eclipse VE für die Schwungentwicklung ist das, was ich manchmal verwende), stellen Sie sicher, dass Sie wissen, welcher Code generiert wird. Glauben Sie mir, Sie möchten keinen Code in Ihrer Anwendung, mit dem Sie nicht vertraut sind.

Das Schreiben eines eigenen Generators für das Projekt ist nicht effizient. Verwenden Sie stattdessen einen Generator wie T4, Codesmith und Zontroy.

T4 ist komplexer und Sie müssen eine .NET -Programmiersprache kennen. Sie müssen Ihre Vorlagenzeile für Zeile schreiben und müssen selbst relationale Vorgänge ausführen. Sie können es über Visual Studio verwenden.

Codesmith ist ein funktionales Werkzeug und es sind viele Vorlagen zur Verwendung bereit. Es basiert auf T4 und das Schreiben Ihrer eigenen Temlate braucht zu viel Zeit wie in T4. Es gibt eine Testversion und eine kommerzielle Version.

Zontroy ist ein neues Tool mit einer benutzerfreundlichen Benutzeroberfläche. Es hat eine eigene Vorlagensprache und ist leicht zu lernen. Es gibt einen Online -Vorlagenmarkt, der sich entwickelt. Sogar Sie können Vorlagen liefern und online über den Markt verkaufen. Es hat eine kostenlose und eine kommerzielle Version. Sogar die kostenlose Version reicht aus, um ein mittelgroßes Projekt abzuschließen.

Es gibt möglicherweise viele Codegeneratoren da draußen, aber ich erstelle immer meine eigene, um den Code verständlicher zu machen und die Frameworks und Richtlinien anzupassen, die wir verwenden

Wir verwenden einen Generator für alle neuen Code, um sicherzustellen, dass die Codierungsstandards befolgt werden.

Wir haben kürzlich unseren internen C ++-Generator durch ersetzt durch Codesmith. Wir müssen immer noch die Vorlagen für das Werkzeug erstellen, aber es scheint ideal, das Werkzeug selbst nicht aufrechtzuerhalten.

Mein jüngster Bedarf an einem Generator war ein Projekt mit der Lesung von Daten aus Hardware und letztendlich in eine "Dashboard" -Veroberung. Zwischenmodellen, Eigenschaften, Moderatoren, Ereignissen, Schnittstellen, Flaggen usw. für mehrere Datenpunkte. Ich habe den Framework für ein paar Datenpunkte ausgearbeitet, bis ich zufrieden war, dass ich mit dem Design leben konnte. Mit Hilfe einiger sorgfältig platzierter Kommentare habe ich die "Generation" in ein Visual Studio -Makro eingefügt, das Makro optimiert und gereinigt, die Datenpunkte zu einer Funktion im Makro hinzugefügt, um die Generation aufzurufen - und speichern mehrere langwierige Stunden (Tage ?) schlussendlich.

Unterschätzen Sie nicht die Macht von Makros :)


Ich versuche jetzt auch, meinen Kopf herumzukommen Coderush Anpassungsfunktionen, die mir bei einigen weiteren Anforderungen an die lokale Generation helfen. Es gibt leistungsstarke Sachen, wenn Sie beim Generieren eines Codeblocks eine Entscheidungsfindung im Laufe der Fliege benötigen.

Ich habe meinen eigenen Codegenerator, den ich gegen SQL -Tabellen ausführe. Es generiert die SQL -Prozeduren, um auf die Daten, die Datenzugriffsschicht und die Geschäftslogik zuzugreifen. Es hat Wunder getan, meinen Code zu standardisieren und Konventionen zu benennen. Da es bestimmte Felder in den Datenbanktabellen erwartet (z. B. eine ID -Spalte und aktualisierte DateTime -Spalte), hat es auch dazu beigetragen, mein Datendesign zu standardisieren.

Wie viele suchen Sie? Ich habe zwei wichtige und zahlreiche kleinere geschaffen. Die erste der wichtigsten ermöglichten es mir, Programme 1500 Line -Programme zu generieren (geben oder nehmen), die eine starke Familienähnlichkeit hatten, aber auf die verschiedenen Tabellen in einer Datenbank abgestimmt waren - und dies schnell und zuverlässig zu tun.

Der Nachteil eines Codegenerators ist, dass bei einem Fehler im generierten Code (weil die Vorlage einen Fehler enthält), dann eine Menge Korrekturen vorhanden ist.

Für Sprachen oder Systeme, in denen eine Menge nahezu repetitiver Codierung vorliegt, ist ein guter (genügend) Codegenerator jedoch ein Segen (und ein Segen als ein "Doggle").

Ja, ich musste ein paar unterhalten. CORBA oder ein anderer Objektkommunikationsstil der Schnittstelle ist wahrscheinlich die allgemeine Sache, an die ich zuerst denke. Sie haben Objektdefinitionen, die Ihnen von der Schnittstelle übergeben werden, über die Sie sprechen werden, aber Sie müssen diese Objekte immer noch im Code aufbauen. Das Erstellen und Ausführen eines Codegenerators ist eine ziemlich routinemäßige Möglichkeit, dies zu tun. Dies kann zu einem ziemlich langen Kompilieren werden, nur um einen älteren Kommunikationskanal zu unterstützen, und da es eine große Tendenz gibt, Wrapper in Corba zu bringen, um es einfacher zu machen, wird es nur noch schlimmer.

Im Allgemeinen, wenn Sie über eine große Menge an Strukturen verfügen oder sich nur schnell ändert, die Sie verwenden müssen, können Sie jedoch nicht mit dem Leistungsschlag von Objekten über Metadaten umgehen, dann können Sie einen Codegenerator schreiben.

Ich kann mir keine Projekte vorstellen, bei denen wir unsere eigenen Codegeneratoren von Grund auf neu erstellen mussten, aber es gibt mehrere, bei denen wir bereits vorhandene Generatoren verwendet haben. (Ich habe sowohl Antlr als auch das Eclipse -Modellierungsrahmen zum Aufbau von Parsers und Modellen in Java für Enterprise -Software verwendet.) Das Schöne an der Verwendung eines Codeberators, den jemand anderes geschrieben hat Dass ich noch nicht einmal wusste, dass es existierte. Das spart mir Zeit und Frustration.

Obwohl ich vielleicht Code schreiben kann, das das Problem löst, kann ich den Code viel schneller generieren und es besteht eine gute Chance, dass er weniger fehlerhaft ist als alles, was ich schreibe.

Wenn Sie den Code nicht schreiben, werden Sie sich mit dem generierten Code eines anderen wohlfühlen?

Ist es auf lange Sicht sowohl in der Zeit als auch in $$$ billiger, Ihren eigenen Code- oder Codegenerator zu schreiben?

Ich habe einen Codegenerator geschrieben, der 100 Klassen (JAVA) erstellt, die XML -Daten aus der Datenbank in DTD- oder Schema -konform ausgeben würden. Die Codegenerierung war im Allgemeinen eine einmalige Sache, und der Code würde dann mit verschiedenen Geschäftsregeln usw. zusammengefasst werden usw. Die Ausgabe war für eine eher pedantische Bank.

Codegeneratoren sind für Programmiersprachenbeschränkungen gearbeitet. Ich persönlich bevorzuge Reflexion anstelle von Codegeneratoren, stimme jedoch zu, dass Codegeneratoren flexibler und resultierender sind, die während der Laufzeit offensichtlich schneller sind. Ich hoffe, zukünftige Versionen von C# werden eine Art DSL -Umgebung enthalten.

Die einzigen Codegeneratoren, die ich verwende, sind WebService -Parsers. Ich persönlich halte mich aufgrund der Wartungsprobleme für neue Mitarbeiter oder ein separates Team nach der Hand von Codegeneratoren fern.

Ich schreibe meine eigenen Codegeneratoren, hauptsächlich in T-SQL, die während des Build-Prozesses aufgerufen werden.

Basierend auf Meta-Model-Daten generieren sie Auslöser, Protokollierung, C# const deklarationen, Einfügen/Aktualisieren von Anweisungen und Datenmodellinformationen, um zu überprüfen, ob die App im erwarteten Datenbankschema ausgeführt wird.

Ich muss noch einen Formularegenerator für erhöhte Produktivität, mehr Spezifikationen und weniger Codierung schreiben;)

Ich habe ein paar Codegeneratoren erstellt. Ich hatte einen passiven Codegenerator für SQL -gespeicherte Verfahren, bei denen Vorlagen verwendet wurden. Dies erzeugte 90% unserer gespeicherten Verfahren.

Da wir den Wechsel zum Entity -Framework gemacht haben, habe ich mit T4 einen aktiven CodeGenerator erstellt (Textvorlagetransformations -Toolkit) Innerhalb von Visual Studio. Ich habe es verwendet, um grundlegende Teilnehmer -Teilklassen für unsere Entitäten zu erstellen. Funktioniert sehr gut und rettet eine Reihe von Codierung. Ich verwende auch T4, um die Entitätsklassen mit bestimmten Attributen zu dekorieren.

Ich verwende die Funktionen der Codegenerierung von Funktionen von EMF - Eclipse Modeling Framework.

Codegeneratoren sind in vielen Fällen sehr nützlich, insbesondere wenn sie von einem Format auf ein anderes abbilden. Ich habe Codegeneratoren für IDL zu C ++, Datenbanktabellen zu OO -Typen und Marshalling -Code erstellt, um nur einige zu nennen.

Ich denke, der Punkt, den die Autoren zu machen versuchen, ist, dass Sie als Entwickler in der Lage sein sollten, den Computer für Sie zu funktionieren. Das Generieren von Code ist nur eine offensichtliche Aufgabe, um zu automatisieren.

Ich habe einmal mit einem Mann zusammengearbeitet, der darauf bestand, dass er unsere IDL manuell auf C ++ Mapping machen würde. Zu Beginn des Projekts konnte er mithalten, weil der Rest von uns versuchte herauszufinden, was zu tun war, aber schließlich wurde er ein Engpass. Ich habe einen Codegenerator in Perl gemacht und dann konnten wir in ein paar Minuten so ziemlich seine "Arbeit" erledigen.

Sehen Sie unsere "Universal" Codegenerator Basierend auf Programmtransformationen.

Ich bin der Architekt und ein wichtiger Implementierer. Es ist erwähnenswert, dass ein signifikanter Teil dieses Generators mit diesem Generator generiert wird.

In eingebetteten Systemen benötigen Sie manchmal einen großen Block binärer Daten im Blitz. Zum Beispiel habe ich eine, die eine Textdatei mit Bitmap -Schriftglyphen enthält und sie in ein .cc/.h -Dateipaar verwandelt, das interessante Konstanten (wie das erste Zeichen, das letzte Zeichen, die Zeichenbreite und die Höhe) und dann die tatsächlichen Daten als tatsächliche Daten deklariert ein großer static const uint8_t[].

Der Versuch, so etwas in C ++ selbst selbst zu tun, sodass die Schriftart Daten ohne Erstpass automatisch generiert würden, wäre ein Schmerz und höchstwahrscheinlich unleserlich. Das Schreiben einer .o -Datei von Hand ist nicht in Frage. So ist das Ausbruch von Diagrammpapier, Handcodierung von Binär und tippt all das in ein.

IMHO, so etwas ist das, wofür Codegeneratoren sind. Vergessen Sie niemals, dass der Computer für Sie funktioniert, nicht umgekehrt.

Übrigens, wenn Sie einen Generator verwenden, Immer immer Fügen Sie einige Zeilen wie diese sowohl zu Beginn als auch am Ende jeder generierten Datei hinzu:

// This code was automatically generated from Font_foo.txt. DO NOT EDIT THIS FILE.
// If there's a bug, fix the font text file or the generator program, not this file.

Wir benutzen Telosys Codegenerator in unseren Projekten: http://www.telosys.org/

Wir haben es geschaffen, um die Entwicklungsdauer bei wiederkehrenden Aufgaben wie Crud -Bildschirmen, Dokumentation usw. zu verringern ...

Für uns ist es das Wichtigste, die Vorlagen des Generators anzupassen, um bei Bedarf neue Generationen zu erstellen und vorhandene Vorlagen anzupassen. Aus diesem Grund haben wir auch einen Template -Editor erstellt (für Geschwindigkeit .vm -Dateien). Es funktioniert einwandfrei für Java/Spring/AngularJS -Codegenerator und kann für andere Ziele angepasst werden (PHP, C#, Python usw.)

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