2016-08-03 36 views
2

给出下一个代码示例,您认为哪种方法更好,或者您能否想出另一种方式以更优雅的方式对其进行编码?如果使用重复代码或者使用重复条件

中如果

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

重复的代码(两次doAB())(两次为 'B' 检查)重复的条件:

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(); 
} 
+0

你想做什么? –

+2

第二个片段可能在功能上是错误的,因为如果'a'和'b'都为真,它会调用'doAB()'两次。 – Eran

+0

我想避免重复的代码 –

回答

2

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

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

换句话说:在某个时刻,您决定要实例化哪个具体类;之后,你不再担心了。

你知道,小动作语言甚至没有如果(作为关键字/语言生成int)。

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

你可以在这里找到一个相当不错的video如何看待现实。

+0

但是在这个例子中,他有一个布尔类型的基元...你能解释你打算如何用它重载?你的意思是创建一个采用布尔值的工厂,并根据它的值实例化两个不同的类?如果是这样,这似乎极端措施只是为了避免如果/其他。你能否详细说明一下? – Palcente

+0

@Palcente问题是:“a”从哪里来?是的,这正是面向对象设计的精妙之处:您的业务逻辑,那些真正做到“真正的工作”的对象,他们很少使用“新”。相反,一些* framework *创建对象;基于配置信息或其他元信息。然后,在创建完所有对象之后,您只需进行方法调用。如果您好奇,我建议您转到视频(链接添加到我的答案),花了30分钟。每秒值得! – GhostCat

+0

会做,谢谢 – Palcente

4

我猜第一个是最好给出的第二个最有可能不正确。我会使用你认为简单且不易出错的表格。

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

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

如果是,它不可能是B和反之亦然

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

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

它可以是其中A和B都是假 –

+0

@danielsp在这种情况下的话,我会第一个选择坚持,因为它似乎不容易出错。 –