gpt4 book ai didi

design-patterns - 干净、专注、 self 记录的方法,无需重复

转载 作者:行者123 更新时间:2023-12-04 06:28:18 29 4
gpt4 key购买 nike

这是一种经常出现的情况,对我来说永远不会太容易。我想我会问其他人如何处理它。

想象一下,如果 demo=60 命令行参数的处理是这样完成的:

if DemoOptionSpecified() {
timeout = ReadInDemoTimeout();
DoDemoVersion(timeout);
} else
DoRealVersion();

DemoOptionSpecified() 对参数字符串执行某种 grep 并返回 true 或 false。

ReadInDemoTimeout() 也执行某种 grep,相同的字符串,并返回一个整数。

两个 grep 做两件不同的事情,但当然只需要一个 grep 来做这两件事。两个 grep 而不是一个在这里可能无关紧要,但在其他情况下,两个数据库或 Ajax 调用可能。

我不特别喜欢让 DemoOptionSpecified() 做更多的事情,而不是查看是否提供了选项。方法名称不会建议额外捕获该值。

如果演示选项不存在,我并不特别喜欢使用名为 ReadInDemoTimeout() 的方法返回 false 的替代方法,因为如果设置了该选项,我只想了解超时值。 DoRealVersion() 不关心超时值。

我不觉得有一个好的不妥协的干净代码模式。想法?

最佳答案

我认为有一个方法可以做到这两个方面没有任何问题 - 你只需要正确命名它:

DemoOption demoOption = getDemoOption();
if (demoOption.wasSpecified()) {
int timeout = demoOption.getValue();
doDemoVersion(timeout);
}
else {
doRealVersion();
}

您甚至可以使其更简单,并让方法返回值,如果未设置选项,则返回 null:
Integer demoTimeout = getDemoOptionIfSpecified();
if (demoTimeout != null) {
doDemoVersion(demoTimeout);
}
else {
doRealVersion();
}

然后我会使该方法通用:
Integer demoTimeout = getOptionIfSpecified("demo", Integer.class);
if (demoTimeout != null) {
doDemoVersion(demoTimeout);
}
else {
doRealVersion();
}

我不认为这是一种做两件事的方法。它所做的一件事是“如果有选项,则获取选项的值(value)”。然后,您可以就结果提出两个问题 - 有没有,它的值(value)是什么? - 但这发生在调用代码中。

如果你坚持不带回值(value),除非它是需要的,注入(inject)它怎么样?
interface OptionHandler<T> {
public void specified(T optionValue);
public void notSpecified();
}

handleOptionIfSpecified("demo", new OptionHandler<Integer>() {
public void specified(Integer timeout) {
doDemoVersion(timeout);
}
public void notSpecified() {
doRealVersion();
}
});

但说真的,如果我在阅读您的代码并且看到第三个版本以外的任何内容,我会看到过于复杂并开始重构。推测性地获取一个值并以不同的方式处理 null 和非 null 情况的习惯用法非常普遍(至少在 Java 中);为追求某种名义上的纯洁而回避它是没有任何用处的。

关于design-patterns - 干净、专注、 self 记录的方法,无需重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5763648/

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