web-dev-qa-db-ja.com

カプセル化と抽象化を理解する簡単な方法

抽象化とカプセル化の詳細な理解に特に興味があるOOP概念を学習します。

すでに以下をチェックアウトしました

抽象化VS情報隠蔽VSカプセル化

抽象化とカプセル化の違い?

実際の簡単なクラス/コードスニペットを使用してこれらの概念を理解することは非常に困難でした。

私の同僚の一人は、抽象化は抽象クラスを作成することであり、スコープを持つメンバー変数を保護する通常のクラスを作成することをカプセル化と呼びます。

以下を繰り返すのではなく、他の人が正確に何であるかを理解し、理解するのを助けることができる簡単な方法はありますか?

抽象化とカプセル化は補完的な概念です:抽象化はオブジェクトの観察可能な動作に焦点を当てます...カプセル化はこの動作を引き起こす実装に焦点を当てます...その本質的な特性に寄与しないオブジェクトの秘密。

61
Billa

Abstractionは、「関連する」データのみを表示し、オブジェクトの不必要な詳細をユーザーから「隠す」プロセスです。あなたの携帯電話を考えてください、メッセージを送信したり、電話をかけたりするためにどのボタンを押すべきかを知る必要があります。ユーザー。

カプセル化は、データと関数をクラスと呼ばれる単一のユニットに結合するプロセスです。カプセル化では、データは直接アクセスされません。クラス内にある関数を介してアクセスされます。簡単に言えば、クラスの属性はプライベートに保たれ、これらの属性を操作するためのパブリックgetterおよびsetterメソッドが提供されます。したがって、カプセル化により、データ隠蔽の概念が可能になります。

enter image description here

151
Yasser

Abstractionは、情報を非表示にするか、必要な詳細のみをクライアントに提供します。

例:車のブレーキ-ペダルを踏むと車両が停止することは知っていますが、内部でどのように機能するかを知る必要はありません。

抽象化の利点明日、ブレーキの実装がドラムブレーキからディスクブレーキに変更された場合、クライアントとして変更する必要はありません(つまり、コードは変更されません)

カプセル化は、データと動作を単一のユニットにバインドします。また、一部のコンポーネントへのアクセスを制限するための言語メカニズムです(これは、private、protectedなどのアクセス修飾子によって実現できます)。

たとえばクラスには属性(つまりデータ)と動作(つまりそのデータを操作するメソッド)があります

24
JRR

C#を使用した例

//abstraction - exposing only the relevant behavior
public interface IMakeFire
{
     void LightFire();
}

//encapsulation - hiding things that the rest of the world doesn't need to see
public class Caveman: IMakeFire
{
     //exposed information  
     public string Name {get;set;}

     // exposed but unchangeable information
     public byte Age {get; private set;}

     //internal i.e hidden object detail. This can be changed freely, the outside world
     // doesn't know about it
     private bool CanMakeFire()
     {  
         return Age >7;
     }

     //implementation of a relevant feature
     public void LightFire()
     {
        if (!CanMakeFire())
        {
           throw new UnableToLightFireException("Too young");
        }
        GatherWood();
        GetFireStone();
        //light the fire

     }

     private GatherWood() {};
     private GetFireStone();
}

public class PersonWithMatch:IMakeFire
{
      //implementation
 }

IMakeFire 'feature'を実装しているため、穴居人は誰でも火をつけることができます。消防士のグループ(リスト)があることは、CavemanとPersonWithMatchの両方が有効な選択肢であることを意味します。

この意味は

  //this method (and class) isn't coupled to a Caveman or a PersonWithMatch
  // it can work with ANY object implementing IMakeFire
  public void FireStarter(IMakeFire starter)
  {
        starter.LightFire();
    }

したがって、多くの詳細(プロパティ)と動作(メソッド)を持つ実装者を多数持つことができますが、このシナリオで重要なのは、発火する能力です。これはabstraction。です

火災を起こすにはいくつかの手順(GetWoodなど)が必要なため、これらはクラスの内部的な関心事であるため、ビューから隠されています。穴居人は、外の世界から呼び出すことができる他の多くの公共行動を持っています。ただし、内部作業に関連するため、一部の詳細は常に非表示になります。これらはプライベートであり、オブジェクトに対してのみ存在し、決して公開されません。これはカプセル化です

13
MikeSW

抽象化は一般化された用語です。つまり、カプセル化は抽象化のサブセットです。

Abstractionは、複雑なシステムを管理するための強力な方法論です。抽象化は、明確に定義されたオブジェクトとその階層分類によって管理されます。

たとえば車自体は明確なオブジェクトであり、ギアシステム、ステアリング機構、エンジンなどの他のいくつかの小さなオブジェクトで構成されています再び独自のサブシステムがあります。しかし、人間にとって車は単一のオブジェクトであり、その内部の詳細が不明であっても、サブシステムの助けによって管理できます。 礼儀


カプセル化:データメンバーとメソッドを単一のユニット(つまり、クラス)にまとめることはカプセル化と呼ばれます。

