清晰,专注,自我记录的方法,无需重复
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了清晰,专注,自我记录的方法,无需重复相关的知识,希望对你有一定的参考价值。
这种情况经常发生,对我来说永远不会太容易。我以为我会问别人怎么处理它。
想象一下,如果处理demo = 60命令行参数是这样做的:
if DemoOptionSpecified() {
timeout = ReadInDemoTimeout();
DoDemoVersion(timeout);
} else
DoRealVersion();
DemoOptionSpecified()对参数字符串执行某种grep并返回true或false。
ReadInDemoTimeout()也会执行某种grep,相同的字符串,并返回一个整数。
两个greps做了两件不同的事情,但当然只需要一个grep来做两件事。两个greps而不是一个可能无关紧要,但在其他情况下,可能会有两个数据库或Ajax调用。
我特别喜欢让DemoOptionSpecified()做更多的事情而不是查看是否提供了该选项。方法名称不会建议额外捕获值。
我不特别喜欢让一个名为ReadInDemoTimeout()的方法的选择,如果demo选项不存在则返回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();
}
我不认为这是一种做两件事的方法。它做的一件事是“如果有一个选项,就获得选项的价值”。然后你可以问两个关于结果的问题 - 有一个问题,它有什么价值? - 但这是在调用代码中发生的。
如果你坚持不提取价值,除非需要,注入它怎么样?
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中);没有任何有用的目的是通过避免它来追求一些名义上的纯洁。
也许是这样的,例如使用C ++:
bool GetDemoOption(int &timeout);
int timeout;
if (GetDemoOption(timeout)) {
DoDemoVersion(timeout);
} else {
DoRealVersion();
}
这依赖于C ++能够通过引用轻松传回选项值。在具有严格的值传递语义(如Java或Python)的语言中,这有点尴尬。但是,在Python中,可以从函数返回多个值:
exist, timeout = GetDemoOption()
if exist:
DoDemoVersion(timeout)
else:
DoRealVersion()
以上是关于清晰,专注,自我记录的方法,无需重复的主要内容,如果未能解决你的问题,请参考以下文章