2012-01-19 3 views
0

Я хочу динамически загружать код, перемещая структуру каталогов и динамически загружая любые модули, которые я там нахожу.Как я могу динамически включать модули во вложенные каталоги?

Целью этого является проведение серии проверок. Если проверка на верхнем уровне не выполняется, никакие дочерние проверки не будут выполняться.

Мое мышление состояло в том, что объект контроллера мог сканировать каталоги, создавать иерархию модулей, а затем принимать решения о том, проходить ли какую-либо часть дерева на основе успеха/отказа валидации более высокого уровня ,

Например, у меня может быть серия проверок, которые я хочу выполнить против регулярного выражения, однако ни одна из проверок не должна выполняться, если регулярное выражение не существует или пусто. В этом случае каталог верхнего уровня будет содержать только проверку exists, а дочерний каталог будет содержать все остальные проверки, которые будут выполняться, если существует регулярное выражение.

Возможность определить эти проверки в отдельных файлах и создать необходимую иерархию будет чрезвычайно полезна для удобства добавления дополнительных проверок позже, вместо того, чтобы взломать существующий класс и добавить методы.

Есть ли способ, которым приложение может динамически сканировать каталог, сохранять имена файлов в коллекции и затем использовать элементы этой коллекции в требовании? Я так не думаю. Как насчет нагрузки?

Есть ли способ достичь такого дизайна? Или я думаю о том, что все это неправильно, и подумать о какой-то другой методологии?

+0

Я не уверен, что ваша цель на самом деле. Это скорее похоже на цепочку валидации, чем что-либо, что связано с динамической загрузкой модуля; методы проверки * могут существовать независимо от успеха/сбоя коллекции валидаций. –

ответ

1

Ваш запрос очень полезен, но ни один язык не сделает это за вас автоматически. Вы должны написать код, чтобы погрузиться в каталоги, определить наличие тестов, а затем решить, следует ли вам продолжить дальше.

Ruby поможет вам. Существует модуль Find, который входит в стандартную библиотеку. Это из его документации:

 
The Find module supports the top-down traversal of a set of file paths. 

For example, to total the size of all files under your home directory, 
ignoring anything in a "dot" directory (e.g. $HOME/.ssh): 

     require 'find' 

     total_size = 0 

     Find.find(ENV["HOME"]) do |path| 
     if FileTest.directory?(path) 
      if File.basename(path)[0] == ?. 
      Find.prune  # Don't look any further into this directory. 
      else 
      next 
      end 
     else 
      total_size += FileTest.size(path) 
     end 
     end 

Из этого кода вы бы искать для подписи файлов и папок вложенных, чтобы решить, следует ли перейти дальше. Для каждого найденного файла, который вы хотите, используйте require, чтобы загрузить его.

Вы можете найти другие примеры на «интернетах», показывающие, как люди используют Find. Также модуль Dir имеет аналогичную функциональность, используя glob, только вы должны сказать ему, куда спускаться, а затем можете перебирать возвращаемые результаты.

+0

После того, как вы найдете список каталогов и файлов, вы можете прокручивать их, чтобы потребовать, чтобы имя файла соответствовало любым условиям, которые вы хотите проверить. – roberocity

+1

@roberocity, Да. Я собирался добавить это, но получил приглашение на собрание. –

+1

+1 для участия в собрании. :) – roberocity

Смежные вопросы