28

情報の隠蔽カプセル化の違いは何ですか?

カプセル化とは、データとそれらを一緒に操作する必要のある手順をバンドルすることを意味することを読みました。もしそうなら、次のクラスはカプセル化を達成しますか?

class IsThisEncapsulation {
    public int age;

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

データ属性を宣言すると、age private情報の隠蔽が実現しますか?

4

9 に答える 9

22

フィールドをプライベートにしてから、フィールドのセッターとゲッターをカプセル化することはよく知っています。しかし、カプセル化はこれだけを意味するのでしょうか?

--->カプセル化は、オブジェクトの状態(クラスフィールド)とその動作(メソッド)が一緒にラップされるOOPの概念です。Javaは、を使用してカプセル化を提供しますclass

情報隠蔽:

->オブジェクトのコンポーネントの一部へのアクセスを制限するためのメカニズム。age上記の例は、非公開にした場合の情報隠蔽の場合です。


当初、情報/データの非表示はカプセル化の一部と見なされていました。カプセル化の定義は次のようになります。

  • オブジェクトの一部のコンポーネントへのアクセスを制限するための言語メカニズム。
  • データを操作するメソッド(または他の関数)とのデータのバンドルを容易にする言語構造。

2番目の定義は、多くのOOP言語では、コンポーネントの非表示が自動ではないか、オーバーライドできるという事実に基づいています。したがって、情報隠蔽は、2番目の定義を好む人々による別個の概念として定義されます。

参照:wikiページ

于 2012-12-17T11:55:30.157 に答える
22

カプセル化と情報隠蔽は非常に密接に関連した概念ですが、正確な定義は話し相手によって異なります。

「情報隠蔽」の概念は、システムの相互接続性を減らすために情報へのアクセスを制限する必要があることを示唆したParnas(1972)によって最初に説明されました。彼は、これにより、ユーザーフレンドリーな外部インターフェイスを維持し、クライアントに影響を与えることなく実装の詳細を変更できるようにしながら、システムをモジュールに分割することが容易になると提案しました。

「カプセル化」という用語は、システムの複雑さを軽減し、危険な変更からデータを保護するために、基礎となるデータへのアクセスを制御する手順の使用を説明するためにZilles(1973)によって造られました。

その後、Parnas(1978)は、情報の隠蔽とカプセル化(および抽象化)を同義語として説明しました。これは、変更される可能性のあるシステムの詳細の隠蔽を説明しています。ただし、カプセル化を「情報隠蔽の厳格な実施」と説明したMicallef(1987)のように、情報隠蔽とカプセル化の間には区別があります。Cohen(1984)Abreu and Melo(1996)などの一部の著者は、特にオブジェクト指向プログラミング言語での「カプセル化メカニズム」を、情報の隠蔽を可能にするものとして説明しています。

Meyers(2000)は、コードの一部がカプセル化される程度は、変更された場合に破損するコードの量に依存することを示唆しています。この意味で、プライベートデータとメソッドは、アクセスできるメソッドが少ないほど、よりカプセル化されます。対照的に、パブリックデータとメソッドは、アクセスできるコードの量が不明であるため、完全にカプセル化されていません。

逆に、Rogers(2001)は、カプセル化は、データをそのデータを操作するメソッドにバンドルできるようにする言語メカニズムにすぎないと示唆しています。彼は、カプセル化は基本的に情報隠蔽とは何の関係もないと主張しています。ただし、この定義は、彼の記事が公開される前の28年間の学術文献でのこの用語のほとんどすべての使用法に反しています。この使用法の例は他にもいくつかあります。たとえば、Archer and Stinson(1995)ですが、それらはごくわずかであり、特に注目に値するものではありません。

結論として、情報隠蔽とは、クライアントに影響を与えることなく設計を変更できるように、情報を隠蔽する必要があるという考えです。これにより、柔軟性と安全性が向上します。カプセル化は情報隠蔽と同じと見なすことができますが、この用語は、特にオブジェクト指向プログラミングにおける情報隠蔽の実際の実装を説明するためによく使用されます。

情報の隠蔽/カプセル化の例として、次のクラスを検討してください。

public class BankAccount {
    public int dollars;
}

このクラスの実装は完全にカプセル化されていません。つまり、柔軟性がなく(たとえば、将来的に個々のセントのサポートを簡単に追加できない)、安全ではありません(たとえば、アカウントがマイナスに変更される可能性があります)。ただし、正式に定義されたメソッドのインターフェイスの背後にデータを隠すと、柔軟性と安全性が得られます。

public class BankAccount {
    private int dollars;

    public void deposit(int dollars) {
        this.dollars += Math.max(0, dollars);
    }
}

これで、状態の変更方法を制御できるようになりました。また、クライアントコードを壊すことなく、実装を変更することもできます。

public class BankAccount {
    private int cents;

    public void deposit(int dollars) {
        deposit(dollars, 0);
    }

