web-dev-qa-db-ja.com

カプセル化がOOP言語の重要な機能である理由は何ですか?

なぜカプセル化が使用されるのかと質問された別のインタビューに出くわしましたか?カプセル化が実際に必要なのは誰ですか?プログラムのユーザー向けですか?それとも同僚向けですか?それともハッカーからコードを保護するためですか?

22
Shahzad

カプセル化は、クラスのクライアント(このクラスを使用している他のクラス/関数)に公開されている動作から実装の詳細を分離するのに役立ち、 coupling コード内。 Robert Martinの本 Clean Code の例と同様の例を考えてみます。

public class Car
{
//...
public float GetFuelPercentage() { /* ... */ };

//...

private float gasoline;
//...
}

車内の燃料量を提供する関数を使用するクライアントは、車が使用する燃料の種類を気にしないことに注意してください。この抽象化は、懸念(燃料の量)を重要ではない(このコンテキストでは)詳細から分離します。それがガス、石油、その他の何かであるかどうかです。

2つ目は、クラスの作成者はクラスの内部で好きなことを自由に実行できることです。たとえば、ガソリンをオイルに変更するなど、動作を変更しない限りです。これは、プライベートであるため、誰もこれらの詳細に依存しないことが確認できるという事実のおかげです。コード内の依存関係が少ないほど、柔軟性が高く、保守が容易になります。

過小評価された回答tnapistim で正しく記載されているもう1つのこと:低結合は、コードのテストとそれらのテストの維持にも役立ちます。クラスのインターフェースが複雑でないほど、テストが容易になります。カプセル化しないと、すべてが公開されているため、何をどのようにテストするかを理解するのは困難です。

コメントでいくつかの議論を繰り返すには:

  • いいえ、カプセル化はOOPで最も重要なものではありません。あえてあまり重要ではないと言ってもいいでしょう。重要なことは、疎結合のようなカプセル化によって奨励されていることです。しかし、それは必須ではありません。慎重な開発者は、変数などをカプセル化せずに疎結合を維持できます。 vlastach で指摘されているように、Pythonは、にはカプセル化を強制するメカニズムはありませんが、OOPにはまだ実行可能です。

  • いいえ、フィールドをアクセサの後ろに隠すことはカプセル化されません。あなたがした唯一のことは、変数の前に「プライベート」と書いて、それらのそれぞれに対して無意識にget/setペアを提供した場合、実際にはそれらはカプセル化されません。コード内の離れた場所にいる誰かがクラスの内部をいじくり回し、それらにdependできる(まあ、もちろんビットフィールドではなくメソッドに依存することをお勧めします)。

  • いいえ、カプセル化の主な目的はミスを回避することではありません。主な目標は少なくとも上記にリストしたものと同様であり、カプセル化によって間違いを防ぐことができると考えるのは素朴です。プライベート変数を変更する以外にも、間違いを犯す方法は他にもたくさんあります。そして、プライベート変数を変更することは、見つけて修正することはそれほど難しくありません。繰り返しますが、Pythonは、強制することなくカプセル化できるため、この引数の良い例です。

35
BartoszKP

カプセル化は、アクセスすることになっているものだけにアクセスできるようにすることで、コードに取り組んでいる人が間違いを犯さないようにします。

18
SLaks

少なくともほとんどのOO言語では、カプセル化はバスルームのドアの鍵とほぼ同じです。

それはnotだれかが本当に入りたいと主張するならば誰も締め出すことを意図している。

それはis入ることが主に以下につながることを人々に知らせる礼儀として意図されています:

  1. 恥ずかしい、そして
  2. 臭い混乱。
13
Jerry Coffin

カプセル化を使用すると、抽象化のレベルを分離して、インターフェースを形式化できます(つまり、「アプリケーションロジックアクセスIOこの方法でのみコード)」。

これにより、インターフェイスを変更することなく(そしてクライアントコードに影響を与えることなく)、モジュールの実装(モジュール内のデータとアルゴリズム)を変更できます。

モジュールを相互に独立して変更できるこの機能により、パフォーマンスを測定し、プロジェクトの期限内で予測を行う能力が向上します。

また、モジュールを個別にテストして他のプロジェクトで再利用することもできます(カプセル化によって相互依存性が低下し、コードのモジュール性が向上するためです)。

カプセル化を強制しないと、プロジェクトが失敗する傾向があります(問題はプロジェクトの複雑さとともに増大します)。

12
utnapistim

ファストトラックプロジェクトを設計しました。カプセル化により、システム全体の変更の伝播が減少します。変更には時間とお金がかかります。

コードがカプセル化されていない場合、人は多くのファイルを検索して、変更を加える場所を見つける必要があります。逆に、「すべての場所は見つかりましたか?」という質問があります。もう1つのポイントは、「これらの分散の変更をすべて行うことは、システム全体にどのような影響を与えるか」です。

私は組み込みの医療機器に取り組んでおり、品質は不可欠です。また、すべての変更を文書化し、レビューし、単体テストを実施し、最後にシステムテストを実施する必要があります。カプセル化を使用することで、変更の数とその場所を減らすことができ、再テストする必要のあるファイルの数を減らすことができます。

7
Thomas Matthews