見出し画像

ひとくち解説「カプセル化ってなんだろう」

この記事は公立はこだて未来大学 Advent Calendar 2023 Part2 15日目、あらた界隈アドベントカレンダー 10日目の記事です。(日にちが違うのは気にしないでいただけると幸いです…)

また、この記事は以下の記事に触発されて書いています。

ここ3年間、ETロボコンでOOPとチームマネジメントを扱ってきたので、その手の話を見てしまうとついつい反応してしまいます。
なので、僕なりにこの記事と同じテーマを扱って議論してみたいと思います。


よく「カプセル化」と言いますが、そもそもカプセル化ってなんでしょう?
僕はカプセル化を次のように定義しています

変数や関数の見える範囲を制限することで、機能の独立性を高める方法。

よくある間違いとして、「変数をprivateにしてゲッターとセッターを作れば、カプセル化をしたことになる」というものがあります。
これを題材にした動画があるので紹介します。

また、この動画の作者は、この動画に来たリプに次のように返しています。

この作者によるカプセル化の定義は、「クラスそれ自体が一個体で正常に動作できるよう、異常動作させないよう必要な機能を内部に持たせ、正常操作可能なメソッドのみ公開すること」いうことになります。

ところで、僕がオブジェクト指向を人におすすめする時におすすめする資料があります。その名も「オブジェクト指向できていますか?」です。

このスライドの12ページ目から始まる文には、次のようにあります。

理想的なオブジェクト指向の世界とは?
小さな大量のオブジェクトがお互いメッセージを送りながら協調し複雑なシステムを構築する。
各クラスは、1つの機能に集中し、最小限のインターフェースで構成されています。

「オブジェクト指向できていますか?」より

これはオブジェクト指向という考え方に関するものですが、カプセル化とは何かを理解するのにも有用です。なぜなら、カプセル化はオブジェクト指向の特徴の1つですから。

ここで、これまで紹介したカプセル化の定義の共通点を見つけてみましょう。

変数や関数の見える範囲を制限することで、機能の独立性を高める方法。

僕によるカプセル化の定義

クラスそれ自体が一個体で正常に動作できるよう、異常動作させないよう必要な機能を内部に持たせ、正常操作可能なメソッドのみ公開すること

ミノ駆動さんによるカプセル化の定義

理想的なオブジェクト指向の世界とは?小さな大量のオブジェクトがお互いメッセージを送りながら協調し複雑なシステムを構築する。各クラスは、1つの機能に集中し、最小限のインターフェースで構成されています。

「オブジェクト指向できていますか?」より

…わかりましたか?答えは「独立」「一個体」「1つの機能に集中」です。
これらがカプセル化のめざすところではないだろうか…というのが僕の意見です。

最後に、カプセル化についてのエッセイを紹介させてください。
これは、「プログラマが知るべき97のこと」という本に記載されているものです。これ以外にも参考になるエッセイが多いですが、今回はカプセル化についての記事ですので、それに関連するものを選んでみました。

簡単にはなりましたが、「カプセル化ってなんだろう」は以上になります。
オブジェクト指向設計の世界はすごい深いので、是非一度潜ってみてください。


付録: 参考になる資料

僕がオブジェクト指向モデリングを勉強するときに読んでよかった資料たちをまとめました。