gpt4 book ai didi

java - 如何避免将上下文传递给一堆方法调用?

转载 作者:太空宇宙 更新时间:2023-11-04 11:55:54 25 4
gpt4 key购买 nike

假设我有一个问题,直觉上最好使用递归来解决。

我还尝试使用依赖注入(inject)来使代码可测试:

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,你可以这样做:

Foo foo = new Foo(new Bar(new Baz()));

Baz 可以取任何 Foo,所以只要取最上面的那个 Foo 就没有问题,从而形成一个循环。

(JVM 可以处理循环 IIRC)。只有 Baz 可以确定是否需要 Foo。

以可测试的方式将 Foo 引入 Baz 的最简洁方法是什么?

doBaz() 添加 Foo 参数是我唯一的选择吗? (这意味着 Foo 需要将“this”传递给 doBar,然后 doBar 将其传递给 doBaz 等......或者有更好的方法吗?)

编辑:

也许问题描述确实有用。

该算法基本上是一个编译器,它以代码作为输入并输出代表代码含义的数据结构。这种数据结构本质上是高度递归的。

但是,代码中可能存在不清楚的地方(想想未声明的方法)。引发这个问题的原因是,与大多数编译器不同,这个编译器不应该简单地向用户抛出一堆错误,而应该为用户提供输入更多代码的选项。

基本上,编译器会暂时停止编译“主”代码,并开始编译用户提供的新代码。之后,它将把生成的数据结构附加到“主”数据结构。

如果在用户提供的代码中存在更多不清楚之处,它将再次允许用户进行澄清。

基本上,意识到代码不完整的组件(由 Baz 代表)必须调用“主”组件(Foo)来开始编译用户提供的代码。

最佳答案

其他一些选项:

  1. 如果 Foo 是单例(即程序中只有一个实例),那么您可以在 Foo 中使用一个静态方法返回此类实例

  2. 您可以维护对“前一个”对象的引用,并从 Baz 使用它来遍历回:

    Foo 类{

    Bar bar;

    Foo(Bar bar) {
    this.bar = bar;
    bar.setFoo(this);
    }

    ResultType doFoo() {
    ...stuff...
    bar.doBar();
    }

    }

    类栏{ 福福; 巴兹巴兹;

    Bar(Baz baz) {
    this.baz = baz;
    baz.setBar(this);
    }

    void setFoo(Foo foo) {
    this.foo = foo;
    }

    Foo getFoo() {
    return foo;
    }

    ResultType doBar() {
    ...stuff...
    baz.doBaz();
    }

    }

    巴兹类{ 酒吧酒吧; 福福;

    Baz(Foo foo) {
    this.foo;
    }

    void setBar(Bar bar) {
    this.bar = bar;
    }

    ResultType doBaz() {
    if (foo is needed) {
    bar.getFoo().doFoo(smaller problem)
    } else {
    ...stuf...
    }
    }

    }

关于java - 如何避免将上下文传递给一堆方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41400764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com