3

c++ などのオブジェクト指向言語を使用してクラスを設計する方法について質問があります。多くの場合、変数はクラス メンバーまたは関数の引数に割り当てることができます。私の主張を明確にするために、次の例を挙げます。

class MyClass
{
public:
  int variable1;
  int variable2:
  MyClass (int vr1, int vr2)
  {
     variable1 = vr1;
     variable2 = vr2;
   }
  bool perform_one_task()
  {
    // do something
    return true;
  }
}

このクラスを使用する場合は、次のコードを使用できます。

  int a,b;
  MyClass mine(a,b);
  mine.perform_one_task();

variable1とのないクラスを設計することも可能variable2です。

    class MyClass
    {
    public:

      bool perform_one_task(int variabl1, int variable2)
      {
        // do something
        return true;
      }
    }

このクラスではvariable1andはクラスvariable2のメンバーではありませんが、関数の引数になります。私の質問は、どの条件で最初の設計戦略が好ましく、どの条件で 2 番目の設計パターンが優れているかです。variable1与えられた例はとの構造のみを想定してvariable2いますが、それらが大きい場合、たとえばvariable1データの大きな配列になる可能性があります。

4

5 に答える 5

0

実際にモデリングしているクラスは何ですか? 何をカプセル化する必要がありますか? そして、実際にそのデータを所有しているのは誰ですか?

最初の例では、メンバーは実装の詳細です。それらはクラスのユーザー/クライアントから隠されているため、それらを置き換えて実装を完全に変更できます。メソッドのクライアントは、perform_one_task()それらのフィールドが存在することを知りません。

たとえば、クラスは 2 次元座標を表し、メンバーは X/Y 属性を表すことができます。ある段階で、そのクラスを変更して極座標 (角度 + 半径) で座標を表すことができます。座標クラスへの API は同じままですが、実装は根本的に異なります。

2 番目の値は、機能を純粋にカプセル化することです。クラスは、それ自体が所有するデータなしで表すことができます。これは不合理ではありません。Calculator単純に計算を実行し、その機能をカプセル化するクラスを(たとえば) 合法的に実装できます。それをクラスに入れる利点は、ある程度の再利用性を実現し、元のソース コードに結び付けられないことです。

要するに、データを取得/保持/所有するクラスと、状態を保持しないクラスを作成できるということです。どちらのアプローチも、異なるシナリオでは正当です。誰がそのデータを所有/管理しているかという基本的な問題が残っています。

于 2013-06-20T10:28:39.617 に答える
0

クラスインスタンスのライフサイクルのどこかで値を使用する必要がある場合は、最初のパターン (メンバー) を使用する必要があります。それ以外の場合、メソッドでのみ値を使用する必要がある場合は、2 番目のパターンを使用する必要があります

于 2013-06-20T10:29:04.187 に答える
0

最初の例はオブジェクト指向です (perform_one_task()変数を使用すると仮定します!)。2 番目の例はそうではありません。空のクラス ラッパーにラップされた単なる関数です。

一般的に言えば、オブジェクト指向クラスは、一部のデータと関連するすべての操作 (メソッド) をパッケージ化する方法です。クラスは、実世界のオブジェクトまたは概念をモデル化するときに最適に機能します。クラス内にカプセル化されたデータは保護され、クラスによって提供される操作によってのみアクセスまたは操作できます。通常、クラスには同じデータに対して異なる方法で動作するいくつかのメソッドがあると予想されるため、例は少し単純すぎます。

例に別のタスクを追加しようとすると、2 番目の例では 2 つの無関係な関数が作成されるだけであることがわかります。一方、最初の例では、各タスクは同じデータを操作できます。

于 2013-06-20T11:10:05.740 に答える