Ruby練習問題4-2:カプセル化を理解しよう

記事内に商品プロモーションを含む場合があります

Rubyの初心者向け問題4-2:カプセル化を理解しよう

この問題を解くために必要な知識:
【レベル1~3の知識】
コメントの書き方、変数と定数、基本データ型、四則演算と演算子、入力と出力、文字列操作、分岐処理(if、if~else、elsif、case)、繰り返し処理(for、while、until、each)、範囲(Range)、例外処理(begin-rescue-end)、配列(Array)、ハッシュ(Hash)、コレクション操作(配列、ハッシュの操作)、Enumerableモジュール、メソッドの定義と呼び出し、メソッドの戻り値、クラスの定義と使用、コンストラクタ、クラスの継承、モジュールの定義と使用、ミックスイン

【レベル4の知識】
アクセスメソッド(ゲッター、セッター)、カプセル化、クラスメソッドとインスタンスメソッド共通メソッドブロックとイテレータプロック(Proc)ラムダ(Lambda)、ファイル操作(読み書き)正規表現メタプログラミングの基礎

<<前の問題 問題集Top 次の問題>>

Rubyの文法「カプセル化」とは

ここではカプセル化の意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。



カプセル化は、オブジェクト指向プログラミングの重要な概念の一つです。この概念は、データ(属性)とメソッド(操作)を一つのクラスの中にまとめ、外部から直接データにアクセスできないようにすることで、データの安全性を保つ仕組みを提供します。

これにより、オブジェクトの内部状態を保護し、誤った操作から守ることができます。

カプセル化の仕組み

Rubyでは、クラス内のデータを外部から直接アクセスするのではなく、ゲッターやセッター、メソッドを通じて操作します。この操作をカプセル化と呼びます。

具体的には、クラス内で定義されたインスタンス変数は、クラスの外部からは直接アクセスできません。代わりに、メソッドを使ってその値を取得したり、変更したりします。

カプセル化の実例

以下は、Account クラスを使ったカプセル化の例です。

class Account
  def initialize(owner, amount)
    @owner = owner  # アカウントの所有者
    @amount = amount  # アカウントの初期残高
  end
  
  # 入金メソッド
  def deposit(value)
    @amount += value
  end
  
  # 出金メソッド
  def withdraw(value)
    # 残高が十分にある場合のみ出金
    @amount -= value if @amount >= value
  end

  # 残高確認メソッド
  def balance
    @amount
  end
end

このコードでは、Account クラスに3つのメソッドがあります。deposit は入金、withdraw は出金、balance は残高の確認を行います。

外部からは @amount に直接アクセスすることはできませんが、これらのメソッドを通じてアカウントの操作を行います。

まとめ

カプセル化を使用することで、データを安全に管理し、クラスの外部から不正なアクセスや誤った操作を防ぐことができます。

これにより、信頼性の高いコードを構築することができます。 ​



Ruby練習問題4-1_簡単な従業員管理システムを作ろう

従業員の名前と給与を管理するプログラムを作成しましょう。

従業員のデータはカプセル化の概念を使って安全に管理します。

データを外部から直接操作できないようにし、ゲッターとセッターを使ってデータを取得、変更できるようにします。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • Employee クラスを作成し、従業員の名前と給与をインスタンス変数として保持すること。
  • initialize メソッドを定義し、名前と給与を初期化すること。
  • 名前と給与を取得するためのゲッターメソッドを定義すること。
  • 名前と給与を変更するためのセッターメソッドを定義すること。
  • display_info メソッドを定義し、従業員の名前と給与を表示すること。
  • インスタンスを作成し、データの表示、変更、再表示を行うこと。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

従業員名: 山田太郎, 給与: 300000円
従業員名: 鈴木一郎, 給与: 350000円

----- ↑出力される結果の例↑ -----

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.Employeeクラスの定義
 1-1. initialize メソッドで従業員の名前と給与を初期化
  1-1-1. 名前のインスタンス変数 @name に値を格納
  1-1-2. 給与のインスタンス変数 @salary に値を格納
 1-2. 名前を取得するゲッターメソッド get_name の定義
 1-3. 名前を設定するセッターメソッド set_name の定義
 1-4. 給与を取得するゲッターメソッド get_salary の定義
 1-5. 給与を設定するセッターメソッド set_salary の定義
 1-6. 従業員の情報を表示するメソッド display_info の定義

2.Employeeクラスのインスタンス作成
 2-1. Employee.new("山田太郎", 300000)employee インスタンスを作成

3.従業員の情報を表示
 3-1. employee.display_info を呼び出して、従業員名と給与を表示

4.名前と給与を変更
 4-1. employee.set_name("鈴木一郎") で従業員の名前を変更
 4-2. employee.set_salary(350000) で従業員の給与を変更

5.変更後の従業員情報を表示
 5-1. employee.display_info を呼び出して、変更後の従業員名と給与を表示

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# Employeeクラスの定義
class Employee
  # 初期化メソッドで名前と給与を設定
  def initialize(name, salary)
=begin 【穴埋め問題1】
ここに名前と給与をインスタンス変数に設定するコードを書いてください。
=end
  end

  # 名前のゲッター
  def get_name