カプセル化は、カプセルに入れるようなものです。これは、オブジェクトに関連する関連操作とデータをそのオブジェクトに囲みます。

カプセル化は、ペンや本などを入れておくことができるバッグのようなものです。これは、メンバーと関数をカプセル化するプロパティであることを意味します。

class Bag{
    book;
    pen;
    ReadBook();
}

カプセル化とは、オブジェクトの内部詳細、つまりオブジェクトが何かを行う方法を隠すことを意味します。

カプセル化により、クライアントは、抽象化の動作が実装されている内部ビューを見ることができなくなります。

カプセル化は、オブジェクト内の情報を他のオブジェクトから保護するために使用される手法です。

変数をプライベートにするなど、セキュリティのためにデータを非表示にし、パブリックになるプライベートデータにアクセスするためのプロパティを公開します。

したがって、プロパティにアクセスすると、データを検証して設定できます。 礼儀

6
Premraj

抽象化とは、設計でキャプチャ/表示する予定のエンティティから不要な詳細を「破棄」し、ドメインに関連するエンティティのプロパティのみを保持するプロセスです。
例:車を表すには、たとえばモデルと価格、現在の場所と現在の速度、座席の色と数などは無視します。

カプセル化は、プロパティとそれらを単一の抽象化単位(つまりクラス)で操作する操作の「バインド」です。
車には、位置や現在の速度などを操作するaccelaratestopがあります。

4
Cratylus

さて、現実世界の例を使って抽象化を説明します。あなたの家には電気プラグがあり、多くのデバイスは同じプラグに接続できますが、プラグはどのデバイスに接続されているのかわかりません、つまり、デバイスの詳細がプラグに抽象化されています(隠されています)。

プラグなしでデバイスを電線に直接接続するとどうなるでしょうか?電球をワイヤーに直接接続すると、ワイヤーはどのデバイスに接続されているかを認識し、電球を交換する必要があるときはいつでも電球からワイヤー接続を削除する必要があります。つまり、電球はワイヤーにしっかりと結合されています。言い換えれば、電球とワイヤは接続先の詳細を知っている、つまり抽象化されていないことを意味します。

オブジェクト指向の世界では、抽象化はまったく同じように機能します。他のクラスの関数/プロパティを消費するクラスは、どのクラスの関数/プロパティが消費しているかを知る必要はありません。すべてをインターフェイス/抽象クラスで抽象化する必要があります。

同じ例をコーディングしましょう。ここには、デバイスを実行しているクラス「ElectricPlug」があります。ただし、クラス「ElectricPlug」には、実行しているデバイスがわかりません。インターフェイス「IDevice」を実装するクラスであれば、「RunDevice」の実装は「ElectricPlug」から抽象化されます。完全なサンプルコードを次に示します。

class Program
{
    static void Main(string[] args)
    {
        ElectricPlug electricPlug = new ElectricPlug(new Bulb());
    }
}

public class ElectricPlug
{
    private readonly IDevice _device;
    public ElectricPlug(IDevice device)
    {
        _device = device;
    }

    public void Run()
    {
        _device.Rundevice();
    }
}


public interface IDevice
{
    void Rundevice();
}


public class Bulb : IDevice
{
    public void Rundevice()
    {
       Console.WriteLine("Switched on bulb");
    }
}

カプセル化とは、内容を保護するために何かを囲むようにボックスを配置する方法です。抽象化は、何かの機能特性を抽出することで、内部の仕組みを知らなくても、抽出したものだけを使用して操作を実行できるようにします。

2つの物質が液体であると言うとき、私たちは議論することを選択している物質の特性を抽象化するために「液体」を使用しています。その抽象化は、以前の液体の経験から、物質でできることを教えてくれます。

抽象化は、実際には階層とは何の関係もありません。別の方法で物質の特性を抽出する「金属」のような別の抽象化を持つことができます。

抽象化は詳細を忘れるので、特定の抽象化を使用している場合は、抽象化によって付与されない基礎となる物質のプロパティについて質問するべきではありません。牛乳と水を取り混ぜて混ぜるのと同じように、牛乳の量を尋ねるのは大変です。

Functorは、マップの概念を持つ何かに対する抽象化です。つまり、内部の内容に対して、内部のビットを他の何かに変換する関数を実行できます。外側のものは同じ種類のもののままです。

これが役立つのは、リストで機能する関数があり、マップインターフェイスにのみ依存していることに気付いた場合、代わりにFunctorに依存して、関数がストリーム、プロミス、多分、タプル、その抽象化を共有する他のもの。

Haskellのような関数型言語には、極端なコードの再利用を実用的にするための非常に優れた抽象化機能があります。

3
Jethro Larson

抽象化 コンピューターを使用するようなものです。

GUI(グラフィカルユーザーインターフェイス)や外部ハードウェア(画面など)で表示されるものを超えて、何が起こっているのかまったくわかりません。これらすべてのきれいな色など。 一般消費者としてのあなたに関連する詳細のみが表示されます。

