Laden...

Code Generatoren...

Erstellt von Timur Zanagar vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.280 Views
Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 18 Jahren
Code Generatoren...

Hallo an alle,

mich würde es interessieren welche Code Generatoren benutzt werden oder auch nicht benutzt werden und zu welchem Zweck diese eingesetzt werden.

Gruß

1.373 Beiträge seit 2004
vor 18 Jahren

Erklär mal genauer, was du mit Codegeneratoren meinst.

Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 18 Jahren

Es geht um Codegeneratoren wie CodeSmith oder MyGeneration. Ich habe nun einige ausprobiert aber so richtig den Draht dazu nicht gefunden und wollte nun wissen ob die Community Generatoren benutzt.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo burning snow,

zum Thema O/R-Mapper gibt es in O/R Mapper oder direkter DB-Zugriff??? eine ausführliche Diskussion.

herbivore

C
980 Beiträge seit 2003
vor 18 Jahren

Ich habe gerade vorhin wieder mal xsd.exe verwendet, mit dem man ganze Klassenhierarchien aus einem XML Schema extrahieren kann ... ist ja auch ein Code Generator, wenn er auch v.a. Struktur generiert, weniger ausführbarer Code ...

M
456 Beiträge seit 2004
vor 18 Jahren

Auf Codeproject gab's dazu auch mal was:
http://www.codeproject.com/csharp/DeclarativeClassGenerator.asp

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

3.728 Beiträge seit 2005
vor 18 Jahren
BizTalk Server

Für verteilte dienstorientierte Geschäftsanwendungen kannst Du BizTalk Server einsetzen. Der Code wird dort hauptsächlich grafisch zusammengeklickt (Orchestration). Beim bereitstellen dieser Orchestrations werden sie aber in MSIL-Code kompilliert. Deshalb kann man BizTalk Server Orchestrations auch als Code-Generator bezeichnen.

Der Vorteil gegenüber anderen Generatoren liegt darin, dass man an beliebigen Stellen in so einer grafischen Orchestration direkt eigenen C#-Code einfügen kann (Der wird beim bereitstellen natürlich auch kompilliert). Auch bestehenden Assemblies können eingebunden und verwendet werden. Man wird also nicht eingeschränkt, da man die kniffligen Sachen immernoch selbst programmieren kann. Trotzdem spart man sich viel Zeit, weil Standardabläufe zusammengeklickt werden können. Besondersn langlaufende Workflows (wie z.B. eine Kundenbestellung bis zur Warenauslieferung) können mit dem BizTalk Server sehr gut umgesetzt werden.

Alle Aussagen beziehen sich auf den BizTalk Server 2004. Die früheren Versionen sind nicht zu empfehlen.

C
980 Beiträge seit 2003
vor 18 Jahren

(Genau ... wobei man vielleicht im "Hinterkopf" behalten sollte, das der Orchestration Teil des BizTalk Servers in nächster Version offenbar mit WinFX WWF ersetzt wird.)

Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 18 Jahren

WinFX WWF hört sich nicht schlecht an. Zwar hab ich durchgelesen aber nicht verstanden wozu man es einsetzten kann.

Kann mir jemand ein Beispiel geben. Bin gerade z.B. an einer kleinen "Warenwirtschaft" dran.

Könnte WinFX WWF meine Arbeit dabei vereinfachen? (Ich weiß das man es dann bei Windows XP zusätzlich installieren muss. In Vista soll es ja dabei sein.)

C
980 Beiträge seit 2003
vor 18 Jahren
3.728 Beiträge seit 2005
vor 18 Jahren
Standards

Standards wie XLANG und BPEL(4WS) werden weiterhin Gültigkeit haben. Ob die Engine sich ändert ist zweitrangig. Alter Wein in neuen Schläuchen!

4.221 Beiträge seit 2005
vor 18 Jahren

Original von burning snow
mich würde es interessieren welche Code Generatoren benutzt werden oder auch nicht benutzt werden und zu welchem Zweck diese eingesetzt werden.

Um hier wieder auf das ursprüngliche Thema zurückzukommen.

Ich verwende selber geschriebene CodeGeneratoren um mir Routine-Arbeiten abzunehmen...... Pro Anwendung generiere ich sicher meist zwischen 1000 und 3000 Zeilen Code (je nach Anwendungsgrösse).....

Generierter Code ist guter Code (keine Tippfehler)....

