【发布时间】:2016-02-11 00:41:51
【问题描述】:
假设我的比较器函数foo以时间序列为输入,可以是从小到大,或从大到小的一系列时间。
Foo 可能如下所示:
Foo(List<double> timestampList) {
if (currentTime > previousMaxValueTimestamp) {
...
} else if (curremtTime > previousMinValueTimestamp) {
...
}
}
以上适用于正向序列,但不适用于反向序列。如何优雅地编写适用于这两种序列的逻辑? 下面是我想要做的,但它重复了大部分代码,这是不需要的。
Foo(List<double> timestampList, boolean isForward) {
if (isForward) {
if (currentTime > previousMaxValueTimestamp) {
...
} else if (curremtTime > previousMinValueTimestamp) {
...
}
} else {
if (currentTime < previousMaxValueTimestamp) {
...
} else if (curremtTime < previousMinValueTimestamp) {
...
}
}
}
我目前的解决方案如下。编码风格好吗?
Foo(List<double> timestampList, boolean isForward) {
if ((isForward && currentTime > previousMaxValueTimestamp) || (!isForward && currentTime < previousMaxValueTimestamp)) {
...
} else if ((isForward && curremtTime < previousMinValueTimestamp) || (!isForward && currentTime > previousMaxValueTimestamp)) {
...
}
}
【问题讨论】:
-
这里的变量都是 Timestamps 吗?当前时间等?因为那样你就可以简单地使用来自 Timestamp 的方法,例如 after 或 before(参见 docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html)
-
这是我们自定义的时间戳,“double”类型。不是一般的时间戳。
-
排序列表有用吗?
-
这是关键部分,我们不希望额外的开销来排序或处理时间戳列表。
-
根据您当前的解决方案,我建议提取方法中的条件以提供有意义的名称。这将使阅读和理解解决方案变得更加容易
标签: java