Ho una struttura piccola ma in crescita per building .net systems with ruby/rake, su cui sto lavorando da un po 'di tempo. In questa base di codice, ho la seguente:Come posso convertire questo codice in meta-programmazione, quindi posso smettere di duplicarlo?
require 'rake/tasklib'
def assemblyinfo(name=:assemblyinfo, *args, &block)
Albacore::AssemblyInfoTask.new(name, *args, &block)
end
module Albacore
class AssemblyInfoTask < Albacore::AlbacoreTask
def execute(name)
asm = AssemblyInfo.new
asm.load_config_by_task_name(name)
call_task_block(asm)
asm.write
fail if asm.failed
end
end
end
il modello che questo codice segue viene ripetuto circa 20 volte nel quadro. La differenza in ogni versione è il nome della classe che viene creata/chiamata (anziché AssemblyInfoTask, potrebbe essere MSBuildTask o NUnitTask) e il contenuto del metodo execute. Ogni attività ha la propria implementazione del metodo di esecuzione.
Correggendo costantemente bug in questo modello di codice e devo ripetere la correzione 20 volte, ogni volta che ho bisogno di una correzione.
So che è possibile eseguire alcune metamodifiche magiche e collegare questo codice per ognuna delle mie attività da una singola posizione ... ma sto facendo davvero fatica a farlo funzionare.
la mia idea è che voglio essere in grado di chiamare qualcosa di simile:
create_task :assemblyinfo do |name|
asm = AssemblyInfo.new
asm.load_config_by_task_name(name)
call_task_block(asm)
asm.write
fail if asm.failed
end
e questo sarebbe cablare tutto quello che mi serve.
Ho bisogno di aiuto! suggerimenti, suggerimenti, qualcuno disposto ad affrontare questo ... come posso evitare di dover ripetere questo schema di codice più e più volte?
Aggiornamento: È possibile ottenere il codice sorgente completo qui: http://github.com/derickbailey/Albacore/ il codice fornito è /lib/rake/assemblyinfotask.rb
+1 per l'uso di Github, molto bello poter navigare su tutta la fonte. – Xorlev
Perché non metti tutti gli errori di classe nel file del modulo? L'approccio di metaprogrammo quindi ti salva solo 1 linea di codice reale (non "di fine"), mentre a costo di una maggiore offuscazione. A meno che non sia necessario definire dinamicamente le attività, utilizzerei semplicemente l'approccio vanilla. – klochner
. . . a meno che, naturalmente, questo non sia un esercizio di apprendimento piuttosto che un progetto finito. – klochner