たとえば、2つのクラスが互いに依存している場合、それは一種の循環依存であり、回避する必要があります。メソッドはどうですか?たとえば、お互いを呼び出す2つのメソッドがある場合:
public void methodA(){
//some other code
if(something){
methodB();
}
.
.
.
//some other code
}
public void methodB(){
//some other code
methodA();
//some other code
}
コードのにおい?
注: プレーンな英語で、再帰とは何ですか? 質問に答えないでください。その質問は再帰とは何かに関するものです。私のケースが実際に再帰と呼ばれるかどうかを知っています)、すなわち:再帰コードを圧縮して単一の関数に実行する必要がありますか?
再帰の観点から見ると、その再帰的な動作に複数の関数が含まれていることに問題はありません。
ただし、これは実際には再帰の問題ではありません。カップリングの問題です。 methodA
とmethodB
は相互に呼び出すため、相互に密結合されています。それらが同じクラス内に存在する場合、それは問題ではありません。クラスは、適切と思われるように、メンバーを互いに自由に結合できます。しかし、それらが異なるクラスに存在する場合、これは潜在的に問題です。
後者の場合、これを回避する標準的な方法は、1つを「マスター」として選択し、もう1つをパラメーターまたはクラスのコンストラクターを介してそれに注入することです。
通常、このタイプの循環依存関係は表示されません。これは、必ずしも「不良コード」であるからではなく、通常、2つのクラス間の関係を理解できないことを示しているためです。 「クラスAが機能するためには、クラスBが存在する必要がある」というコンテキストからそれを見ると、反対の「クラスBが機能するためには、クラスAが存在している必要がある」ことがわかります。 「意味がありません。
クラスはタスクを他のクラスに委任できますが、反対方向の通信は通常、イベントや単純なメソッドリターンなどの他の方法で行われます。
繰り返しますが、これはそのようなことを行うことができないと言うことではありません。ビジターパターンはこれを利用して、リクエストの呼び出し元に制御を与えます。しかし、プログラマーとしての私のすべての年では、そのような状況は頻繁には起こりません。そのような関係を確立する前に、両方のクラスから必要なタスクのタイプを再評価し、親子関係を確立できないようにする正確なロジックを特定します。おそらく、親にあるはずのロジックを子クラスに入れるだけです。
他の回答ではクラス結合の問題に対処しているので、ここでは触れませんが、例の2つのメソッドが同じクラスにあると想定した場合でも、これは(おそらく)悪いコードだと私は言います-私はより多くの文脈なしで確かに言うことはできません。
それが悪い主な理由は、コードを見ただけでは実行の流れがどうなるかを追跡するのが非常に難しく、これによりコードの保守が困難になるためです。
2つのメソッドがお互いを呼び出すと考えることができる唯一の理由は、再帰のためです。次に、それを単純かつ簡単に理解できるようにすることが重要です。通常、他のメソッドの呼び出しは、メソッドが行う最後の処理です。
私は 例 を作成しましたRubyは、2つのメソッドが相互に呼び出される正当な理由です。これは、並べ替えの方法がわずかに異なるクイックソートの実装ですツリーのレベルを下げます。