如何编写验证器模式?

时间:2011-10-24 14:58:53

标签: ruby-on-rails ruby design-patterns

我想知道如何构建一个用于替换交换机/案例的Ruby on Rails设计。

switch (needle) {
        case 'hello' :
            // some operation
            return "something"
            break;

        case 'world' :
            // some operation
            return "something"
            break;

        default :
            return "default";
            break;
    }

我正在考虑代表验证器的不同类。有这种模式吗?

class hello
  def validate
    // validate something
  end
 def execute
    // do something
  end
end

class world
  def validate
    // validate something
  end
 def execute
    // do something
  end
end

class implementation
  def main
    validate(hello, world)
  end
end

2 个答案:

答案 0 :(得分:0)

您可以在Rails中创建自己的自定义验证类。见http://juixe.com/techknow/index.php/2006/07/29/rails-model-validators/

然后你只需在你的模特中使用它们。

还有未充分利用的模式:

# string with square brackets and a regexp, returning the first match or nil
"fred"[/d/]

你可以通过将字符串拉出来并将它们用作消息来获得乐趣,但是要警告调试这种事情可能是一场噩梦。

您真的只是想向对象发送任意消息吗?在这种情况下,send()可以解决问题。

答案 1 :(得分:0)

你可以做点什么:

class MyClass
  def my_method my_valitation_str
    validator = Validator.from_str validation_str
    validator.validate
  end

  class Validator
    class Hello
      def self.str
        "hello"
      end
      def validate
         ... the hello validation code
      end
    end
    class World
      def self.str
        "world"
      end
      def validate
         ... the hello validation code
      end
    end
    def self.validator_types
      [Hello, World]
    end

    def self.from_str val_str
      validator_types.select{|t| t.str == val_str}.first
    end
  end
end

使用嵌套类是完全可选的。

但在大多数情况下,您不需要使用类.. Validator类可以是一个模块。和from_str可以直接返回模块。

实际上,如果“validate”意味着在MyClass实例上运行,那么你可以使用返回的模块扩展该类......