クラスを理解する!!!(途中)
なんど勉強してもクラスの理解が浅いので、チェリー本で理解できないことを調べながら記事にまとめて理解していきます!
コード例は、Claudeに質問して(私にとって)身近な医療で例えてもらいました。
まだ理解できていない部分がたくさんあるのでこれから少しずつ肉付けしていきます😆
1. オブジェクト指向プログラミングとは?
オブジェクト指向プログラミングは、プログラムを「オブジェクト」という部品で組み立てる方法です。オブジェクトは、データ(属性)と、そのデータを扱う機能(メソッド)をひとまとめにしたものです。
例えば、病院システムでは「患者」「医師」「予約」などがオブジェクト。
2. クラスとオブジェクト
クラスとは?
クラスは、オブジェクトの設計図のようなものです。
例えば、「患者」クラスを作ると、それを元に様々な患者のオブジェクトを作ることができます。
クラスの定義方法
Patient
クラス
class Patient
attr_reader :name, :age
def initialize(name, age)
@name = name
@age = age
@medical_records = []
end
def add_medical_record(record)
@medical_records << record
puts "#{@name}さんの診療記録を追加しました。"
end
end
-
initialize
メソッド:新しい患者を登録するときに呼ばれる -
@name
、@age
、@medical_records
;それぞれの患者の情報を保存する -
add_medical_record
:患者の診療記録を追加するメソッド
オブジェクトの作り方と使い方
patient1 = Patient.new("山田太郎", 30)
patient1.add_medical_record("風邪の症状 処方:かぜ薬")
puts patient1.name # 山田太郎
3. カプセル化:オブジェクトの中身を守る
カプセル化は、オブジェクトの内部情報を外から勝手に変えられないようにする仕組みです。
オブジェクトの内部データと実装の詳細を隠蔽し、外部からのアクセスを制御します。
Rubyでは、インスタンス変数、アクセサメソッド、プライベートメソッドなどの機能を使ってカプセル化を実現します。
[カプセル化の目的]
データの保護:不適切なアクセスや変更からデータを守ります
複雑さの隠蔽:内部の複雑な仕組みを隠し、シンプルな使い方を提供します
柔軟性の向上:内部の実装を変更しても、外部への影響を最小限に抑えられます
[カプセル化の利点]
安全性:データの不正な変更を防ぎます
柔軟性:内部実装を変更しても、外部のコードに影響を与えにくくなります
使いやすさ:複雑な内部処理を隠し、シンプルなインターフェースを提供できます
インスタンス変数の使用
Rubyでは、インスタンス変数(@で始まる変数)は自動的にprivateになります。
class Patient
def initialize(name)
@name = name
end
end
patient = Patient.new("山田太郎")
puts patient.name # エラー:undefined method `name'
puts patient.@name # エラー:構文エラー
アクセサメソッド
インスタンス変数にアクセスするためのメソッドを定義します。
Rubyには、アクセサメソッドを簡単に定義するための特別なメソッドがあります。
- attr_reader: 読み取り専用のアクセサを生成
- attr_writer: 書き込み専用のアクセサを生成
- attr_accessor: 読み書き両用のアクセサを生成
class Patient
attr_reader :name # 読み取り専用
attr_accessor :age # 読み書き可能
def initialize(name, age)
@name = name
@age = age
end
end
patient = Patient.new("山田太郎", 30)
puts patient.name # 山田太郎
puts patient.age # 30
patient.age = 31 # 年齢を変更できる
puts patient.age # 31
# patient.name = "佐藤花子" # エラー:nameは読み取り専用
プライベートメソッドの使用
クラス内部でのみ使用するメソッドは、private
キーワードを使って定義します。
class MedicalRecord
def initialize(patient)
@patient = patient
@records = []
end
def add_record(record)
@records << record
summarize_records
end
private
def summarize_records
puts "#{@patient}の記録が更新されました。全#{@records.length}件の記録があります。"
end
end
record = MedicalRecord.new("山田太郎")
record.add_record("風邪の症状") # 山田太郎の記録が更新されました。全1件の記録があります。
record.summarize_records # エラー:privateメソッドは外部から呼び出せない
4. 継承:クラスの特徴を引き継ぐ
継承を使うと、既存のクラスの特徴を引き継いで新しいクラスを作ることができます。
class Employee
attr_reader :name
def initialize(name)
@name = name
end
def work
puts "#{@name}が仕事をしています。"
end
end
class Nurse < Employee
def care_for_patient
puts "#{@name}が患者のケアをしています。"
end
end
nurse = Nurse.new("山本真由子")
nurse.work # 山本真由子が仕事をしています。
nurse.care_for_patient # 山本真由子が患者のケアをしています。
Nurse
クラスはEmployee
クラスを継承しているので、work
メソッドを使うことができます。
まとめ
- オブジェクト指向プログラミングは、データと機能をまとめて扱う方法
- クラスはオブジェクトの設計図、オブジェクトはクラスから作られた実際のもののこと
- カプセル化は、オブジェクトの中身を適切に保護する仕組み
- 継承は、既存のクラスの特徴を新しいクラスに引き継ぐ方法
[参考]プロを目指す人のためのRuby入門 7章
Discussion