0

プログラムを構成する最善の方法についてアドバイスを求めています。ここに私が今持っているものと、デザインで見られる問題があります:

作成されたオブジェクトを慎重に制御するために、プライベート コンストラクターと submit() メソッドを含むクラスがあり、作成されたすべてのオブジェクトがグローバル リストに追加されます。このプログラムには、グローバル リストで「大きな」操作を実行する関数がいくつかあります。現在、これらは静的関数としてオブジェクト クラス内にあります。それらはクラスにあるはずであり、明らかにオブジェクトに関連しているため、これは理にかなっているように見えました。しかし、オブジェクトのプロパティにアクセスするたびに、これらの「大きな」関数のリストを Intellisense が迎えてくれるのは奇妙に思えます。これらの関数は関連付けられていますが、実際には個々のオブジェクトによって呼び出されるべきではありません。すべてのオブジェクトのリスト! しかし、私はそれを行う別の方法を思いつきません。Operations というクラスがあり、その中にすべてを配置する必要がありますか? それは分離しすぎているようです。また、

何か案は?ありがとう!

(申し訳ありませんが、これに何をタグ付けすればよいか正確にはわかりませんでした。同様の質問がたくさんあることは知っていますが、しばらく戸惑いました。自由にタグを付け直して編集してください!もう一度ありがとう!)

4

3 に答える 3

2

2つのクラスがあることをお勧めします:

クラスの単一のメンバーに影響を与えるプロパティ、アクセサー、および操作を保持するために使用されるデータ クラス 'Precious'。

  class Treasure; // let's pre-declare this.

  class Precious {
  private:
    BOOL invisible;
    Precious() : invisible(FALSE) {}
    friend class Treasure. // so it can call the private constructor
  public:
    BOOL isMine() { return TRUE; }
    BOOL iWantsIt() { return TRUE; }
    void don() { invisible = TRUE; }
    ~Precious { printf("need to find mnt/doom here"); exit(1); }
  }

新しいメンバーを作成してリストに追加するメソッドと、これらのリスト全体で操作を管理および実行するメソッドを含むコレクションおよび管理クラス「Treasure」。

  class Treasure {
    void forgeOne { rings.add( new Precious ); };
    void findThemAll {
      for (Precious* myPrecious;
      {
        // implement remote ring call
      }
    }
    void inTheDarknessBindThem {
      // need to add check for the one ring
      for (Precious* myPrecious;
      {
        // filter on dark rings
        // add binding code.
      }
    }
    Map<Precious*> rings;
  }

その後、Treasure のインスタンスをグローバルまたはシングルトンとして構築し、必要に応じてアクセスできます。

于 2009-09-27T23:27:20.433 に答える
0

少なくともあなたの説明を理解しているので、これらの関数をクラスの外に移動しますが、クラスと関数の両方を名前空間に配置します。

デザインは少し奇妙に聞こえますが、あなたが持っているものは部分的にオブジェクトであるように聞こえますが、部分的にオブジェクトのコレクションのように機能しているようにも聞こえます。もしそうなら、それはかなり厄介なデザインの匂いのように聞こえます。

于 2009-09-28T02:12:31.600 に答える
0

うーん。(カップリングの観点から)代わりにこのようなことをしてもらえますか?

class Object { };
void ProcessObjects (list<Object *> &objects) { }
list<Object *> &GetGlobalObjects (void);

int main (void)
{
 ProcessObjects(GetGlobalObjects());
 ProcessObjects(somePossibleTemporaryList);
}
于 2009-09-27T23:10:44.463 に答える