Zudem ist der CodeGen ein Investitionsschutz, da dieser dem Kunden nicht ausgeliefert wird.... Wenn nun jemand Frameworkkomponenten entwendet kann er mit diesen gar nicht viel anfangen... ausser er will all den Code welchen ich zur Verwendung der Komponenten generiere von Hand schreiben..... Zudem kann ich mit dem generierten Code auch Hotfixes einspielen (CodeGen erweitern / Client - Code neu generieren)... usw.

Schade werd ich nicht nach Anzahl CodeZeilen bezahlt 😉

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 18 Jahren

Gut das wir doch noch zum Thema gekommen sind 🙂

Ich hatte ja schon einige CodeGeneratoren angeschaut und keines war mir irgendwie gut genug.

Meines erachtens soll auch ein CodeGenerator so viel Arbeit wie möglich beim erstellen von Templates helfen und das habe ich immer vermisst.

Man muss sich meist mehr in die CodeGeneratoren einarbeiten als man eigentlich erzeugen möchte 🙂 Übertrieben ausgedrückt.

Ich habe mir auch schon selber überlegt für meine Zwecke einen Generator zu programmieren. Ich glaube das werde ich auch machen.

Wie du schon sagtest: Leider werden wir nicht pro Zeile bezahlt 🙂 Naja, aber wir als Programmierer sollten meines erachtens auf die nächste Ebene der Programmierung kommen und wirklich wiederkehrenden Code so schnell wie möglich erzeugen und uns auf die Kernfunktionen kümmern.

Dadurch kann man dann einfach einen besseres Programm abliefern.

Darf ich fragen wie du deinen Code erzeugst und was du erzeugst?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo burning snow,

Codegeneratoren sind ja nur dann wirklich nützlich, wenn man den Code danach nicht ändern muss. Wenn man das tun muss, ist ein Codegenerator eher schändlich als nützlich.

Davon abgesehen kann man ja "wiederkehrenden Code" oft auch in eine Klasse packen. Immerhin ist das Prinzip von Codegenerator Wiederverwendung durch "Kopieren" von Code. Besser ist aber Wiederverwendung durch Benutzen von Code (also des in die Klasse gepackten Codes).

herbivore

4.221 Beiträge seit 2005
vor 18 Jahren

@herbivore
Ja logisch hab alles so weit generisch geschrieben wie es geht .... die Logik ist voll gekapselt.

Mit dem Codegenerator schreib ich mir ganze "Typisierte Klassen" welche die Zugriffe auf die generischen Klassen wrappt....

Da ich nicht all zu tief auf Details eingehen möchte, versuche ich mal ein Beispiel für Datenzugriffe zu machen.

Gegeben sind:

-n - Typisierte DatenBezugsklassen eines Fremdanbieters

Ziel:

Eine Typisierte DatenControllerKlasse welche alle DatenBezugsklassen kapselt und steuert....

Es werden also die original DatenBezugsklassen per Reflection eingelesen. Diese Daten können dann modelliert werden (virtuelle Relations usw.). Anschliessend werden Metadaten geschrieben. Diese können dann beim Code generieren als Grundlage für den zu erstellenden Code herhalten (in Kombination mit der aktuellen Version der DatenBezugsklasse).

Zugriffe auf die DatenBezugsklassen ist dann nur noch über den Controller möglich und sinnvoll.... Der Controller kann z.B: Connections handeln / Daten cachen / Daten verzögert beziehen usw........ Logging von Exceptions oder auf Wunsch auch Trace-Logs usw... (dies wird dann generisch gelöst)

Der Wrapper wrappt also im Prinzip die Methoden der original Klassen auf eine Klasse drauf welche von einer generischen Klasse ableitet....

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 18 Jahren

Original von herbivore
Hallo burning snow,

Codegeneratoren sind ja nur dann wirklich nützlich, wenn man den Code danach nicht ändern muss. Wenn man das tun muss, ist ein Codegenerator eher schändlich als nützlich.

Davon abgesehen kann man ja "wiederkehrenden Code" oft auch in eine Klasse packen. Immerhin ist das Prinzip von Codegenerator Wiederverwendung durch "Kopieren" von Code. Besser ist aber Wiederverwendung durch Benutzen von Code (also des in die Klasse gepackten Codes).

herbivore

Sorry, aber wie es aussieht habe ich mir falsch ausgedrückt.

