【问题标题】:if with duplicated code or if with duplicated conditions如果有重复的代码或有重复的条件
【发布时间】:2016-08-03 19:48:31
【问题描述】:

鉴于接下来的代码示例,您认为哪个更好,或者您能想出另一种更优雅的编码方式吗?

if 中的重复条件(两次检查 'b')

if(a || b) {
  doAB();
}
if(b) {
  doB();
}

重复代码(两次doAB()):

if(a) {
  doAB();
}
if(b) {
  doAB();
  doB();
}

或混合...

if(a || b) {
  doAB();
  if(b) {
    doB();
  }
}

编辑:

一位同事提出了这个建议:

int mask = a?1:b?2:0;
switch(mask) {
  case 2:
    doB();
  case 1:
    doAB();
}

【问题讨论】:

  • 你想做什么?
  • 第二个 sn-p 可能在功能上是错误的,因为如果 ab 都为真,它会调用 doAB() 两次。
  • 我想避免重复代码
  • 如果 b 为真,在第一个和最后一个,你会运行 doAB 两次。
  • @danielsp 这取决于您的要求,我们不知道

标签: java performance optimization


【解决方案1】:

我猜第一个最好,因为第二个很可能不正确。我会使用您认为简单且不易出错的表格。

第二个最喜欢的例子应该是

if (a) {
  doAB();
} else if (b) {
  doAB();
  doB();
}

如果是a,就不能是b,反之亦然

在这种情况下,您不需要两个条件。应该是 a == !b

// a || b is always true
doAB();
if(b) {
  doB();
}

【讨论】:

  • 可能a和b都为假
  • @danielsp 在这种情况下,我会坚持使用第一个选项,因为它似乎不太容易出错。
【解决方案2】:

完全不同的观点:避免使用 if/else 的东西。

在 OO 语言中,您可以使用多态性来代替 if/else。而不是要求某种状态;然后调用特定方法;您只需在某个对象上调用一个方法;并且对象的类型将确保该方法执行正确的操作。

换句话说:在某些时候,您决定必须实例化哪个具体类;以后就不用担心了。

您知道,smalltalk 语言甚至没有 if(作为关键字/语言构建 int)。

当然,你不应该进去,如果用另一个替换你的。相反,您可以退后一步,想一想是否以及如何重新构建您的问题;利用多态性。

你可以在这里找到一个相当不错的video,它在现实中的样子。

【讨论】:

  • 但是在这个例子中他有一个布尔类型原语......你能解释一下你打算如何重载它吗?你的意思是创建一个工厂,它接受一个布尔值并根据它的值实例化 2 个不同的类?如果是这样,那似乎是为了避免 if/else 而采取的极端措施。能详细点吗?
  • @Palcente 问题是:那个“a”是从哪里来的?是的,这正是好的 OO 设计的工作原理:您的业务逻辑,那些真正做“真正工作”的对象,他们很少使用“新”。相反,一些框架会创建对象;基于配置信息或其他元信息。然后,在创建了所有对象之后,您只需进行方法调用。如果您好奇,我建议您转到视频(链接添加到我的答案中)并花 30 分钟观看。值得每一秒!
猜你喜欢
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 2015-03-27
相关资源
最近更新 更多