假設我有一個直觀的問題,使用遞歸最好解決。如何避免將一個上下文傳遞給一堆方法調用?
我也想使用依賴注入使代碼testeable:現在
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...
}
}
}
,如果巴茲wan't依賴於富,你可能只是這樣做:
Foo foo = new Foo(new Bar(new Baz()));
Baz可以帶任何Foo,所以如果它只是得到頂端的那個就沒有問題,從而形成一個循環。
(JVM可以負責循環IIRC)。只有Baz可以確定它是否需要Foo。
以可測試的方式讓Foo進入Baz的最簡潔方法是什麼?
是否將Foo
參數添加到我的唯一選項doBaz()
? (言下之意是美孚需要通過「本」,以doBar,然後把它傳遞給doBaz,等...或者是有更好的辦法?)
編輯:
也許問題的描述的確會有用。
該算法基本上是一個編譯器,它將代碼作爲輸入並輸出代表代碼含義的數據結構。這種數據結構本質上是高度遞歸的。
但是,代碼中可能存在不清晰(認爲未聲明的方法)。造成這個問題的原因是,與大多數編譯器不同,這不應該簡單地在用戶身上嘔吐一堆錯誤,而是向用戶提供一個選項來輸入更多的代碼。
基本上,編譯器會暫時停止編譯「主」代碼,並開始編譯這個由用戶提供的新代碼。在此之後,它會將產生的數據結構附加到「主」數據結構。
如果在用戶提供的這個代碼中有更多的非文字,它將再次允許用戶澄清。
基本上,實現代碼不完整的組件(由Baz代表)必須調用「main」組件(Foo)來開始編譯用戶提供的代碼。
如果您更詳細地描述實際問題,這可能會有幫助。很可能有一種不同的分解方式會減少週期性。 – chrylis
好的,完成了。只是這個過程本身是以用戶可見的方式遞歸的,所以也許很難擺脫遞歸算法本身。 – user1582024
我有一種模糊的觀點,認爲訪客可能是更好的方法。 – chrylis