Rubyはオブジェクト指向のスクリプト言語です。ではオブジェクト指向とはどのようなものでしょうか。オブジェクト指向について解説した本やWebサイトはたくさんあります。しかし、その中には哲学書かと思えるような難解な内容のものもあり、何か難しい考え方と思われている方もいるのではないしょうか。
Rubyではプログラムで扱う全ての要素がオブジェクトです。難しく考える必要はありません。その特徴さえ知っていれば誰でもプログラムが作れます。今回はそのような方にRubyにおけるオブジェクトの考え方について解説します。
オブジェクトの基本
Rubyはオブジェクト指向のスクリプト言語であり、Rubyの中で使用する変数などは全てオブジェクトです。Rubyらしいプログラムを書けるようになるためには、オブジェクトととは何かを理解しなければなりません。
まずは、そもそもオブジェクトが何か解らないという方のためにオブジェクトの基本について解説します。
ソフトウェア術の進歩から見たオブジェクト
ソフトウェアはそれを実行するコンピュータの性能向上に合わせて大きく複雑になってきました。黎明期にはCPUの命令を直接書いていましたが、それでは効率が悪いことから人が読み書きできるプログラミング言語が登場し、より複雑なプログラムが書けるプログラミング言語に進化してきました。
そして、企業にコンピュータが普及しはじめた1980年代、大規模なソフトウェアを効率的に開発する手法が求められ、その時代に登場したのがオブジェクト指向という考え方です。
特に1995年に登場したプログラミング言語のJavaは、オブジェクト指向の考え方を取り入れた汎用性の高いプログラミング言語で、大規模なシステム開発に向いていたことから急速に普及し、今でもプログラム開発に利用されています。
そしてRubyも同じ時期に公開されたオブジェクト指向のプログラミング言語です。
オブジェクト指向とは
先ほど紹介したようにオブジェクト指向とは、大規模なソフトウェア開発のための技術です。そして何人ものプログラマーが協力してソフトウェアを開発できるように、処理に必要な機能をオブジェクトという処理のまとまりを作り、オブジェクトの中身を知らなくてもプログラミングでその機能を使えるようにした仕組みです。
オブジェクト指向のプログラミング言語では、共通で使える機能をオブジェクトにしてメンバーが使えるようにし、少ないコードで機能を実現できる技術です。さらに既にあるオブジェクトでは機能不足の場合は、そのオブジェクトに欲しい機能を追加した新しいオブジェクトを簡単に作れる点もオブジェクト指向が便利な点です。
オブジェクト指向はなぜ難しい?
プログラミング言語の中でもRubyは習得しやすいと言われています。では理解するのが難しいと言われるオブジェクト指向のプログラミング言語であるRubyが、なぜ習得しやすいのでしょうか。
プログラムの中でオブジェクトを使うだけなら、それほど難しくありません。しかし、オブジェクト指向の解説書では、独特の言葉が使われています。その多くが英語をカタカタにしただけの言葉で、その意味を知らないと説明書を読んでも全く理解できません。
そもそもオブジェクト指向という言葉自体、変な日本語だと思いませんか。オブジェクト指向を解説した本やWebサイトにはそのような独特な言葉がよく使われているので言葉の意味を調べながら読むようにしてください。
Rubyではすべてのデータがオブジェクト
Rubyのプログラムで扱う全てのデータがオブジェクトです。そのため他のプログラミング言語のように変数とオブジェクトを区別せずにプログラムが作れます。
とはいえオブジェクトの基本を知らないとプログラムを書けません。次からRubyでプログラムを作るなら理解してほしいオブジェクトの特徴について解説します。
オブジェクトには値と処理を含められる
オブジェクトとは、先ほど紹介したようにプログラムの一部をまとめて部品として使えるようにしたものです。そしてオブジェクトにはデータを格納する変数とその変数を加工する処理を含められます。
Rubyのオブジェクトでは、例えば数字や文字列もオブジェクトとして扱うので、数字や文字列をまるで変数のように格納でき、さらに数字や文字列を処理する機能を含みます。
ただし、数字と文字列は違う種類のオブジェクトです。数字で使えた処理は、必ずしも文字列のオブジェクトの中には定義されていません。プログラムを作る場合は、このようにオブジェクトが違うと、使える処理が違います。
Rubyではクラスを意識することが重要
新しいオブジェクトを使うなら、まずは雛形となるクラスを定義し、プログラムの中でそれを実体化して利用するのが一般的です。Rubyで扱うオブジェクトも全て何らかのクラスとして定義されています。
なおクラスを実体化することをインスタンスと言いますが、Rubyではそれを省略できます。例えばRubyのプログラムの中で文字列を使う場合、その文字列はStringクラスのオブジェクトとして実体化されたものです。
Rubyには他のプログラミング言語のように変数の型宣言はありません。しかし、先ほど紹介したようにクラスが違えば、使える処理も違います。扱う変数がどのクラスに属しているかを意識してください。
Rubyはクラスを自動で判定する
先ほどRubyのプログラムを作る際、クラスを意識することが重要と説明しましたが、rubyは変数の宣言が不要です。プログラムの途中で新しい変数を使えたりします。これはRubyがプログラムを解析し、変数があったら自動的にクラスを判定してオブジェクトを生成機能があるためです。
Rubyと同じようにオブジェクト指向のプログラミング言語であるC++やJavaでは、オブジェクトを使う際にクラス名を宣言しなければなりません。しかしRubyでは自動判定されるので、短くシンプルなプログラムでオブジェクトを利用できます。
オブジェクトのクラスを調べる
先ほど紹介したようにRubyのプログラムでデータを扱う際、クラスを自動で判定してオブジェクトを作成します。そのためプログラムによっては、意図したクラスのオブジェクトが作られたかを判定しなければなりません。
なおRubyにはオブジェクトが所属するクラスを表示するメソッドが用意されており、オブジェクトの情報を調べることが可能です。次からRubyのオブジェクトを調べる方法を紹介します。
classメソッドを使う
クラスの中に含まれる処理をメソッドと呼びますが、オブジェクトには所属するクラスを表示するメソッドが定義されており、それがclassメソッドです。
classメソッドの使い方
オブジェクト.class
classメソッドはオブジェクトが所属するクラス名を返すので、文字列のオブジェクトとして受けてプログラムの中で使うか、pメソッドなどで表示できます。
classメソッドの使用例
strs = "Hello World" p strs.class # Stringが表示される num = 1 p num.class # Integerが表示される
is_a?で調べる
is_a?メソッドは、対象のオブジェクトが引数で指定したクラスに一致するかどうかをチェックするメソッドです。使い方は次のとおりで、指定したクラスに一致すればtrueをそうでなければfalseを返します。
is_a?メソッドの使い方
オブジェクト.is_a?(クラス名)
is_a?メソッドを利用することで、対象のオブジェクトが処理対象のクラスの場合のみ処理するプログラムを作れます。
is_a?メソッドの使用例
strs = "Hello World" if strs.is_a?(String) then puts "String型です" end
なお、kind_of?はis_a?の別名で同じ機能です。使い易い方を利用してください。
is_a?を利用する場合の注意
プログラムの中でオブジェクトのクラスにより処理を分岐するのにis_a?が使われますが、引数として与えるクラス名によっては目的通りに分岐しないケースもあるので注意してください。
is_a?はスーパークラスを指定できます。なおスーパークラスとは、Rubyの全てのオブジェクトが継承している最上位のクラスです。そのためis_a?にスーパークラスを指定してしまうと全てのオブジェクトが該当してしまいます。
継承したクラスではなく、特定のクラスから作られてオブジェクトかどうかをチェックする場合は、is_a?からサブクラスを調べる機能を無くしたinstance_of?を利用してください。
instance_of?の使用例
strs = "Hello World" if strs.instance_of?(String) then puts "String型です" end
まとめ
Rubyのプログラムで扱う全ての変数がオブジェクトですが、Rubyでは特に宣言しなくても自動で判断してくれるのでシンプルで読みやすいプログラムを作れます。
しかし、処理対象のオブジェクトが意図しないクラスに変換されてしまうと、プログラムが誤動作します。そのため、Rubyでは処理対象のオブジェクトのクラスを意識して作らなければなりません。
そしてRubyにはオブジェクトのクラスを判断するメソッドが用意されているので、このメソッドをうまく活用してください。
今も広く使われているオブジェクト指向のプログラミング言語が登場した時期は次のとおりです。
C++ 1983年
Python 1991年
Java 1995年
Ruby 1995年