清晰,专注,自我记录的方法,无需重复

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()

以上是关于清晰,专注,自我记录的方法,无需重复的主要内容,如果未能解决你的问题,请参考以下文章

需要一种有效的方法来避免使用 Laravel 5 重复代码片段

在tablayout片段之间进行通信[重复]

Android非UI片段使用[重复]

Django总结

jdbc-db2 - 提取完整记录[重复]

如何使用Android片段管理器传递变量[重复]