【Unity/C#】オブジェクト指向のカプセル化や隠蔽について

【Unity/C#】オブジェクト指向のカプセル化や隠蔽について

「オブジェクト指向のカプセル化や隠蔽について」なんてタイトルを付けましたが、実はプログラミングにそんなに慣れていなかった頃はこの文字列が呪文のように聞こえました。

「オブジェクト指向」が急に出てきて、「隠蔽(いんぺい)」も難しい漢字だし、「カプセル化」はどこから出てきたの? 隠蔽とカプセル化は同じものを指してるの? と本気で悩んでました。

実は隠蔽とカプセル化は言葉を使う人によって同じ意味で使っていたり、違う意味で使っていたりと、結構厄介な言葉だったりします。

そこで自分で振り返るために自分の言葉でまとめ直してみたいと思います。

 

 

参考文献

たくさんの書籍に登場する「カプセル化」「隠蔽」についてまとめていらっしゃいます。ひとつのキーワードについて横断的に書籍を確認している点がとても素晴らしいです。

 

オブジェクト指向プログラミング

「オブジェクト指向プログラミング」はお互いに関連するデータとメソッドをひとつにまとめた「オブジェクト」を使ってプログラム全体を組み上げていくもの。この関連のあるデータとメソッドをまとめることをカプセル化と呼びます。

よく出てくる例えとして、テレビに対するリモコンが出てきます。リモコンからは「1ボタンが押されたよ!」とメッセージを送って、それを受け取ったテレビ側で1ボタンに対応する処理を行います。

この時、リモコンからは具体的な手順を示しておらず、どうするかについてはテレビの機械の中(カプセル)に任せる形になっています。1ボタンを押したらNHKになるかもしれませんし、NHKの教育になるかもしれませんが、リモコン側からはメッセージを送るだけなんですよね。

リモコン側から「この回路を切り替えて、周波数はここに合わせて、映像出力はこうして……」なんて指示を送るようにしてしまうと、私たちが使うときにめんどくさいですよね(笑) 中のことまで知らなくていいからチコちゃんだけ見せてくれ、と言いたくなります。

手続きを全部記載するのではなく、役割によってオブジェクトという形で分け、オブジェクト同士でやりとりして全体の動きを作っていこうね、というのがオブジェクト指向プログラミングです(ざっくり)

 

隠蔽って?

オブジェクト指向プログラミングにおいては、内部の実装(カプセルの中)は隠蔽されていることが望ましいです。

隠蔽とはその名の通り隠すこと、特に意図して隠すことを指します。

隠蔽にもいくつかあって、データ隠蔽や情報隠蔽などがあります。

データ隠蔽はオブジェクトのデータを守ることに焦点を当てていて、例えばフィールドの値を外部から勝手に変えられないようにして安全性を高めています。C#ならprivateなフィールドにするイメージです。

情報隠蔽は内部の実装を隠すことに焦点を当てていて、外部にはインタフェース(情報をやりとりする部分)を公開してそれを呼び出してもらい、実際の処理を行うメソッドが内部で何をするかは公開しないようにする考え方です。C#だとpublicなメソッドを呼び出すイメージです。

実際の処理をオブジェクトに任せることで、外部からはインタフェースとなるメソッドを呼び出すだけで良くなり、たとえ内部で変更があったとしてもインタフェースとなるメソッド名や引数がそのままなら外部への影響は抑えられます。

こうすると部品として使いやすくなります。プログラミングにおいては1回書いたものをまた書くのではなく、使い回していくのがグッド。テストしたものを使えますし、コードを各時間を減らせますからね。

また、情報隠蔽とは中身の機能の隠蔽のことで、メソッドだけではなくてフィールドや設計なども含まれます。

「情報」のくくりは結構広いような感じです。

 

カプセル化との関わり

カプセル化として関連のあるデータとメソッドをまとめる時には情報隠蔽も同時に行うことが多いです。

というのも、外部からフィールドなどを直接いじっている状態は「関連する情報がまとまっていないのでは?」となるためです。

なので、カプセル化するといった時には隠蔽も行われているだろうという意味で「カプセル化が情報隠蔽も含む」とされることが多いです。

C#でこれを実現するときにprivate(隠す)やpublic(公開する)が出てくるんです。アクセス修飾子に関しては以下のページで簡単に触れているので、こちらもよかったらご覧あれ。

 

まとめ

説明しておいてアレですが、この辺りの定義や説明は人によって異なるので複数の意見を確認することをおすすめします。

この辺りは調べるたびに新しい言葉が出てくるので最初は辛かったです(笑) 前の会社にいたときに、帰りの電車の中でオブジェクト指向の本を頑張って読んでいましたが、初心者の頃は本当に何言ってるか分からなくて同じページを何度も読み返していました。

あの苦しみがあったからこそ今は「C#たのしー!」と日々コーディングしているのかもしれません。(どちらかというと「ゲーム作りたのしー!」かも)

覚える言葉はたくさん出てきますが、ひとつひとつ意味を理解しながら進めるのも大切だと感じます。

 

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!