    public void deposit(int dollars, int cents) {
        this.cents += Math.max(0, 100 * dollars) + Math.max(0, cents);
    }
}

基礎となる実装に関する情報が隠されているため、クラスはより適切にカプセル化されています。

于 2016-09-14T20:43:55.253 に答える
9

抽象化対情報隠蔽対カプセル化から

抽象化とカプセル化は補完的な概念です。抽象化はオブジェクトの観察可能な動作に焦点を当てます...カプセル化はこの動作を引き起こす実装に焦点を当てます...カプセル化はほとんどの場合、情報隠蔽によって実現されます。これは、すべてを非表示にするプロセスです。その本質的な特性に寄与しないオブジェクトの秘密。

情報隠蔽:

「そのインターフェースまたは定義は、その内部の仕組みについてできるだけ明らかにしないように選択されました。」— [Parnas、1972b]

「抽象化は、どの情報を非表示にするかを識別するための手法として使用できます。」

「人々が情報の隠蔽と、どの情報を隠蔽するかを特定するために使用される手法(抽象化など)とを区別できない場合、混乱が生じる可能性があります。」

カプセル化:

「それは[…]あるもののコレクションの周りに、概念的な障壁の場合にはカプセルを構築することを指します。」— [Wirfs-Brock et al、1990]

「プロセスとして、カプセル化とは、[…]コンテナ内に1つまたは複数のアイテムを封入する行為を意味します。エンティティとしてのカプセル化とは、1つまたは複数のアイテムを保持(収容、封入)するパッケージまたはエンクロージャを指します。」

「カプセル化が「情報隠蔽と同じもの」である場合、「カプセル化されたものはすべて隠蔽された」という議論をするかもしれません。これは明らかに真実ではありません。」

于 2012-12-17T11:24:57.353 に答える
5

それらの間には微妙な違いがあります。SteveFreemanとNatPryceが書いた「GrowingObject-OrientedSoftwareGuidedbyTests」の本の説明が好きです。

それは言う:

カプセル化

オブジェクトの動作がそのAPIを介してのみ影響を受けることを保証します。無関係なコンポーネント間に予期しない依存関係がないことを確認することにより、1つのオブジェクトへの変更がシステムの他の部分に与える影響を制御できます。

情報隠蔽

オブジェクトがAPIの抽象化の背後にある機能を実装する方法を隠します。手元のタスクに関係のない低レベルの詳細を無視することで、より高度な抽象化を処理できます。

于 2012-12-17T11:28:43.017 に答える
1

それらの文字通りの意味を見てください。カプセル化とは、物をバッグに入れることです。つまり、すべての属性とメソッドをクラスに入れるとカプセル化が実現します。ただし、ある程度までは、カプセル化によって情報を隠すこともできます。アクセス修飾子は、カプセル化には寄与しませんが、情報の隠蔽には寄与します。

于 2012-12-17T11:29:27.240 に答える
1
class NoEncapsulationNoInformationHiding { 
    public List widths = new ArrayList();
}

class EncapsulationNoInformationHiding {
    private ArrayList widths = new ArrayList();

    public ArrayList getWidths() {
        return this.widths;
    }
}

class EncapsulationInformationHiding {
    private List widths = new ArrayList();

    public List getWidths() {
        return this.widths;
    }
}
  • カプセル化:データとこれらのデータを操作する手順(オブジェクトを構成する)などを組み合わせます。カプセル化は、任意のプロシージャがパブリックデータを操作できるため、オブジェクトのデータを非表示にすることを意味します。
  • 情報隠蔽:オブジェクトの実装、つまりオブジェクトのデータ、そのプロシージャの実装、パラメータのクラス、およびそのプロシージャの戻り値などを抽象化します。情報の隠蔽はカプセル化を意味しますが、その逆ではありません。

ウィリアムアンダーウッドからインスピレーションを得た例。

于 2018-10-08T20:22:02.490 に答える
0

あなたの質問に答えるには:

情報の隠蔽:内部で実装される方法を公開するオブジェクトの重要な部分を非表示にし、より高度な抽象化を公開します。例:テレビのリモコンでは、テレビとやり取りするためのキーのみが表示され、内部に何が入っているかはわかりません。

カプセル化:カプセル化とは、データとメソッドを組み合わせて、パブリックメソッドから内部データにアクセスできるようにすることです。だから、はい、あなたのクラスで、あなたが可変年齢をプライベートにすると、あなたはカプセル化を達成するでしょう

于 2012-12-17T11:36:00.517 に答える
0

これは、情報の隠蔽、カプセル化、またはそれが呼び出すものを実装しない場合に発生します。独立していると思うコーナーのどこかで何かを変更すると、悪いことが起こります。次に、システムで使用されているサードパーティのライブラリを変更する場合、システム全体にリファクタリングしないと移動できない参照がシステムのいたるところにあることがわかります。たとえば、データアクセスライブラリのバージョンをアップグレードしたい場合(ODP.netバージョンを更新したいときにこの問題に直面しました)、DBへの参照を持つはずのDataAccessクラスを変更したいと考えていると推定します。クライアントライブラリ。しかし、すべてのビジネスクラスがDBクライアントライブラリの参照を作成していることがわかります。ここで、1つではなく60のアセンブリの参照を更新する必要があります:( 情報漏えい

内部ロジックをクライアントに公開するときにも同じことが起こります。たとえば、有効なフラグとして「A」、「B」を受け入れ、関数内でいくつかのロジックを実行する関数EnrollMember(文字列フラグ)があります。後でこの機能を変更したい場合は、クライアントに通知せずに変更することはできません。

于 2019-02-12T08:11:41.177 に答える
-1

->カプセル化により、オブジェクトの特定の部分へのアクセスを提供し、同時に他の部分へのアクセスを制限できます。言い換えれば、カプセル化により、情報を隠すことができます。

->情報隠蔽は、実際には制限のプロセスまたは行為です

于 2018-01-20T05:31:58.373 に答える