J'ai un cadre petit mais croissant pour building .net systems with ruby/rake, sur lequel je travaille depuis longtemps. Dans cette base de code, je donne les résultats suivants:Comment puis-je convertir ce code en méta-programmation, donc je peux arrêter de le dupliquer?
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
le motif que ce code suit est répété environ 20 fois dans le cadre. La différence dans chaque version est le nom de la classe en cours de création/d'appel (au lieu de AssemblyInfoTask, il peut s'agir de MSBuildTask ou de NUnitTask), et le contenu de la méthode execute. Chaque tâche a sa propre implémentation de méthode d'exécution.
Je suis constamment fixer des bugs dans ce modèle de code et je dois répéter le correctif 20 fois, chaque fois que je besoin d'une solution.
Je sais qu'il est possible de faire de la magie de méta-programmation et câbler ce code pour chacun de mes tâches à partir d'un seul endroit ... mais je vais avoir une période très difficile à le faire fonctionner.
mon idée est que je veux être en mesure d'appeler quelque chose comme ceci:
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
et ce câblais tout ce que je besoin.
J'ai besoin d'aide! conseils, suggestions, quelqu'un qui veut s'attaquer à ce problème ... comment puis-je éviter de devoir répéter ce modèle de code encore et encore?
Mise à jour: Vous pouvez obtenir le code source complet ici: http://github.com/derickbailey/Albacore/ le code fourni est /lib/rake/assemblyinfotask.rb
+1 pour l'utilisation de Github, très agréable de pouvoir parcourir toute la source. – Xorlev
Pourquoi ne placez-vous pas tous les arguments de la classe dans le fichier du module? L'approche de la métaprogrammation ne vous permet alors d'économiser qu'une seule ligne de code réelle (non "end"), tout en se faisant au détriment de l'obscurcissement supplémentaire. À moins que vous ayez besoin de définir dynamiquement les tâches, j'utiliserais simplement l'approche vanille. – klochner
. . . à moins bien sûr que ce soit destiné à être plus un exercice d'apprentissage qu'un projet fini. – klochner