gpt4 book ai didi

Java方法构造重复结构且变化较小

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

我不确定是否有一个模式可以涵盖这个问题,但这里是。在编写调用分析算法(例如解析器或计算实现)的方法时,需要编写大量代码来读取源、应用算法,然后将结果转换为有用的内容。基本上有 20-30 行代码和一个经常变化的算法/解析器/分词器。

所以......到目前为止我看到的选择是:

  1. 为每个算法创建一个新方法(由于重复而丑陋)
  2. 创建一个方法并将算法作为参数传递,然后使用 case 或 if/then 选择算法(这会变得困惑,因为我必须对我的算法选择进行硬编码。
  3. 创建算法的单独初始化或设置,然后检查其是否在方法中初始化(这仍然很难看,因为在其他地方我的选择方法中有不同算法选择的硬编码列表)。

是否有一个巧妙的技巧或通用方法构造编程模式来解决这个问题?

提前致谢。

--编辑--

为了消除这个问题的一些抽象,这里是我正在谈论的内容的原型(prototype)。所以实际上只有标记器的实现发生了变化。

pubic void tokenizeData(Filename datablob){
// convert filename
// open file
// handle file errors
// other code

// assign desired tokenizer
tokenizer = new TokenizerImplementation (or some other variation);

tokenizedData = tokenizer( cleansedData );

// parsing and collection code
// more error processing code
// cleanup code
}

最佳答案

我还会根据 @Lucas Oliveira 的建议亲自尝试InterfaceAbstract + Template Method 的某种组合。但是对于选择适当的 Tokenizer 实现的问题,您可能还需要一个 Factory(模式)来动态加载另一个 Tokenizer impl。基于工厂上下文或参数,而不更改模板方法 tokenizeData() 的内容。

Example.1 一个经典的参数工厂:

public class TokenizerFactory 
{
private static final Logger logger = LoggerFactory.getLogger(TokenizerFactory.class);

private final int version;

public TokenizerFactory(int version) {
this.version = version;
}

public ITokenizer getInstance() {
switch(version) {
case 1: return new TokenizerV1();
case 2: return new TokenizerV2();
default: return new DefaultTokenizer();
}
}
}

Example.2 动态类加载静态工厂(请原谅我的名字):

public class TokenizerFactory 
{
private static final Logger logger = LoggerFactory.getLogger(TokenizerFactory.class);

private TokenizerFactory() {}

// Here eg. ETokenizerType is a enum storing class associated to the type.
public static ITokenizer getInstance(ETokenizerType dtype) {
try {
return (ITokenizer)dtype.getClassVar().newInstance();
}
catch(Throwable ex) {
logger.error("Factory could not create an adequate instance of Tokenizer for dtype:{} !",dtype.name());
}
return new DefaultTokenizer();
}
}

您可以为您的Tokenizer定义一个接口(interface):

public interface ITokenizer {
public void tokenizeData(Filename datablob);
}

...由您的抽象类 AbstractTokenizer 实现,其所有子类(例如 TokenizerV1TokenizerV2)将仅重新定义自定义抽象方法。就像下面的例子(基于@Lucas Oliveira提案):

public abstract class AbstractTokenizer implements ITokenizer {
@Override
public void tokenizeData(Filename datablob) {
// convert filename
// open file
// handle file errors
// other code

tokenizedData = tokenizer( data );

// parsing and collection code
// more error processing code
// cleanup code
}
abstract TokenizedData tokenizer( Data cleansedData ); // << redef. by subclasses.
}

但它对您的使用来说是透明的。

您最终可以通过提供一个预配置的 TokenizerFactory 作为主要业务方法的参数来使用您的 TokenizerFactory,或者在您拥有参数化所需的参数的情况下即时使用它们。这样 getInstance() 调用将返回您能够“tokenizeData()”所需的准确 Tokenizer

注意:对于高度参数化的工厂,将它们与构建器(模式)结合起来通常是一个救星。

关于Java方法构造重复结构且变化较小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47229254/

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