「カプセル化」の版間の差分

削除された内容 追加された内容
Addbot (会話 | 投稿記録)
m ボット: 言語間リンク 19 件をウィキデータ上の d:q1305241 に転記
編集の要約なし
2行目:
'''カプセル化'''(カプセルか、{{Lang|en|encapsulation}})とは、[[オブジェクト指向]]を構成する概念の一つ。オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、オブジェクトの実際の型を隠蔽したりすることをいう。データ隠蔽と勘違いされやすいが、データ隠蔽はカプセル化の具体例の1つにすぎず、同一のものではない。
 
== 考え方 ==
(やや人工的ではあるが)データ隠蔽の例として、色を表すオブジェクトを考えてみる。
 
カプセル化の第一の利点は変更に対する耐久性である。いま色の内部表現が[[RGB]] ([[原色#加法混色|光の三原色]]) で保持されているとして、これが何らかの都合で[[CMYK]] ([[原色#減法混色|色の三原色]]) に変更されたとする。外部のプログラムがデータ内部に直接アクセスを行っていた場合、このデータにアクセスしていたすべての箇所を同時に変更しなければならない。しかし公開メソッドを用いていれば、変更は内部表現から外部表現への公開メソッド内のみで済み、変更の影響を局所にとどめる事ができる。
38 ⟶ 39行目:
</source>
とすることでもフィールド<code>x</code>にアクセスし同じ実行結果を返すことができる。
また、 <code>public</code>な変数であるため当然
<source lang="java">
nec.x = -20;
45 ⟶ 46行目:
とすることでフィールド値を<code>100</code>から<code>-20</code>に変えて表示することもできる。
 
このクラスはフィールド変数<code>x</code>が<code>public</code>になっているため簡単に<code>x</code>にアクセスしデータを変えることができてしまいカプセル化されていない。
簡単にデータを変えることができてしまい、カプセル化されていない。
 
ここで上記のクラスを以下のように変更すると
75行目:
System.out.println(nec.x);
</source>
としただけでコンパイルエラーが発生する。フィールド変数<code>x</code>はアクセス権が<code>private</code>なので同一クラス内からしかアクセスできない。それに違反しているためこの時点でコンパイルエラーとなる。
同一クラス内からしかアクセスできない。それに違反しているためこの時点でコンパイルエラーとなる。
 
ここでは<code>getX()</code>メソッドを使って間接的にしかフィールド変数にアクセスすることができない。
88 ⟶ 87行目:
</source>
この時点でもコンパイルエラーが発生する。
ここでフィールド変数<code>x</code>を変更するには、フィールド変数は<code>private</code>になっており、クラスの修飾子にはfinalがついているため継承が禁止されておりサブクラスからフィールド変数にアクセスすることもできない。
クラスの修飾子にはfinalがついているため継承が禁止されておりサブクラスからフィールド変数にアクセスすることもできない。
ここでは<code>setX(int x)</code>メソッドを使わなくては<code>x</code>にアクセスしてxの値を変更することはできない。
では、
ここで<code>setX(int x)</code>を以下のように実行したらどうなろうだろうか。すると、
<source lang="java">
nec.setX(-20);
</source>
プログラムソースコードのコンパイルは通る。しかし実行時に<code>ArithmeticException</code>例外が生じてプログラムが終了してしまうようにプログラムされている。同様
<code>ArithmeticException</code>例外が生じてプログラムが終了してしまうだろう。
なぜならそのようにプログラムされているからだ。
同様に
<source lang="java">
nec.setX(201);
</source>
としても<code>ArithmeticException</code>例外が生じて終了してしまうだろうする
このようにフィールド変数<code>x</code>に代入できる数値範囲を計器やバルブの調節ツマミの安全弁のように限定したいとき、安全のため、セキュリティのため、不用意にこの変数に特定の値を入れたくないときカプセル化は役立つ。
安全のため、セキュリティのため、不用意にこの変数に特定の値を入れたくないときカプセル化は役立つのである。
 
このようなカプセル化を実現する手法や構文に[[アクセサ]]、[[プロパティ]]などが存在する。