Rubyを勉強していったら、「Rubyには大クラス主義というものがあるんだよ」というのを聞いて、自分はよくわからなかったので調べてみてわかったことを記事にしようとおもいます。
大クラス主義
例えば、配列を表すクラスにArrayクラスというものがRubyにあります。そしてArrayクラスにはpopメソッドやunshiftメソッドがあります。
ここから分かることはArrayクラスにはキューやスタックとしても使えるんです。
自分はJava等の言語を触ったことはないのですが、JavaではQueueクラスやStackクラスとそれぞれ分かれているみたいです。
他にもeachメソッドがありますが、JavaではIteratorクラスが用意されていて、それぞれが処理するみたいです。
このようにRubyのArrayクラスでは、Arrayクラスでは担う役割が大きいんですね。そのことを大クラス主義といいます。
※キューやスタックについてよく分からない方は以下の記事を参照にしてみてください
「Javaのようにそれぞれ役割がクラスごとに分かれていたほうが、バグが起こりにくいんじゃない?Rubyってもしかして微妙?」とおもわれるかもしれませんが、そこにはダックタイピングというものが深くかかわっています。
ダックタイピング
ダックタイピングとは、
"If it walks like a duck and quacks like a duck, it must be a duck"
(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである)
このように説明されています。文章でいわれてもよく分からないとおもいますので、実際にコードをみていきましょう。
class Human
def say; p "おはよう!"; end
end
class Dog
def say; p "ワン!"; end
end
def greeting(animal)
puts animal.say
end
greeting(Human.new)
greeting(Dog.new)
上記のコードで注目すべきなのは、greetingメソッド
の引数であるanimalがsayメソッド
を参照できることを期待しているんですね。そしてsayメソッドが参照できるのなら、レシーバであるオブジェクトは何でも良い、ということなんです。
これが「もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである」という言葉の意味なんです。
ダックタイピングが使えそうな例
ある清掃会社があって、清掃員は床をぴかぴかにし、マネージャーはキレイになっているかをチェックする仕事をしています。
その際にこのように書くことで、スッキリ書くことができます。
class Staff
def kiai
p 'きれいにするよ!'
end
end
class Manager
def kiai
p 'チェックするよ!'
end
end
def work(person)
p person.kiai
end
work(Staff.new)
work(Manager.new)
以上です。
何か間違いがございましたら、ご教示いただけますと幸いです。
【参考資料】