型(Class)のチェック

INDEX PAGE


型(Class)のチェック



Rubyにおいて、というより一般的なスクリプト言語において
オブジェクトの型の指定と言うのは基本的に行わないものみたいですね。
メソッドにおいても、引数の型は指定できないので
オブジェクトに対してメソッドを実行して
「そんなメソッドが存在しないよ!」と言うところで初めてエラーが発生します。
ちょっとこれは怖いと感じてしまうのはJavaで育ったからでしょうか?


ひとまず、クリティカルな処理での判定と
テスト時に問題を発見しやすいように型判定クラスを作ってみました。

まずは、
第一引数で指定したオブジェクトが
第二引数で指定したクラスかどうかを調べるメソッドを作ってみました。

def self.chk_clss( trgtObjct , clssName )

 ##第一引数のオブジェクトが第二引数の型かを調べる
 return trgtObjct.class.to_s == clssName

end

ただ、実際の開発においては
ポリモルフィズムが多用されるため、
特定のクラスのサブクラスかどうかを判定するというチェックのほうが発生します。
その時には、上のメソッドを応用して
第一引数で指定したオブジェクトが
第二引数で指定したクラスのサブクラスかどうかを調べるメソッドを作ってみました。

def self.chk_spr_clss( trgtObjct , sprClssName )

  chkObjct = trgtObjct

  loop{
    ##第一引数のオブジェクトが第二引数の型かを調べる
    if chkObjct.class.to_s == sprClssName then
      return true
    end

    ##Objectクラスまで判定して一致しない場合(superclassがnilの場合)はNG判定
    if chkObjct.class.superclass == nil then
      return false
    else
 chkObjct = eval(chkObjct.class.superclass.to_s).new
    end
  }
end

こんな感じです。

テストプログラムの中で、引数の型チェックをしてみたり
プログラムの中で特にクリティカルな部分については
このようなチェックロジックを仕込んで
エラーの切り分けを行っておくと良いかもしれません。


INDEX PAGE