gpt4 book ai didi

Java:参数遍历?

转载 作者:行者123 更新时间:2023-12-04 21:59:22 30 4
gpt4 key购买 nike

我有这个代码:

public class Compiler {

public void compile(String template, Object o, Object params) {
//...
context(o, params);
//...
}

private void context(Object o, Object params) {
//...
substitue(o, params);
//...
}

private void substitue(Object o, Object params) {
//...
print(params);
//...
}

private void print(Object params) {//use parameter params here, only here
//...
System.out.println(params);
//...
}
}

可以看到,参数 params仅用于 print方法,不在 compile 中, contextsubstitue .问题是添加 paramsprint的所有方法的签名.

一般来说,当我遇到这个问题时,我会重构我的代码,如下所示:

public class Compiler {


public void compile(String template, Object o, Object params) {
//...
new InnerCompiler(template, o, params).compile();
//...
}

private static class InnerCompiler {
private final String template;
private final Object o;
private final Object params;

InnerCompiler(String template, Object o, Object params) {
this.template = template;
this.o = o;
this.params = params;
}

private void compile() {
//...
context();
//...
}


private void context() {
//...
substitue();
//...
}

private vois substitue() {
//...
print();
//...
}

private void print() {
//...
System.out.println(this.params);
//...
}
}
}

这是一个非常基本的示例,用于说明将参数传递给所有方法的情况,即使它不是由方法本身使用而是由下一个(或更深层次)使用。

我正在寻找这个问题的名称(可能是反模式) .在我放的标题中(参数遍历),但它可能是错误的,或者它意味着另一件事。

最佳答案

您通过调用堆栈反复向下传递参数的代码的第一个版本称为“tramp data”。您可以在 a similar question on the Software Engineering site 中阅读相关内容.我认为你想要做的是使用 Dependency Injection .我说“尝试”是因为您没有将依赖项注入(inject)到 Compiler 中。实例,本身。

相反,我认为您实际使用的是 Bounded Context pattern 的一个非常小的版本。 .我的意思是你的 InnerCompiler class 是域驱动设计中描述的有界上下文,可能更恰本地命名为:CompilerContext .话虽如此,有界上下文通常是您用来封装复杂服务级数据集的域级构造。一组三个参数通常不值得称为“有界上下文”,但该阈值是相当主观的 IMO,为了易于理解的 MCVE,您可能在这里过度简化了代码。

要以更标准的形式使用 DI 模式,我会将您的代码更改为如下所示:

public class Compiler {

private final String template;
private final Object o;
private final Object params;

Compiler(String template, Object o, Object params) {
this.template = template;
this.o = o;
this.params = params;
}

public void compile() {
//...
context();
//...
}

private void context() {
//...
substitute();
//...
}

private void substitute() {
//...
print();
//...
}

private void print() {
//...
System.out.println(this.params);
//...
}
}

这实现了您现在正在做的事情,而无需求助于人为的内部类。

请注意,如果您确实需要像在您的代码版本中那样将编译器之类的东西用作单例,请考虑使用 CompilerFactory。带有 newCompiler() 的类方法将调用构造函数并注入(inject)依赖项。

我希望这回答了你的问题。我知道这个答案不是四人组的设计模式书中的一个模式,但是 IMO 那本书中的任何模式都没有真正反射(reflect)你的代码或你的意图。

关于Java:参数遍历?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59683355/

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