Natürlich wird "wiederkehrender Code" in entsprechende Klassen gepackt.

Aber ich schreibe mir einen Generator der diesen Code dynamisch für verschiedene Projekte generiert.

Das ganze kann man in Data Access Layern, Business Layern und im UI machen. Es gibt immer Code der wiederkehrend ist aber nicht unbedingt in eine extra Library gepackt werden kann.

Ich habe z.B. vor mit meinem Generator CRUD fähigen Code im 3-Tier Konzept zu erzeugen. Dieser Generator soll dann auch die entsprechenden UIs und die entsprechenden Projektdaten für VS.NET erzeugen.

Nun kann man diesen Code für beliebige Zwecke ändern und hat ein Augenmerk auf die entsprechenden speziellen Funktionen.

Als Programmierer sollte man sich mit CRUD Geschichten nicht immer wieder auseinandersetzten müssen und das ganze in einem Template komplett immer wieder verbessern.

Der Vorteil:

  • Wenn man, so wie ich, viele Anwendungen mit entsprechenden CRUD Funktionen schreibt, schnell diese erstellen kann.
  • Dieser Code ist fehlerfrei erzeugt.
  • Man beschäftigt sich mit der Logik und dem UI der Anwendung
  • Schneller zum Ziel kommen

Ich gebe dir vollkommen Recht auch immer wiederkehrenden Code in entsprechende Libraries zu verpacken, aber dies kann man nicht immer machen.

3.728 Beiträge seit 2005
vor 18 Jahren
Tipparbeit sparen

Tipparbeit sparen ist gut. Man muss nur aufpassen, dass man keine redundanten Implementierungen erzeugt. Angenommen ich muss Zuweisungen an Properties validieren. Wenn es viele Properties sind und ich immer ähnliche Prüfungen machen muss, könnte ich natürlich die Properties mitsamt dem Validierungscode einfach und schnell mit einem Code Generator erzeugen. Dieser müsste aber so intelligent sein und den Validierungscode in eine Funktion auslagern, die mit Parametern aus jeder Property aufgerufen wird.

Genau da ist der Knackpunkt. Meistens sind Code-Generatoren eher flach und können sowas nicht. Viele arbeiten mit Vorlagen, die Platzhalter enthalten (Copy & Paste). Natürlich kann man Code-Generatoren schreiben, die es besser machen. Aber dann sind sie nicht mehr flexibel und können nur noch für eine ganz bestimmte Aufgabe eingesetzt werden. Also muss man für viele Aufgaben viele Generatoren schreiben. Oder einen Super-Generator in dem richtig Hirnschmalz steckt. Der verschlingt aber über ein Jahr Entwicklungszeit und bis dahin hat man das Problem bereits von Hand gelöst. Natürlich tauchen ähnliche Probleme immer wieder auf. Allerdings auch neue Konzepte und Technologieen.

Man kann sich wirklich darüber streiten, ob automatisch generierter Code toll ist oder nicht. Ich persönlich setze Code Generatoren nur sehr dezent ein (Und wenn dann selbstgeschriebene). Bei größeren Anforderungsänderungen an Projekten (Die man nicht verhindern kann) ist automatisch generierter Code meistens tödlich, denn selten wird der Code so gelassen, wie er aus dem Generator kommt. Bei einer erneuten Generierung gehen solche Anpassungen verlohren.

Tippfehler sind bei VS.NET mit IntelliSense (Strg + Leer) eher selten. Selbst bei SQL-Statements gibt es sie nicht oft, da diese im Query Analyzer getestet werden.

Das schnellstmögliche Fertigstellen einer Anwendung ist nur die halbe Miete. Probleme bei Erweiterungen und Pflege können Softwarefirmen schnell ruinieren. Lieber mehr Wert auf gute Architektur und wiederverwendbare Komponenten legen.

_
416 Beiträge seit 2005
vor 18 Jahren

Hallo,

Original von Rainbird
Selbst bei SQL-Statements gibt es sie nicht oft, da diese im Query Analyzer getestet werden.

Hach ja, wenn da nicht immer diese dynamischen sql atatements wären. 😉

Ich hoffe im SQL Server 2010 kann auch SELECT @idspalte, @Beschriftungsspalte FROM @gewünschteTabelle schreiben, dynamische joins sowieso. Sonst werd ich wohl noch ewig nach Fehler wie: "Geht nich, weil will nich" suchen müssen 😉