=begin 【穴埋め問題2】
ここに名前を取得するためのコードを書いてください。
=end
  end

  # 名前のセッター
  def set_name(new_name)
=begin 【穴埋め問題3】
ここに新しい名前をインスタンス変数に設定するコードを書いてください。
=end
  end

  # 給与のゲッター
  def get_salary
=begin 【穴埋め問題4】
ここに給与を取得するためのコードを書いてください。
=end
  end

  # 給与のセッター
  def set_salary(new_salary)
=begin 【穴埋め問題5】
ここに新しい給与をインスタンス変数に設定するコードを書いてください。
=end
  end

  # 従業員情報を表示するメソッド
  def display_info
=begin 【穴埋め問題6】
ここに従業員名と給与を表示するコードを書いてください。
=end
  end
end

# Employeeクラスのインスタンスを作成
=begin 【穴埋め問題7】
ここにEmployeeクラスのインスタンスを作成し、名前と給与を設定するコードを書いてください。
=end

# 従業員情報を表示
=begin 【穴埋め問題8】
ここに従業員情報を表示するコードを書いてください。
=end

# 名前と給与を変更
=begin 【穴埋め問題9】
ここに名前と給与を変更するコードを書いてください。
=end

# 更新後の従業員情報を表示
=begin 【穴埋め問題10】
ここに更新後の従業員情報を表示するコードを書いてください。
=end

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

********************

# Employeeクラスの定義
class Employee
  # 初期化メソッドで名前と給与を設定
  def initialize(name, salary)
    @name = name        # 従業員の名前(インスタンス変数)
    @salary = salary    # 従業員の給与(インスタンス変数)
    # カプセル化により、インスタンス変数はクラス外部から直接アクセスできません
  end

  # 名前のゲッター
  def get_name
    @name  # カプセル化の一部として、インスタンス変数を外部から取得するためのメソッド
  end

  # 名前のセッター
  def set_name(new_name)
    @name = new_name  # カプセル化の一部として、インスタンス変数を外部から変更するためのメソッド
  end

  # 給与のゲッター
  def get_salary
    @salary  # カプセル化の一部として、インスタンス変数を外部から取得するためのメソッド
  end

  # 給与のセッター
  def set_salary(new_salary)
    @salary = new_salary  # カプセル化の一部として、インスタンス変数を外部から変更するためのメソッド
  end

  # 従業員情報を表示するメソッド
  def display_info
    puts "従業員名: #{@name}, 給与: #{@salary}円"  # インスタンス変数を表示するメソッド
  end
end

# Employeeクラスのインスタンスを作成
employee = Employee.new("山田太郎", 300000)

# 従業員情報を表示
employee.display_info

# 名前と給与を変更
employee.set_name("鈴木一郎")
employee.set_salary(350000)

# 更新後の従業員情報を表示
employee.display_info

********************

コードの解説

クラスの定義とインスタンス変数の初期化

class Employee
  def initialize(name, salary)
    @name = name
    @salary = salary
  end
end

Employee クラスは従業員の名前と給与を管理するクラスです。

initialize メソッドはクラスのインスタンスが作成される際に呼び出され、名前と給与がインスタンス変数として初期化されます。

これらのインスタンス変数はクラス外部から直接アクセスできないため、カプセル化の重要な役割を果たしています。

ゲッターメソッドとセッターメソッドによるデータの管理

def get_name
  @name
end

def set_name(new_name)
  @name = new_name
end

def get_salary
  @salary
end

def set_salary(new_salary)
  @salary = new_salary
end

ここでは名前と給与を取得するためのゲッターメソッドと、設定するためのセッターメソッドが定義されています。

カプセル化の基本的な役割は、インスタンス変数に直接アクセスさせないことです。これにより、インスタンス変数を保護し、データが予期しない変更を受けるのを防ぎます。

ゲッターやセッターを通じてのみ外部からデータの読み書きが可能になります。

従業員情報の表示

def display_info
  puts "従業員名: #{@name}, 給与: #{@salary}円"
end

display_info メソッドは、従業員の名前と給与を画面に表示します。

このメソッドは、インスタンス変数に直接アクセスするのではなく、クラス内部で管理されているデータを適切に出力する手段を提供します。

これにより、外部からはデータの内部構造が見えないようにしつつ、必要な情報を表示できます。

インスタンスの作成とデータ操作

employee = Employee.new("山田太郎", 300000)
employee.display_info
employee.set_name("鈴木一郎")
employee.set_salary(350000)
employee.display_info

このコードでは、Employee クラスのインスタンス employee を作成し、初期の名前と給与を設定しています。

display_info メソッドを使って従業員情報を表示し、その後セッターメソッドを使って名前と給与を更新しています。

更新後も、カプセル化されたデータを安全に操作し、表示できます。

カプセル化のまとめ

カプセル化は、データをクラス内部に隠し、外部から直接アクセスできないようにすることで、データの安全性を確保するための重要な概念です。

このコードでは、名前と給与をゲッターとセッターを使って適切に管理しています。これにより、データの不正な変更を防ぎ、クラスの信頼性を高めることができます。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Ruby練習問題集へ戻る
    トップページへ戻る