2011-10-24 5 views
1

나는 스위치/케이스를 대체하기 위해 Ruby on Rails 디자인을 만드는 방법을 궁금해하고있었습니다.Validator 패턴을 쓰는 방법은 무엇입니까?

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

당신이 뭘 하려는지에 조금 더 정보를 정확히 – zsquare

+0

도움이 될 난 그냥 문자열로 다른 것들을 확인하고 싶다. 예 : indexOf()와 – fabian

답변

0

레일스에서 ​​사용자 정의 유효성 검사 클래스를 만들 수 있습니다. 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() 트릭을 할 것입니다. 중첩 된 클래스를 사용하여 totaly 선택 사항입니다

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 

:

0

당신이 뭔가를 할 수 있습니다.

하지만 대부분의 경우 클래스를 사용할 필요가 없습니다. 유효성 검사기 클래스는 모듈이 될 수 있습니다. from_str은 모듈을 직접 반환 할 수 있습니다. "검증"이 반환 된 모듈과 클래스를 확장 할 수있는 것보다 ...하는 MyClass의 인스턴스에서 작동하기위한 것입니다 경우

사실,

관련 문제