Coding style 对于格式化复杂的布尔逻辑,是否有任何样式指南、建议或约定?

Coding style 对于格式化复杂的布尔逻辑,是否有任何样式指南、建议或约定?,coding-style,Coding Style,我参与了一个涉及复杂布尔逻辑的项目。这种复杂性使得代码非常高效,但不幸的是很难阅读 因此,我们将逻辑布局如下,这样可以更容易地看到复合语句中的组,还可以向逻辑的某些部分添加注释 (此代码不是来自项目的真实代码,真实逻辑更复杂) if( //评论在这里! 角度。角度kQuiteHigh ||previousAngle.time==kUnknownTime ) //这里也有评论! &&pairedAngle.anglekQuiteHigh ||previousPairedAngle.time==kU

我参与了一个涉及复杂布尔逻辑的项目。这种复杂性使得代码非常高效,但不幸的是很难阅读

因此,我们将逻辑布局如下,这样可以更容易地看到复合语句中的组,还可以向逻辑的某些部分添加注释

(此代码不是来自项目的真实代码,真实逻辑更复杂)

if(
//评论在这里!
角度。角度kQuiteHigh
||previousAngle.time==kUnknownTime
)
//这里也有评论!
&&pairedAngle.anglekQuiteHigh
||previousPairedAngle.time==kUnknownTime
)
)
你在其他地方见过这样做吗


关于如何布置非常复杂的布尔逻辑,有什么约定或风格指南建议吗?

我将重构代码,使用外部方法使其更易于阅读

if( ValidAngle(angle, previousAngle) && ValidAngle(pairedAngle, previousPairedAngle) )

ValidAngle( angle, prevAngle){
    return angle.angle < kQuiteLow && (previousAngle.angle > kQuiteHigh || previousAngle.time == kUnknownTime)
}
if(有效悬挂(角度,前一角度)和有效悬挂(pairedAngle,前一pairedAngle))
ValidAngle(角度,前角){
返回角度.anglekquitelhigh | | previousAngle.time==kunnowntime)
}

一个建议是将逻辑分解为方法。将注释转换为方法名也更容易,因此您不需要它们。或者,如果它们太复杂,则包含在方法文档中

if (anglesAreOk(...))
{
}

public bool analyseAngles() {
    return angleOk(...) && previousAngleOk(...) && pairedAngleOk(...)
}

我同意samuelcarrijo和pb的观点,将复杂表达式提取到方法或变量中


如果不能将方法提取到有意义的抽象中,可以从Fowler的重构书中考虑./P>< P>,我同意复杂布尔逻辑应该用有意义的名称替换的方法,例如

if(x && y || !b) { }
vs

或者使用有意义的名称进行各种单元测试

e、 g


给你的课程增加限制怎么样

e、 g


如果你能帮我把x代码格式化成像这样的源代码,那就有好处了。OP确实强调了效率,所以如果可能的话,可以添加函数内联的建议。@Duck:让编译器来处理这个问题。如果您有疑问,请使用探查器。@Jason这只是对编译器的一个建议,它可能会拒绝。除非代码膨胀是一个问题,否则我不想给出任何提示。我很欣赏这种观点,通常我会这么做。然而,在某些情况下,我更愿意看到潜在的复杂性。在我提到的项目中,逻辑已经包装在一个过程中(它是sql而不是c++)。我不认为将每个if条件的内容移动到新的过程中会提高可读性。
if(x && y || !b) { }
if(customerIsRepeatCustomerFromIdaho(x,y,b)){ }
[Test]
public void CustomersFromIdahoGetDiscountsOnAlternatingTuesdays()
{
  isRepeat=true;isFromIdaho=false;isTuesday=true;
  Assert.AreEqual(Customer.CalclateDiscount(isRepeat,isFromIdaho,isTuesday),.10)
}
if ( angle.isQuiteLow() && previousAngle.isQuiteHigh() && previousAngle.isUnknownTime() )