はじめに
最近の輪読会でカプセル化と情報隠蔽について話があったのですが、まだ理解があやふやな部分が残っています。
そこで、もう一度これらの概念を整理し理解を深めたいと思います。
カプセル化 (Encapsulation)
カプセル化は、オブジェクト指向プログラミングの基本概念の一つです。
データ(プロパティ)とそれに対する操作(メソッド)を一つの単位でまとめることを指します。
これにより、データの整合性が保たれ、オブジェクトの使用方法が明確になります。
カプセル化の具体例
以下に、TypeScript でのカプセル化の例を示します。
class Person {
private name: string;
private age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
public getName(): string {
return this.name;
}
public getAge(): number {
return this.age;
}
public setAge(age: number): void {
if (age > 0) {
this.age = age;
} else {
console.error("不正な年齢です");
}
}
}
const person = new Person("山田", 30);
console.log(person.getName()); // 山田
console.log(person.getAge()); // 30
person.setAge(35);
console.log(person.getAge()); // 35
この例では、Person
クラスが name
と age
というデータを持ち、それらに対する操作をクラス内のメソッドで提供しています。これにより、データと操作が一体化されています。
情報隠蔽 (Information Hiding)
情報隠蔽は、オブジェクトの内部状態を外部から直接アクセスできないようにすることです。
これにより、オブジェクトの内部状態の不整合や不正な操作を防ぎます。
カプセル化の一部とも言えますが、特にデータの隠蔽に焦点を当てた概念です。
情報隠蔽の具体例
先ほどの例をさらに発展させて、情報隠蔽の重要性を強調します。
class BankAccount {
private balance: number;
constructor(initialBalance: number) {
this.balance = initialBalance;
}
public deposit(amount: number): void {
if (amount > 0) {
this.balance += amount;
} else {
console.error("不正な入金額です");
}
}
public withdraw(amount: number): void {
if (amount > 0 && amount <= this.balance) {
this.balance -= amount;
} else {
console.error("不正な出金額または残高不足です");
}
}
public getBalance(): number {
return this.balance;
}
}
const account = new BankAccount(1000);
account.deposit(500);
console.log(account.getBalance()); // 1500
account.withdraw(200);
console.log(account.getBalance()); // 1300
ここでは BankAccount
クラスの balance
プロパティが外部から直接アクセスできないようになっています。これにより、balance
を不正に変更されるリスクを回避しています。
カプセル化と情報隠蔽の違い
カプセル化と情報隠蔽は密接に関連していますが、異なる概念です。以下の表でその違いをまとめます。
概念 | 定義 | 目的 |
---|---|---|
カプセル化 | データとそれに対する操作を一つの単位にまとめること | データの整合性を保ち、使用方法を明確にする |
情報隠蔽 | オブジェクトの内部状態を外部から直接アクセスできないようにすること | 内部状態の不整合や不正操作を防ぐ |
カプセル化はデータとメソッドを一つにまとめることに重点を置き、情報隠蔽はそのデータを外部から隠すことに重点を置いています。
まとめ
普段意識せずカプセル化や情報隠蔽を使っていても、キーワードを出されると ??? となることがありますよね。
改めてこれらの概念を整理し、オブジェクト指向プログラミングの基本を理解することは、より良いコードを書くための第一歩だと感じました。