アクセス制御
クラスインタフェースを設計するときには、外部からクラスに対するアクセスをどの程度許すかを考慮することが重要です。Rubyは、次の3つのメソッド保護レベルがあります。
・public:誰でも呼び出せるメソッドです。
・protected:定義元クラス及びそのサブクラスのオブジェクトだけが呼び出せます。
・private:呼び出し元オブジェクトのコンテキスト内でしか呼び出せません。 (レシーバは常に自分自身(self)です。)
| class MyClass | ||
| def method1 end |
||
| protected | ||
| def method2 end |
||
| private | ||
| def method3 end |
||
| public | ||
| def method4 end |
||
| end | ||
あるいは、3つのアクセス制御関数の引数としてメソッド(のリスト)を指定することで、それらのメソッドのアクセスレベルを設定することができます。
| class MyClass |
|
| def method1 end |
|
| # ...以下同様に method2~method4 のメソッド定義 |
|
| public :method1, :method4 protected :method2 private :method3 |
|
| end |
|
具体例:すべての借り方と貸し方の金額が一致している会計システムのモデルを作成しているとします。この規則は誰にも破らせたくないので、借り方と貸し方を計算するメソッドは private にして、取引という観点から外部インタフェースを定義します。
| class Accounts |
|||
| def initialize(checking, savings) |
|||
| @checking = checking @savings = savings |
|||
| end |
|||
| private |
|||
| def debit(account, amount) |
|||
| account.balance -= amount |
|||
| end |
|||
| def credit(account, amount) |
|||
| account.balance += amount |
|||
| end |
|||
| public |
|||
| #... def transfer_to_savings(amount) |
|||
| debit(@checking, amount) credit(@savings, amount) |
|||
| end #... |
|||
| end |
|||

コメント