Topiqlo ロゴ

カプセル化

公開日: 2025/06/02

カプセル化とは?──データを守り、設計を強くするオブジェクト指向の基本原則

はじめに

プログラミングにおいて「データが意図せず変更される」ことは、バグやメンテナンス性の低下につながる大きなリスクです。こうした問題を防ぐ手段のひとつが「カプセル化(Encapsulation)」です。これは、オブジェクト指向の中核的な考え方であり、データを守りながら、操作を制御するという重要な役割を担っています。本記事では、カプセル化の仕組み、利点、実装方法、注意点までを解説します。

基本情報・概要

カプセル化とは、データとそれを操作する手段(メソッド)をひとつのまとまりとして外部から隠すことを指します。外部から直接データにアクセスさせず、専用のメソッド(getter / setterなど)を介してのみ操作させることで、安全性と一貫性を保ちます。

オブジェクト指向では、「状態(プロパティ)と振る舞い(メソッド)をひとつのクラスにまとめること」もカプセル化の一部です。

比較・分類・特徴の表形式まとめ(任意)

要素説明
プライベート変数クラスの外部からアクセスできない変数(例:
#name
,
_name
アクセサメソッドgetter / setter。値の取得・設定の際に検証や制御を挟める
情報隠蔽内部実装を外部から隠すことで変更に強く、安全な設計が可能
モジュール化カプセル化により、独立した責任を持つ構成単位としてクラスを設計できる

カプセル化は「隠すこと」ではなく、「安全に見せること」が本質です。

深掘り解説

JavaScriptでは、ES2020から正式に「プライベートフィールド」が導入されました:

class Person {
    #name;

    constructor(name) {
        this.#name = name;
    }

    getName() {
        return this.#name;
    }

    setName(newName) {
        if (typeof newName === 'string') {
            this.#name = newName;
        }
    }
}

const user = new Person("タロウ");
console.log(user.getName()); // タロウ
user.setName("ジロウ");

#name
は外部から直接アクセスできず、
getName()
setName()
を通じてのみ操作されます。
Pythonでは
_変数名
__変数名
のような名前付けで「慣習的なプライベート」を実現します。

class Person:
    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_name(self, new_name):
        if isinstance(new_name, str):
            self.__name = new_name

応用・発展的な使い方

  • 入力バリデーションの追加:setterで不正な値をはじく設計が可能
  • 内部状態の整合性の保持:勝手な変更を防ぎ、予測可能な動作を保証
  • ライブラリやAPIの設計:内部実装を変えずにインターフェースだけを公開
  • [ドメイン駆動設計(DDD)](/articles/ddd-and-its-meaning)との親和性:オブジェクトの責務を明確化できる

カプセル化は小さなアプリから大規模設計まで、あらゆるレベルで活躍します。

よくある誤解と注意点(任意)

  • カプセル化=隠すだけと思い込む:本質は「安全に触れさせること」
  • すべてをgetter/setterで覆う必要はない:必要な箇所にだけ導入すればよい
  • プライベート変数でも完全な非公開ではない場合もある(例:Pythonの名前マングリング)
  • setterで副作用を起こしすぎると予測困難に:状態変更は慎重に設計すべき

「隠すべきは何か? 見せてよいのは何か?」という視点が重要です。

まとめ

カプセル化は、オブジェクト指向における基本中の基本であり、安全で変更に強い設計を実現するための鍵です。データを守り、インターフェースを通じて制御可能にすることで、ソフトウェアの信頼性と再利用性が大きく高まります。小さなクラス設計でも、まずは「カプセル化できるか?」を意識してみることが、堅牢な設計への第一歩となるでしょう。