Edited at

筋トレ大好きな文系女学生のJava入門_カプセル化の目的&メリット

More than 3 years have passed since last update.


はじめに

数日前から、プロが飲むプロテインを飲んでいるんですけど、プロテインってやっぱり重要 :sunglasses: !!

アミノモト、、、あ、味の素ですね。のアミノバイタル・アミノプロテイン・レモン味を運動後直後に摂取しているんですが、なんと腹斜筋が成長して縦線綺麗にシャキーンと :star2: 見えてきました :notes: :notes:

今回から数回に分けてカプセル化についでです。

独学でやってるので、「これはJavaやっていくにあたって役に立つ知識だぞ!!」というのがあれば、コメントして頂けるととても嬉しいです :heart:


:sparkling_heart: :sparkling_heart: カプセル化の目的とメリット :sparkling_heart: :sparkling_heart:

Javaのカプセル化とは、フィールドへの読み書きやメソッドの呼び出しを制限する機能。

例えば、「SexyPoseメソッドは、MuscleGirlクラスからは呼び出せるけど、MuscleBoyクラスからは呼び出せない」や「このフィールドの内容は誰でも読めるけど、書き換えることはできない」といったことを実現する :grinning: :grinning:

大切なものに対するアクセスは不自由である方がよいということは、現実世界でも同様 :exclamation: :exclamation:

例えば、銀行口座やクレジットカードの暗証番号、各国のトップしか入れない施設。

周りには「制限」が行われている例が多くある。

この例のように、情報へのアクセスや動作について、「誰に何を許すのか」を定めて制限することを、アクセス制御という。

フィールドやメソッドにアクセス制御をかけることにより、間違ったフィールド・メソッドの利用を防止し、原因箇所を特定しやすくする。それがJavaにおけるカプセル :exclamation: :exclamation:


アクセス制御されない恐ろしさ :goberserk: :broken_heart:

では、アクセス制御について学ぶ前に・・・

「アクセス制御されないプログラムがどれほど危険なのか」を、ストーリーゲームの開発プロジェクトを例に考えてみる。




設定



筋肉ボーイ :boy: はインスタンス化されるとHPが100になり、workOutでHPが減少



//アクセス制御されないプログラム

1 public class MuscleBoy{
2 int hp;
3 String name;
4 static int money;
5
6 void run(){
7 System.out.println(this.name + "は、逃げた!");
8 }
9 void drink(){
10 System.out.println(this.name + "は、飲んでいる");
11 }
12 void workOut(){
13 this.hp -= 10;
14 System.out.println(this.name + "は、筋トレをした!");
15 System.out.println("−10ポイントHPが減った!!");
16 }
17 }

では、MuscleBoyクラスを使ったゲームのテスト中に、「workOutを一度もしていないのに、筋肉ボーイのHPがー100になっている」という大変な事態に遭遇したとする。

数万行もあるプログラムの不具合を徹夜で、調査したところ、Proteinクラスに問題が発覚 :grey_exclamation: :sweat_drops:

1 public class Protein{

2 void recover(MuscleBoy mb){
3 mb.hp -= 100; //不具合
4 }
5 }

翌日、今度は「筋肉ボーイがworkOutを終了後、なぜか酔っ払ってしまった」という問題が見つかった。

また徹夜で調査したところ、「スポーツトレーナークラス」に不具合があった :triumph: :exclamation: :anger:


1 public class SportsTrainer{
2 void talk (MuscleBoy mb){
3 System.out.println("おつかれさん!" + mb.name );
4 System.out.println("今回の筋トレ疲れたじゃろ?");
5 System.out.ptintln("プロテイン摂取して、回復しといてな〜。では、次回のトレで会おう!");
6 mb.drunken(); //ここが不具合の原因!酔っ払ってしまった・・。
7 }
8}

開発者がうっかり、drink()をdrunken()と聞き間違えてしまったようだ・・。

上記のようなミスは、プログラムに以下のようなアクセス制御を含んでいれば事前に防げたはず。

・MuscleBoyクラス以外からはHPフィールドに値を代入できない

・drinkメソッドを呼べるのはMuscleBoyクラスだけ

カプセル化は、このようなアクセス制御を実現し、バグを未然に防ぐことができるのだ :wink: :v: :star2: :exclamation: