カプセル化とは何か
カプセル化とはオブジェクト指向の根幹をなす考え方です。カプセル化について考えて見ましょう。(本記事はC#をベースに考えていますが、カプセル化自体はオブジェクト指向言語全般に関して共通することでしょう)
カプセル化とAPI
自販機を例に考えてみましょう。
オブジェクト指向なのですから、当然まずは自販機クラスを作ります。
オブジェクト(自販機)を外から使う人(飲み物の購入者)の視点から見て、必要な入力と出力は、
- お金を入れる
- 飲みたいジュースを選ぶ
- 選択したジュースが出てくる
- お釣りがある場合はお釣りも出てくる
これだけです。つまり必要なAPIはこれだけです。
当たり前のように感じますが、これ以外のAPIは公開する必要がありません。
むしろ公開してはいけません。
当たり前のようなことを書きますが、以下は公開してはいけないAPIの例です。
- 自動販売機が製造された工場の名前
- 自販機内に溜まっているお金の総量
- 投入されたコインが500円玉か100円玉かを判別する方法
- ジュースの缶を押し出す機構に使われているバネの種類
- etc...
まず1つ目。自動販売機が製造された工場の名前。
こんなものはジュースの購入者にとってはどうでもいいことです。公開されるAPIは少なければ少ないほどいいので、こんなものを公開する意味がないです。
2つ目。販機内に溜まっているお金の総量
これも1つ目と同様、利用者にとっては関係ないです。むしろ、セキュリティの観点から見て、公開することにデメリットしかないです。泥棒に盗んで欲しいのでしょうか。
3つ目と4つ目。投入されたコインが500円玉か100円玉かを判別する方法、ジュースの缶を押し出す機構に使われているバネの種類
これは利用者側から見れば上記の2つ同様不要な情報です。しかし、自販機内部にとっては必要な情報です。つまりこれはpublic
で公開すべきAPIではなく、private
で実装されるべき内容です。特に500円玉と100円玉の判別方法など外部に公開するのはセキュリティ的にもまずいでしょう。
つまり、ユーザーにとって自販機とはお金とジュース名を入力したら、ジュースとお釣りを出力するだけの装置にすぎません。自動販売機の中でどのようにジュースが保管されており、投入したコインの金額をどのように数え、どのようにジュースを取り出し口まで運んでいるかなど、内部の仕組みについて一切考える必要がないのです。
自販機内のジュースが5℃以上で保存されている場合はジュースのボタンを3回押さなければならない、などという仕様の自動販売機があるとすれば、それは明らかに欠陥品だとは思いませんか?
こんな当たり前のことなのに、ソフトウェア開発の現場ではこのような意味不明なオブジェクトが横行しています。キレそう