カプセル化 実際の行為です 無関係な詳細を隠す

コンピューターを使用していますが、そのCPU(中央処理装置)がどのように見えるかがわかりません(侵入しようとしない限り)。それはすべてのchromeとプラスチックの後ろに隠されています(またはカプセル化されています)。

OOP(オブジェクト指向プログラミング)言語のコンテキストでは、通常、次のようなセットアップがあります。

CLASS {
  METHOD { 
    *the actual code*
  }
}

「カプセル化」の例としては、通常のユーザーが見ることができない(プライベート)メソッドがあります。 「抽象化」とは、プライベートを使用するために(パブリック)できるメソッドを使用する通常のユーザーです。

2
Dan

抽象化は、インターフェイスを簡素化するために詳細を隠す手段です。

そのため、車を例にとると、車のすべてのコントロールは抽象化されています。これにより、ステアリング、加速、または減速システムの基本的な詳細を理解することなく、車両を操作できます。

good抽象化は、同様の問題の複数のインスタンスにわたって、インターフェースを広く標準化するものです。 great抽象化は、業界を変える可能性があります。

現代のハンドル、ブレーキペダル、およびアクセルペダルはすべて、優れた抽象化の例です。車のステアリングは当初、自転車のステアリングに似ていました。そして、ブレーキとスロットルの両方が手で操作されました。しかし、今日使用している抽象化は非常に強力で、業界を席巻しました。

-

カプセル化は、外部操作から保護するために詳細を隠す手段です

カプセル化は、ステアリング、サスペンション、ブレーキングの剛性からスロットルの特性、トランスミッションまで、ドライバーが車の運転方法を操作できないようにするものです。ほとんどの車は、これらを変更するためのインターフェースを提供していません。このカプセル化により、車両はメーカーが意図したとおりに動作します。

一部の車は、高級、スポーツ、エコノミーなどの少数の運転モードを提供しており、ドライバーはこれらの属性のいくつかを同時に変更できます。運転モードを提供することにより、製造業者は、運転手が体験をある程度制御できるようにし、車両をより楽しくまたは安全でないものにする属性の組み合わせを選択できないようにします。このようにして、メーカーは安全でない操作を防ぐために詳細を隠しています。これはカプセル化です。

2
aridlehoover

カプセル化は、データとすべての種類の外部の汚れからデータを保護する単一のユニットとして機能するために使用される包装紙と考えることができます(外部機能を意味します)。

抽象化には、詳細の欠如と、複雑なシステムを制御するためのシンプルなインターフェースの使用が含まれます。

たとえば、基になる電気工学(抽象化)を心配することなく、ボタンを押すだけで電球を点灯できます。

ただし、他の方法で電球を点灯することはできません。 (カプセル化)

データ抽象化:任意のクラスのデータメンバーおよびメンバー関数にアクセスすることを、単にデータ抽象化と呼びます。

カプセル化:変数と関数のバインド、または1は、データメンバまたはメンバー関数を1つのユニットにまとめてデータカプセル化と呼びます。..

1
anuja dhakite

抽象化は、カプセル化がユーザー(ユーザーからの製品)からの不要なデータを隠すため、ユーザーに必要な情報を表示しています。

カプセル化は抽象化を実装します。

抽象化は、カプセル化が実際に実装するプロセスです。 例:ユーザーロジックの追加->ユーザーを検証し、DB接続を作成し、ユーザーを挿入する必要があります。そのため、ユーザーは最初にvalidate関数を呼び出してDB接続を作成し、DBに値を挿入する必要があることを知りません。彼は、Inで内部的にすべてのロジックを呼び出すAddUser関数のみを呼び出します。これは、カプセル化(機能のグループ化とメソッドの非表示)のみです。

0
Vijay

データ抽象化:DAは単純に具体的な項目をフィルタリングしています。クラスを作成する前に、クラスに関する懸念情報のみを考えることができるため、クラスによって純粋な抽象化を実現できます。

カプセル化:これは、外部からデータを保護するメカニズムです。

0
Rajesh Maurya
public abstract class Draw {
    public abstract void drawShape(); // this is abstraction.  Implementation detail need not to be known.
    // so we are providing only necessary detail by giving drawShape(); No implementation. Subclass will give detail.


    private int type;    // this variable cannot be set outside of the class. Because it is private.
    // Binding private instance variable with public setter/getter method is encapsulation 

    public int getType() { 
        return type;
    }

    public void setType(int type) {  // this is encapsulation. Protecting any value to be set.
        if (type >= 0 && type <= 3) {
            this.type = type;
        } else {
            System.out.println("We have four types only. Enter value between 0 to 4");
            try {
                throw new MyInvalidValueSetException();
            } catch (MyInvalidValueSetException e) {
                e.printStackTrace();
            }

        }
    }
}

Abstractionは、実装の隠蔽の一種である実装の詳細が不明なメソッドに関連しています。
Encapsulationは、データ隠蔽の一種であるメソッドによるインスタンス変数バインディングに関連しています。

0
AmitG