2013-03-19 1 views
2

잘못된 매개 변수를 가져 오는 경우 객체 생성을 취소하는 방법은 무엇입니까? 예 :루비 취소 객체 생성

class MyClass 
    def initialize(a, b, c) 
     @a = @b = @c = nil 
     @a = a if a.is_a? Integer 
     @b = b if b.is_a? String 
     @c = c if c.is_a? Integer or c.is_a? Float 
     return nil if @a == nil or @b == nil or @c == nil # doesn't works 
    end 
end 
cl = MyClass.new('str', 'some', 1.0) # need cl to be nil because 1st param isn't Integer 
+1

외부 메소드가 유효한 매개 변수를 검사하고 실패 할 경우 초기화 된 객체 대신 nil을 반환하도록 factory 메소드 패턴을 사용할 수 있습니다. – cmur2

답변

4

간단합니다. 생성자를 사용하지 마십시오. :)

class MyClass 
    def initialize(a, b, c) 
    @a, @b, @c = a, b, c 
    end 

    def self.fabricate(a, b, c) 
    aa = a if a.is_a? Integer 
    bb = b if b.is_a? String 
    cc = c if c.is_a? Integer || c.is_a? Float 
    return nil unless aa && bb && cc 
    new(aa, bb, cc) 
    end 
end 

cl = MyClass.fabricate('str', 'some', 1.0) # => nil 

이 패튼은 Factory Method라고 부릅니다.

+1

'self.fabricate'는 다음과 같이 개선 될 수 있습니다 :'def self.fabricate (a, b, c); a.is_a? (정수) 및 b.is_a? (문자열) 및 c.is_a? (정수) || c.is_a? (Float); new (a, b, c) end' – sawa

+0

@sawa 오른쪽으로 추가 로컬 변수는 중복 –

1

당신이 잘못된 데이터를 처리하기위한 침묵 고장 모드의 어떤 종류를 필요로하지 않는 한, 당신은 단지 프로그램 오류를 발생하고 중지 할 수 있습니다 :

def initialize(a, b, c) 
    @a = @b = @c = nil 

    raise "First param to new is not an Integer" unless a.is_a? Integer 
    @a = a 

    raise "Second param to new is not a String" unless b.is_a? String 
    @b = b 

    raise "Third param to new is not an Integer or Float" unless c.is_a? Integer or c.is_a? Float 
    @c = c 
end 

이 접근하거나 전달하는 팩토리 메소드 사용 여부 잘못된 입력 이상은 작업하려는 데이터의 종류에 따라 다릅니다.

개인적으로 나쁜 데이터를 자동으로 무시하는 특정 요구 사항이 없으면 개인적으로 거의 항상 오류가 발생합니다. 그러나 이것은 코딩 철학이며 반드시 문제에 대한 최상의 대답은 아닙니다.

+0

+1이지만 항상 예외가있는 경우를 대비합니다. 잘못된 입력을 자동으로 무시해야하는 경우 'rescue' 절에서 예외를 래핑하는 것은 길이다. – kopischke