データの抽象化と情報の隠蔽に違いはありますか?このリンクのすべての答えを調べた後、私はもっと混乱しています。 抽象化VS情報隠蔽VSカプセル化 違いは見つかりませんでした。一方(情報の非表示)を目標と呼び、もう一方(抽象化)をプロセスと呼ぶことができるというだけですか?しかし、これは私にとって満足のいく違いではありません。さらに、カプセル化は抽象化のプロセスを実装するための手法であることがわかりました。私はここにいますか?正確な違いを説明してください。
5 に答える
情報の隠蔽とは、設計者が実装の詳細へのアクセスを制限することを明確に決定した場合です。これはオブジェクト指向設計よりも古い原則ですが、よく使用されます。
簡単な例は、Cで定数を定義することです。たとえば、定数#define NAME_SIZE 15
のコード(クライアント)はその値を知る必要はなく、後で値を変更することにした場合でも問題はありません。あなたがそれを変更することを決定するかもしれないので、彼らはそれが本当に15であるという事実について仮定をするべきではありません。
抽象化とは、集合体を扱う場合です。たとえば、車は、シャーシ、モーター、ホイールなどの詳細を抽象化したものです。抽象化により、複雑なことをより簡単に考えることができます。
カプセル化は、抽象化を構成する要素の詳細レベルを決定する方法です。適切なカプセル化は、情報の隠蔽を適用して、詳細の制限を適用します。たとえば、私の車は実際にはすべての部品で構成されていますが、それでも私(ドライバー)に提供するのは、私のニーズに適したインターフェースのみであり、それ以上ではありません。ドア、ロック、窓、ライト、ホーン、サンルーフ、移動方向、加速、減速などを制御できます。これらすべての「方法」の詳細を操作したいと思うかもしれませんが、カプセル化によって防止されます。私はもっと見ることから。
車の実装が変更された場合(燃焼エンジンから電気またはハイブリッドに変更)、ドライバーとしての私は限られたインターフェースしか知らないため、車の運転方法を変更する必要はありません。抽象化により、何百もの金属やゴムなどではなく、自分が車を運転していることを知ることができます。
情報隠蔽が車の一部ではなかった例は、チョークバルブかもしれません。私の両親は、彼らが運転した車でそれらがどのように働いていたかを私に話しました...それは電気自動車では役に立たないであろう燃焼エンジンの詳細でした。
データの非表示は、アクセス修飾子を使用してJavaメソッドと変数の可視性を非表示にするプロセスです。アクセス修飾子は、パブリック、プライベート、および保護されています。
抽象化は、このクラスを拡張するクラスのスケルトンを形成する抽象クラスとメソッドのBeanによって特定の動作を定義するプロセスです。
"Information hiding" is an important PART of "Data abstraction", but not the whole concept.
And remember: you can (and should) have "information hiding" in procedural code (like "don't use globals", etc in FORTRAN or BASIC) - but you won't necessary have an "abstract data type".
Information hiding and Abstract Data Types are closely related, but they are different concepts.
クラスは通常、その実装の詳細をクライアントから隠します。これは情報隠蔽と呼ばれます。インターフェースを作成することにより、情報隠蔽の概念を呼び出します。
情報隠蔽の例を以下に示します...ヘッダーファイルにインターフェイスがあります...
class Coder
{
public:
Coder();
void prints();
private:
int x;
};
別のファイル「Coder.cpp」での関数の実装は...
Coder::Coder
{
x=10;//any int value you can take;
}
void Coder::prints()
{
cout<<x;
}
上記の2つのファイル(1つのヘッダーと1つのcppファイル)で行うのではなく、1つの場所で行うことができます。ヘッダーファイル自体にコンストラクターと印刷関数を定義することもできます...
class Coder
{
public:
Coder()
{
x=10;//any int value you can take;
}
void prints()
{
cout<<x;
}
private:
int x;
};
これを行った場合、情報隠蔽を実装できませんでした...そしてクライアントは私たちがどのように関数を実装したかを知るでしょう!
データの抽象化については、検討することができます...スタックの例...
スタッククラスのクライアントは、スタックの実装を気にする必要はありません。クライアントは、データアイテムがスタックに配置されると、後入れ先出しの順序で呼び出されることだけを知っています。クライアントは、その機能がどのように実装されているかではなく、スタックが提供する機能を気にします。この概念は、データ抽象化と呼ばれます。
抽象化とは、(抽象画のように)詳細の少ないものを表現することです。OO では、抽象型は、その内部表現にコミットすることなく操作できます。たとえば、電話番号の抽象化としての電話番号は、それが国コード、市外局番、および実際の番号で構成されていることをクライアントが知らなくても操作できます。抽象化は、実装方法を気にせずに抽象的なデータ型 (電話番号など) について話すことができるため、分析と設計の段階で最も役立ちます。
よりよく知られているタイプstring
は、テキストの抽象化ですstring
。実装方法を知らなくても操作できます。文字列の抽象化により、アプリケーション設計での使用に影響を与えずに内部を変更できます。
情報の隠蔽とカプセル化は、抽象データ型を実装する 2 つの方法です。抽象データ型は、内部状態やカプセル化を隠す必要さえないかもしれません。たとえば、抽象化としての Number は として実装できますint
。