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
4

2 に答える 2

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

ちなみに、このパッテンはファクトリメソッドと呼ばれています。

于 2013-03-19T12:35:40.717 に答える
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

このアプローチを使用するか、不正な入力を渡すファクトリメソッドを使用するかは、操作するデータの種類によって異なります。

個人的には、悪いデータを黙って無視するという特定の要件がない限り、ほとんどの場合、エラーを発生させることになります。しかし、これはコーディング哲学であり、必ずしもあなたの問題に対する最良の答えではありません。

于 2013-03-19T13:01:51.893 に答える