オブジェクト指向におけるカプセル化の役割について


はじめに

オブジェクト指向においてカプセル化という概念が存在しますがどうもその存在意義(役割)がいまいち分からなかったので,なんとなく理解した範囲でここに残しておけばと思います.

また,すでに色々な記事でそれについてはまとめられていると思いますが,ここでは自分なりの解釈をまとめさせてもらいます.

なぜ自分はカプセル化が分からなかったのか

Javaなどのクラス内においてプロパティ(属性)やメソッドを定義しますが,その際にパブリックかプライベートの2つの性質が出てきます.

パブリックだとクラス外からアクセスできてプライベートだとクラス外からアクセスできない.

だけど,普段から何も考えずにクラスのメソッドはその都度アクセスして書き換えたりしていた自分にとって,わざわざプライベートでプロパティやメソッドを定義して,メソッド越しにアクセスするという意味がよく分かりませんでした.

カプセル化の存在意義

色々な記事を見ているとプライベートで定義することは保護することを目指しているといった記述を見かけますが,「保護する」で終えられてもその保護する意味が自分にとってはどうも分かりませんでした.

また,コードの実例として属性を取り出したければgetName(){return this.Name;}のようなメソッドを作っておいて取り出しましょうといった記述もよく見かけます.

だけど,そのままクラスから属性にアクセスしても同じでわ,と自分は感じていました.

しかしながら,よくよく考えてみると,そのままクラスから属性にアクセスすると値を参照するだけでなく上書きも許すことになってしまい非常に不便です.

加えて,そもそもそういった簡単な応答を想定する(単に値を返したり値をセットする)よりも,何かしらの手続きに従って値を返したりセットしたりするケースが大半です.

あとは,属性の値を変更する際に別の属性への影響が伴ったり,数値として属性がとる範囲が決まっていることが多く,許されたメソッドないの手続きに従って参照や上書きを行うようにすれば便利だからといった側面もあるのだと思います.

例えば,対戦ゲームを作る場合,キャラクタのクラスで定義される体力などは上限・下限(100〜0)などが決められているものであり,きちんとした手続きに従って数値(属性)は変更されるべきです.勝手に1000などと書き換えられては困ります.そういったケースを考慮した結果でカプセル化が生まれたのではないでしょうか.

また,そもそもクラス内のメソッドに直接アクセスを許しておく必要性もあまりありません.例えば.オブジェクトはパッケージに格納されて中身をしらずとも我々は使用することができるわけですが,中身の知らない人間に悪意があろうとなかろうと間違ったクラスの使い方されてしまっては困ることの方が多いです.そこで,クラス内の属性は基本的にアクセスを許さず,許可したメソッドを通してのみ値を参照したり上書きしたりするようにしたほうが意図しないエラーを回避できるといったメリットもあります.

そもそも,オブジェクトは何かしらの概念(キャラクタ,モンスター,人間,建物など)に従ってパッケージングされたものであり,メソッド単位で数値(属性)や処理を管理していくものだからこそ,カプセル化は存在しているのだと私は理解しました.

さいごに

私の理解不足もありますが,詰まるところ

オブジェクト指向においてクラスの中で定義される数値(属性)や手続き(メソッド)はそれぞれ独立して扱われるものではなく,互いに関わり合いを持ちながら属性はメソッドで管理されるものであり,メソッドは単なる関数として扱われるものでもない

最終的に理解したことはこのようになります.

今回は私なりにカプセル化の理解についてまとめさせてもらいましたが,もっと分かりやすい解釈があれよという方がいればぜひ教えていただきたいです!