1

親愛なる StackOverflow :)

特定の方法でツリー構造を他のツリー構造にマップする、一種のパ​​ターン マッチング ルーチンを実装しようとしています。残念ながら、ルーチンは非常に柔軟でなければならないため、この操作は非常に簡単ではありません。
この大量の作業を順次処理できる小さな部分に直感的に分割することはできますが、記述したコードに構造を組み込むのに苦労しています。これらのサブタスクには非常に強い相互依存性があるため、大きな関数を小さな関数に分割すると、物事を正しく行うために非常に多くの状態情報が必要になります。これにより、多くの余分なコードが追加され、監視が難しくなります。また、残念ながら、コンパイラの最適化が低下する可能性があります。
ただし、すべてを単一の大きな関数に実装することを選択した場合、「プログラムフロー」に問題があります-多くのgotoステートメントを使用する必要があります(よりきれいなものにマスクできますが、問題はまだ残っています) .

一般的に、このような「大きな」問題にどのように対処しますか? 何を調べることができるかについてのヒントを教えてもらえますか?

4

1 に答える 1

2

C++ について回答しますが、原則は譲渡可能である必要があります。

ここでの解決策は、C++ オブジェクトが「具体的な」ものに対応する必要がないことを理解することだと思います。一致するタスクを関数ではなくクラスとして表現してみませんか?

基本的に、パブリックな「ドライバー」関数を使用して、コピー不可のクラスを作成します。サブタスク (より小さな部分) は、そのクラスの非パブリック メンバー関数として表すことができ、クラスのデータ メンバーを介してデータを共有できます。

このようなもの:

bool patternsMatch(Pattern a, Pattern b) {
  return PatternMatcher(a, b).match();
}


class PatternMatcher
{
public:
  PatternMatcher(Pattern a, Pattern b);
  bool match() {
    subtask1();
    subtask2();
    return res;
  }
private:
  bool res;
  Pattern a, b;
  int something_subtasks_share;
  float more_shared_data;
  void subtask1();
  void subtask2();
};
于 2013-09-16T11:55:06.900 に答える