2

私はオブジェクト指向設計に慣れていないので、このプロジェクトを設計するためのより良い方法についてアドバイスを得たいと思っていました。

Foo オブジェクトのシーケンスを初期化してベクトルに格納する FooSequence クラスから始めました。このシーケンスから Foo オブジェクトを変更および削除できるようにしたいと考えています。つまり、いくつかのアルゴリズムを適用して Foo のシーケンス全体を処理し、このシーケンスから低品質の Foo を削除します。

Foo オブジェクトを処理するクラスと FooSequence をどのように接続すればよいかわかりません。関連する設計パターンと落とし穴について詳しく説明していただける方がいらっしゃいましたら、よろしくお願いいたします。

私はできると思います:

a) FooSequence のスコープを拡張し、FooProcessor のメンバー関数がメンバー vSequence_ を処理する FooProcessor のような名前に名前を変更します。

b) Foo オブジェクトへの読み書きアクセスを許可するためのアクセサ関数とミューテータ関数を提供します。別のクラス (FooProcessor) を使用して、FooSequence から Foo オブジェクトを変更および削除します。これをどのようにインターフェースする必要があるのか​​ わかりません。

//A simplified header of the FooSequence class
class FooSequence {
public:
  FooSequence(const std::string &sequence_directory);
  ~FooSequence();

  //To process the sequence, another class must know the capacity of the vector
  //I'm not sure if interfacing to std::vector member functions makes much sense
  std::size_t getSize() const { return vSequence_.size(); }

  //Should I use an accessor that returns a non-const reference??
  //In this case, Why not just make the vector public?
  std::vector<std::shared_ptr<Foo>> getFoo;

  //Return a non-const reference to individual Foo in the sequence??
  //This doesn't help iterate over the sequence unless size of vector is known
  std::shared_ptr<Foo>& operator[] (std::size_t index) { 
  return vSequence_[index];
  }

private:
  const std::string directory_;
  std::vector<std::shared_ptr<Foo>> vSequence_;
  FooSequence(const FooSequence &);
  void operator=(const FooSequence &);
};

GoF の Design Patterns を参照してみましたが、まだ高度すぎると思います。どんなアドバイスでも大歓迎です。

編集: この質問にはオブジェクト指向設計に関する一般的な回答が必要だと思いますが、ImageSequence クラスと OpenCV のインターフェイスを探していることを明確にする必要があると思いました。ImageSequence と他のクラスとのインターフェイスを最適化するために、どの戦略または設計を使用できるか疑問に思っています

4

3 に答える 3

2

Foo オブジェクトに対してどのような処理を行う必要があるかにもよりますがstd::vector<std::shared_ptr<Foo>>、STL からの標準アルゴリズム呼び出しと組み合わせて使用​​するだけの単純なアプローチで十分だと思います。

STL でできることはたくさんあります。

  • 選別
  • 変身
  • 探す
  • 並べ替え
  • 等...

std::vector標準のコンテナーとアルゴリズムは連携して動作するように設計されているため、これらすべてのアルゴリズムを使用できます。

cppreference のアルゴリズムのリストを見てください。

STL アルゴリズムのリファレンス

一般的な設計ガイドライン (編集に応じて)

複雑にしないでおく。設計が単純であるほど、プログラムの保守が容易になります。画像のシーケンスを単純なベクトルとして表現できる場合は、それを行います。次に、画像を反復処理して処理することにより、他の関数/クラスをそのベクターで動作させることができます。

ここで動作する単純な範囲:

for (auto& myImage: myImageVector) {
    // Process my image here
}
于 2013-10-11T19:57:44.267 に答える
1

そのクラスがまったく必要だとは思えません。

実生活では、vector<Mat>( vector<shared_ptr<Mat>>Mat は既にスマートポインターとして機能しているため、 ではありません) があり、それを 1 日と呼びます。

于 2013-10-13T08:26:31.213 に答える