¾õÂÖ¡¢¥³¥Þ¥ó¥É¡¢¥¤¥Ù¥ó¥È¤Ï¡¢¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤È¸Æ¤Ð¤ì¤ëÏ¢ÁÛÇÛÎó¤Ë³ÊǼ¤·¤Þ¤·¤ç¤¦¡£ ¤½¤ÎºÝ¡¢¥¡¼¤Ë¤Ï¥·¥ó¥Ü¥ë¡ÊJava¤Ç¸À¤¨¤Ð¡¢Îóµó·¿¡Ë¤òÍѤ¤¤Þ¤·¤ç¤¦¡£
·ë¶É¡¢Ê£¿ô¥Þ¥Ã¥×¤è¤êÆÃÊ̤ʥ¯¥é¥¹¤ò»È¤¨¤Ã¤Æ¸À¤¦»ö¤ò½Ò¤Ù¤Æ¤¤¤ë¥»¥¯¥·¥ç¥ó
DSL¥¹¥¯¥ê¥×¥ÈÆâ¤Ç»ÈÍѤµ¤ì¤ë¥·¥ó¥Ü¥ë¤È»²¾È¤µ¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È¤ò¥Þ¥Ã¥Ô¥ó¥°¤·¤¿¾ðÊó¤ò³ÊǼ¤¹¤ë¾ì½ê¡£
¼¡¤Î3¤Ä¤òÄó°Æ¤·¤Æ¤¤¤ë¤¬¡¢¥Õ¥¡¥¦¥é¡¼¤¬¿ä¾©¤·¤Æ¤¤¤ë¤Î¤Ï¡¢¡ØÊ£¿ô¥Þ¥Ã¥×¡Ù
¡ØÆÃÊ̤ʥ¯¥é¥¹¡Ù¤Ë´Ø¤·¤Æ¤ÏÍÍѤʾì¹ç¤â¤¢¤ë¤¬¡¢É¬ÍפȤʤë¾ìÌ̤¬¾¯¤Ê¤¤¡£
¥ª¥Ö¥¸¥§¥¯¥È¤¬Å¬ÀÚ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ëÁ°¤Ë¡¢»²¾È¤µ¤ì¤ë»ö¡£
DSL¤ÏÁ°Êý»²¾È¤ËÂФ·¤Æ¸·¤·¤¤À©Ìó¤ò¤â¤Ã¤Æ¤¤¤Ê¤¤»ö¤¬ËؤɤǤ¢¤ë°Ù¡¢¥µ¥Ý¡¼¥È¤¹¤ë¾ì¹ç¤Ï¥·¥ó¥Ü¥ë¤Èɳ¤Å¤¤¤Æ¤¤¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î´ÉÍý¤ò¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤¬É餦¤³¤È¤Ë¤Ê¤ë¡£
Îã¤È¤·¤Æ¡¢¼¡¤Î3¤Ä¤Î¥¿¥¹¥¯¤ò¹Í¤¨¤ë
¤³¤ì¤é¤Î¥¿¥¹¥¯¤Ï
¤È¤¤¤¦À¼Á¤ò»ý¤Ä¡£
¡Ú¼«¿È¤âÊ£¿ô¤Î¾¤Î¥¿¥¹¥¯¤«¤é¹½À®¡Û task :go_to_work => [:drink_coffee, :dress] ¡¦¡¦¡¦¡ task :drink_coffee => [:make_coffee, :wash]¡¡¡¦¡¦¡¦¢ task :dress => [:wash]¡¡¡¦¡¦¡¦£ ¡Ú²òÀâ¡Û ¡go_to_work¥¿¥¹¥¯¤Ï drink_coffee¤Èdress ¤È¤¤¤¦¥¿¥¹¥¯¤«¤é¹½À®¤µ¤ì¤ë¡£ ¢drink_coffee¥¿¥¹¥¯¤Ï make_coffee¤Èwash¤È¤¤¤¦¥¿¥¹¥¯¤«¤é¹½À®¤µ¤ì¤ë¡£ £dress ¥¿¥¹¥¯¤Ï wash¤È¤¤¤¦¥¿¥¹¥¯¤«¤é¹½À®¤µ¤ì¤ë¡£
class Task attr_reader :name¡¡¡¦¡¦¡¦¡ attr_accessor :prerequisites¡¡¡¦¡¦¡¦¢ #¥³¥ó¥¹¥È¥é¥¯¥¿ def initialize name, *prereqs @name = name @prerequisites = prereqs end #¥¿¥¹¥¯Ì¾¤òÊÖ¤¹´Ø¿ô def to_s name end end ¡Ú²òÀâ¡Û ¡¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤«¤é»²¾È¤µ¤ì¤ë°Ù¤Î¥·¥ó¥Ü¥ë ¢¥¿¥¹¥¯¤ò¹½À®¤¹¤ë¥¿¥¹¥¯¤ÎÇÛÎó
class TaskBuilder... #¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤Î½é´ü²½ def initialize @tasks = {} end #DSL¥¹¥¯¥ê¥×¥È¤ÎÆɤ߹þ¤ß def load aStream instance_eval aStream return self end #¥¿¥¹¥¯¤òºîÀ®¤¹¤ë´Ø¿ô #¡ÊargMap¤ÏTask¥³¥ó¥¹¥È¥é¥¯¥¿¤ËÅϤ¹°ú¿ô¡Ë def task argMap #°ú¿ô¤ÎÃæ¿È¤¬¤Ê¤¤¾ì¹ç¤Ï¥¨¥é¡¼ raise "syntax error" if argMap.keys.size != 1 #¥¿¥¹¥¯¤ò¼èÆÀ key = argMap.keys[0] newTask = obtain_task(key) #¼«¿È¤ò¹½À®¤¹¤ë¾¤Î¥¿¥¹¥¯¤òÀßÄê prereqs = argMap[key].map{|s| obtain_task(s)} newTask.prerequisites = prereqs end #¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤«¤é¥¿¥¹¥¯¤ò¼èÆÀ¤¹¤ë´Ø¿ô def obtain_task aSymbol #̤ÅÐÏ¿¤Ç¤¢¤ì¤Ð¡¢¥¿¥¹¥¯¤ò¿·µ¬ºîÀ®¤·¡¢¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤ËÅÐÏ¿¡ÊÁ°Êý»²¾ÈÂкö¡Ë @tasks[aSymbol] = Task.new(aSymbol.to_s) unless @tasks[aSymbol] #¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤«¤é¥¿¥¹¥¯¤òÌ᤹¡£ return @tasks[aSymbol] end
¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë ¨¢ ¨§¨¡Task go_to_work ¨¢ ¨¢ ¨¢ ¨§¨¡name = "go_to_work" ¨¢ ¨¢ ¨¢ ¨§¨¡prerequisite = {:drink_coffee => drink_coffee, :dress => dress } ¨¢ ¨¢ ¨¢ ¨¦¨¡to_s ¨¢ ¨§¨¡Task drink_coffee ¨¢ ¨¢ ¨¢ ¨§¨¡name = "drink_coffee" ¨¢ ¨¢ ¨¢ ¨§¨¡prerequisite = {:make_coffee => make_coffee, :wash => wash } ¨¢ ¨¢ ¨¢ ¨¦¨¡to_s ¨¢ ¨§¨¡Task dress ¨¢ ¨¢ ¨¢ ¨§¨¡name = "dress" ¨¢ ¨¢ ¨¢ ¨§¨¡prerequisite = {:wash => wash} ¨¢ ¨¢ ¨¢ ¨¦¨¡to_s ¨¢ ¡§ ¡¡¨§¨¡Tasks make_coffee ¡§ ¡¡¨§¨¡Tasks wash ¡§