Wie kann ich diesen Code in Meta-Programmierung umwandeln, damit ich aufhören kann, ihn zu duplizieren?

8

Ich habe einen kleinen, aber wachsenden Rahmen für den Aufbau von .net-Systemen mit Ruby / Rake , an dem ich schon seit einiger Zeit arbeite jetzt. In dieser Codebasis habe ich Folgendes:

%Vor%

Das Muster, dem dieser Code folgt, wird im Framework etwa 20 Mal wiederholt. Der Unterschied in jeder Version ist der Name der Klasse, die erstellt / aufgerufen wird (anstelle von AssemblyInfoTask, kann es MSBuildTask oder NUnitTask sein) und der Inhalt der execute-Methode. Jede Aufgabe hat ihre eigene Ausführung der Ausführungsmethode.

Ich repariere ständig Bugs in diesem Code-Muster und ich muss das Update 20 Mal wiederholen, jedes Mal wenn ich eine Reparatur brauche.

Ich weiß, dass es möglich ist, einige Meta-Programmierzauber zu machen und diesen Code für jede meiner Aufgaben von einem einzigen Ort aus zu verkabeln ... aber es fällt mir wirklich schwer, es zum Laufen zu bringen.

meine Idee ist, dass ich in der Lage sein möchte, so etwas zu nennen:

%Vor%

und das würde alles anschließen, was ich brauche.

Ich brauche Hilfe! Tipps, Vorschläge, jemand, der bereit ist, dies anzugehen ... Wie kann ich dieses Code-Muster immer wieder wiederholen?

Update: Sie können den vollständigen Quellcode hier abrufen: Ссылка der angegebene Code ist / lib / rake / assemblyinfotask.rb

    
Derick Bailey 17.02.2010, 01:30
quelle

2 Antworten

4

Ok, hier ist eine Metaprogrammierung, die das macht, was du willst (in ruby18 oder ruby19)

%Vor%

Die wichtigsten Werkzeuge in der Metaprogrammer-Toolbox sind:

  • class<<self;self;end - um die Metaklasse für jedes Objekt zu erhalten, so dass Sie Methoden für dieses Objekt definieren können
  • define_method - so können Sie Methoden definieren, die aktuelle lokale Variablen verwenden

Auch nützlich sind

  • const_set , const_get : erlauben Ihnen, Konstanten
  • zu setzen / zu erhalten
  • class_eval : erlaubt die Definition von Methoden mit def , als ob Sie in einer class <Classname> ... end -Region
  • wären
rampion 17.02.2010, 02:26
quelle
1

So etwas, getestet auf Ruby 1.8.6:

%Vor%

Das Kernstück ist die Methode "create_task":

  • Erstellt eine neue Klasse
  • fügt die execute-Methode
  • hinzu
  • Benennt die Klasse und macht sie verfügbar
nightshade427 17.02.2010 02:30
quelle

Tags und Links