オブジェクト指向とは何か
はじめに
はじめまして.Yasuと申します.プログラミング未経験(趣味レベルでVBAやPythonの経験はある)からWeb系エンジニアへの転職を目指して,学習しています.
少なくとも2週間ごとに学習成果をアウトプットする目的で記事を作成します.自分のための記事にはなりますが,同じように学習している初学者の方にも参考になれば嬉しいです.
1. オブジェクト指向とは?
オブジェクト指向は「現実の物事をのようにプログラムで表現する方法」と言えます.例えば「車」というオブジェクトには,色や属性(モデル),メソッド(走る・止まる)といった特徴があります.プログラムでも,このように物事をオブジェクトとして表現し,扱うことができます.
2. オブジェクト,クラス,メソッドについて
オブジェクト指向では,まずクラスと呼ばれる設計図を作ることで,そこから具体的なオブジェクト(実態)を作り出します.クラスの中には,オブジェクトが持つ属性やメソッド(動作)が定義されます.
クラスから生成された具体的なオブジェクトをインスタンスともいいます.
class Car
def initialize(model)
@model = model
end
def drive
puts "#{@model}が走ります."
end
end
car = Car.new("Toyota")
car.drive # => Toyotaが走ります.
このコードでは,Car
クラス(設計図)から「Toyota」というインスタンス(実際の車)を作って「drive」メソッドを実行して(走らせて)います.
3. カプセル化
カプセル化とは,オブジェクトの内部の情報を隠すことを指します.例えば,車のエンジンの中身を知らなくても,アクセルを踏めば走るように,外部から操作できる部分だけを公開します.
class Car
def initialize(model)
@model = model
end
def drive
start_engine
puts "#{@model}が走ります."
end
private
def start_engine
puts "エンジンを始動します."
end
end
例えば,start_engine
メソッドは外から直接呼び出せないようにprivate
で隠しています.
こうすることで不必要な情報を公開したり,外部から不正にアクセスされたりすることを防ぐことができます.これを隠蔽といいます.
4. 単一責任の原則
単一責任の原則は,クラスやメソッドが1つの役割だけを持つべきだという考え方です.1つのクラスにいろいろな機能を詰め込んでしまうと,そのクラスが何をしているのかわかりにくくなってしまうし,仕様変更が生じた際にどこを修正すればよいかわからなくなってしまいます.
class Engine
def start
puts "エンジンを始動します."
end
end
class Car
def initialize(model)
@model = model
@engine = Engine.new
end
def drive
@engine.start
puts "#{@model}が走ります."
end
end
これで,「車」と「エンジン」の役割が分かれ,それぞれの責任が明確になりました.
5. 継承
継承とは,あるクラス(親クラス)から別のクラス(子クラス)が機能を引き継ぐことをいいます.例えば,車やバイクというクラスが共通して持つ動作を「乗り物」という親クラスにまとめることで,コードを再利用できます.
class Vehicle
def initialize(model)
@model = model
end
def drive
puts "#{@model}が走ります."
end
end
class Car < Vehicle
end
class Bike < Vehicle
end
こうすることで,Car
やBike
はそれぞれが固有の機能を持ちつつ,Vehicle
から共通の機能を継承できます.
6. ポリモーフィズム(多態性)
ポリモーフィズムとは,同じメソッド名でも異なるクラスで異なる動作をさせることができる仕組みのことです.
class Car
def drive
puts "車が走ります."
end
end
class Bike
def drive
puts "バイクが走ります."
end
end
def start_vehicle(vehicle)
vehicle.drive
end
start_vehicle(Car.new) # => 車が走ります.
start_vehicle(Bike.new) # => バイクが走ります.
この例では,同じdrive
メソッドでも,Car
とBike
で異なる動作をしていることがわかります.
7. モジュールとミックスイン
Rubyにはモジュールという機能があり,これを使うとクラスに共通の機能を簡単に追加できます.Rubyでは複数の親クラスを持つことはできませんが,モジュールを使うことで多重継承(親クラスを複数持つ状態)のようなことができます.
module Wash
def wash
puts "洗濯します."
end
end
class Car
include Wash
end
car = Car.new
car.wash # => 洗濯します.
この例では,Wash
というモジュールをCar
クラスにミックスインして,車を洗濯しています.
8. DRY原則とオブジェクト指向
同じコードを繰り返し書かないという,DRY(Don`t Repeat Yourself)原則という考え方があります.オブジェクト指向では,共通の動作をクラスやモジュールにまとめることで,コードの重複を避けることができます.
9. まとめ
オブジェクト指向とは,現実の物事をプログラムで表現する方法です.クラスからオブジェクトを生成し,カプセル化や単一責任の原則を活用して保守性を高めます.また,継承やポリモーフィズムによりコードの再利用と柔軟性を実現し,モジュールを用いて共通の機能を追加することも可能だということがわかりました.
大規模なプログラムになるほど,可読性や保守性,柔軟性が重要になってくるので,これからもオブジェクト指向を意識してプログラミングしていきます.