gpt4 book ai didi

java - 更改和发送全局所需的数据

转载 作者:行者123 更新时间:2023-12-01 14:37:09 25 4
gpt4 key购买 nike

我想询问如何保持和更改应用程序的全局状态的最佳实践。我有一个解析器(现在是一个单例),其中具有诸如

之类的属性
private String mode
private List<String> loadedResources

然后我有大约十个模块,界面非常简单

ModuleOutput parse(String line, Path context) throws ModuleException;

某些模块确实需要(某些模块不需要)获取或设置已处理文件的模式。

if (Parser.getInstance().getMode().equals("something") { ... }

Parser.getInstance().setMode("something");

这会改变应用程序和解析器本身的状态以及与之一起工作的其他模块。

两个模块(共十个)也想添加到loadedResources

if (!Parser.getInstance().getLoadedResources().contains(resource)) {
Parser.getInstance().getLoadedResources().add(resource);
} else {
// resource already loaded ...
}

但其他人则不然。

我不喜欢将全局数据存储在单例中,并且让模块获取它(因为测试等),但我什至不喜欢我需要将所有最终需要的信息发送到可以处理它们的模块。 ..然后创建要返回的大对象,这将告诉解析器如何更改状态(以及“全局需要的”数据可以随着时间的推移而改变),但是它可能会更干净。您有什么建议?提前致谢。

最佳答案

我只会创建一个 ParsingContext 对象,并将模块可以更改/共享的所有内容移到那里。然后我会将这个 ParsingContext 传递到“ModuleOutput parse”的每次调用中。这意味着 ParsingContext 将包含解析和资源的状态。通过这种方式,您可以清楚地定义模块可以共享和更改的内容。请注意,从范围的角度来看,此 ParsingContext 的实例比 Singleton 干净得多。单例的作用域是全局变量。 ParsingContext 的范围仅是“parse”方法和 Parser 本身的调用。

回答更高层次的问题。我认为没有最佳实践来共享应用程序的全局状态。如果可能的话,我们的目标始终是没有国家。

您可能会问如何在插件和框架之间共享状态。我的观点是,您应该使用由尽可能少的对象(插件和框架入口点)共享的对象。没有单例,因为通过创建单例,您也可以将此状态公开给应用程序的其余部分。

另一个想法是我会尽量减少“耦合”和显式状态。例如,您的模块实现包含方法 getPriority()。这样,您就可以订购插件。这迫使开发人员考虑所有可能的模块(甚至是他没有实现的模块)并相应地设置优先级。相反,我会选择某种隐式排序。例如,通过创建解析器的几个明确定义的阶段,并要求开发人员将模块“绑定(bind)”到该阶段。通过这样做,开发人员只考虑少量的预定义解析器阶段,而不是模块的任意顺序。

此外,看看实现,我会考虑为解析器类实现状态设计模式,为模块实现责任链模式。但很难说它是否可以实现,我必须深入研究源代码并编写一些单元测试来测试解析功能。

关于java - 更改和发送全局所需的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16385398/

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