直感的には、再帰を使用して最良に解決されるという問題があるとします。私はまた、コードのテスト可能にするために、依存関係の注入を使用しようとしているどのようにしてコンテキストコールを複数のメソッド呼び出しに渡すのを避けるには?
:
Foo foo = new Foo(new Bar(new Baz()));
:バズがfooに依存してwan't場合、
class Foo {
Bar bar;
Foo(Bar bar) {
this.bar = bar;
}
ResultType doFoo() {
...stuff...
bar.doBar();
}
}
class Bar {
Baz baz;
Bar(Baz baz) {
this.baz = baz;
}
ResultType doBar() {
...stuff...
baz.doBaz();
}
}
class Baz {
Foo foo;
Baz(Foo foo) {
this.foo;
}
ResultType doBaz() {
if (foo is needed) {
foo.doFoo(smaller problem)
} else {
...stuf...
}
}
}
さて、あなただけの何かのように行うことができますBazは任意のFooを取ることができるので、一番上のものを取得してループを形成すれば問題ありません。
(JVMはループIIRCを処理できます)。 BazだけがFooが必要かどうか判断できます。
Fooをテストする方法でFooをBazに導入する最もクリーンな方法は何ですか?
Foo
パラメータをdoBaz()
に追加していますか? (?fooが続いなどdoBaz、に渡しdoBarに「これを」渡す必要があります...またはより良い方法があることを示唆している)
EDIT:
おそらく、問題の説明は確かだろう便利である。
アルゴリズムは基本的にコンパイラであり、コードを入力として受け取り、コードの意味を表すデータ構造を出力します。このデータ構造は性質上非常に再帰的です。
しかし、コードに不明瞭さがある可能性があります(宣言されていないメソッドを考えてください)。この問題を引き起こしたのは、ほとんどのコンパイラとは異なり、このコードは単にユーザーに一連のエラーを吐いてはならず、代わりにコードを入力するオプションを提供するということです。
基本的に、コンパイラは「メイン」コードのコンパイルを一時的に停止し、ユーザーが提供するこの新しいコードのコンパイルを開始します。その後、結果のデータ構造を「メイン」データ構造に添付します。
ユーザーが提供するこのコードの中に、より多くの不明瞭性がある場合、これによりユーザーは明確にすることができます。
基本的に、コードが不完全であることを認識するコンポーネント(Bazによってreprezented)は、ユーザーが提供するコードのコンパイルを開始するために「メイン」コンポーネント(Foo)を呼び出す必要があります。
あなたが実際の問題をより詳細に記述した場合はおそらく役に立ちます。周期的ではない分解がある可能性があります。 – chrylis
さて、完了です。プロセス自体がユーザに見えるような方法で再帰的なので、おそらく再帰アルゴリズム自体を取り除くのは難しいです。 – user1582024
私は訪問者がここでより良いアプローチかもしれないという曖昧な感覚を持っています。 – chrylis