6

ただ...カプセル化を理解しているかどうか完全にはわかりません。たぶん、私はまだクラスでプログラミングを学んでいて、他の人が使用するような実世界のプログラムを作成していないという事実に関係しているのかもしれませんが、それが何を達成しようとしているのか理解できません. クラスのメンバーと関数の一部へのアクセスを制限していることを理解しています。しかし、誰からそれを制限するような..?プライベート データ メンバーを持っている例をいくつか見てきましたが、いずれにしてもデータ メンバーを操作できるようにするパブリックの get メソッドまたは set メソッドを持っています。では、何かがどのように制限されたり隠されたりしたのでしょうか?

私の本には次のように書かれています。

カプセル化には、次の 2 つの重要な利点があります。

  1. ユーザー コードは、カプセル化されたオブジェクトの状態を誤って破損することはありません。
  2. カプセル化されたクラスの実装は、ユーザー レベルのコードを変更しなくても、時間の経過とともに変更できます。"

私は彼らが使っている言葉について混乱していると思います。ユーザーコードがオブジェクトの状態をどのように破壊する可能性があるかについて、どのように、または誰かが私に例を与えることができますか?

私の質問はいたるところにあることは知っていますが、カプセル化について考えるときは私の心もそうなので、それについての私の考えをすべてカプセル化するのに苦労しています(..笑)

4

5 に答える 5

14

カプセル化の私のお気に入りの例は、車の運転です。

典型的なドライバーは、イグニッションをオンにしてアクセルペダルを踏むことで車を前進させる方法を知っています。毎朝仕事に行くために、エンジンの内燃機関について何も知る必要はありません。

アクセル ペダルは、非常に複雑なマシンを操作するための非常にシンプルなインターフェイスを公開します。つまり、非常に複雑な内部の詳細がドライバーからカプセル化されています。

さて、コードに関して言えばMap、何らかの種類の を使用したいが、キーの一般的なハッシュ関数を記述する方法や、その他の基礎となる詳細を実装する方法がわからないとします。

Java ではHashMap、標準ライブラリがその下で何をしているのかを気にすることなく、単純に を使用できます。これらの詳細は、ユーザーからカプセル化されています。

于 2013-10-23T06:32:07.477 に答える
2

@Kepaniによる優れた説明。http://www.tutorialspoint.com/cplusplus/cpp_data_encapsulation.htmからの新しい声明について説明したいと思います。

カプセル化はオブジェクト指向プログラミングの概念であり、データとデータを操作する関数を結合し、外部の干渉や誤用から両方を保護します。

そのため、外部エンティティがクラス変数にアクセスしたり変更したりしようとすると、無意識のうちにそこに含まれるデータに損害を与える可能性があります。簡単に言えば、基本的にグループを作成し、その使用とアクセスを制限します。

車の内部が車を動かすことしかできないのと同じように、あなたは車を運転することだけを求められ、車の中に入って車輪を動かしたり、外部の要素を使って車輪を動かしたりしないでください。

于 2013-10-23T06:41:54.333 に答える
0

例として、非常に単純な文字列クラスがあるとします。

struct String
{
    char * data = nullptr;
    size_t size = 0;

    void resize(size_t new_size) {
        data = realloc(data, new_size);
        size = new_size;
    }
    char & at(size_t i) {
        if (i >= size) throw std::range_error();
        return data[i];
    }
};

このクラスにはいくつかの不変条件があることがわかります。

  • datamallocおよび友人によって割り当てられたメモリを指す必要があります。
  • sizeメンバーは割り当てられたサイズと一致する必要があります。

カプセル化しないと、不変条件を簡単に破ることができます。

String s;
s.size = 42;
s[10] = 'X';        // BOOM! out-of-range access

s.data = "Hello!";
s.resize(3);        // BOOM! tries to reallocate static memory

データ メンバーを非公開にすることで、人々がデータ メンバーを勝手に変更するのを防ぐことができます。それらは、不変条件を維持するために慎重に実装するパブリック インターフェイスを介してのみ変更できます。

おまけとして、私の例でメモリ リークを正しく修正する方法を検討してください。しかし、それはこの質問の範囲を超えています。

于 2013-10-23T06:57:50.187 に答える
0

カプセル化のポイントは、「個人データを変更できない」ということではなく、個人データのストレージ自体が隠されていることです。例えば:

class Employee
{
  ... 
};

class Company
{
  public:
   std::vector<Employee> employees;
   ... 
};

さて、Employees のベクトルは、従業員数の少ない会社ではうまく機能するかもしれませんが、会社が成長し続けると、検索が遅くなるため問題が発生する可能性があります [現実には、おそらくそうではありません!]。ただし、 を公開したためstd::vector<Employee>、Company 内にあるストレージのタイプを変更することはできません (残りのコードで何かが壊れるリスクはありません)。がプライベートの場合はemployees、アプリケーションにとって意味のある他のタイプに変更できます。

代わりに次の場合:

class Company
{
   private:
     std::vector<Employee> employees;
     ...
};

次のように簡単に変更できます。

class Company
{
    private:
      std::map<std::string, Employee> employees;
};

これstd::mapは「ツリー」であり、n 要素に対して log2(n) ステップで検索できます。ここで、ベクトルは平均で (n/2) 検索を行います。従業員が 10000 人いる場合、約 16 ステップと 5000 の間の違いです。正しいものを見つけるための手順。会社が 100,000 人の従業員に成長した場合、ベクトルは平均でさらに 45,000 ステップかかりますが、マップ内で適切なステップを見つけるのにさらに 3 ステップしかかかりません。

要点は、「データの保存方法を変更し、データへのアクセス方法を制御できる」ということです。

于 2013-10-23T06:49:09.037 に答える