2016-01-14 65 views
2

我有一个值不能低于设定值或高于另一个设定值。我已经写了一个方法来处理这个问题。我向你展示了这个写法略有不同的两个版本。一个具有多个if语句,另一个具有else if树。两者都返回相同的结果。 但是由于某种原因,比其他人更好吗?或者(没有开玩笑)有更好的方法吗?限制数字在下限和上限/限制之间的最佳方法

double Constrain(double low, double value, double high) 
{ 
    if (value < low) 
     return low; 
    else if (value > high) 
     return high; 
    else 
     return value; 
} 

double Constrain(double low, double value, double high) 
{ 
    if (value < low) 
     return low; 
    if (value > high) 
     return high; 
    return value; 
} 
+5

我看不出有任何理由,一个是比其他更好。执行路径将完全相同。我更喜欢第二种方法,因为它更简洁,但这更多的是个人观点 – Kenneth

+0

我知道Resharper会建议将第一个更改为第二个。然后将第二行的最后两行更改为'返回值>高?高:价值;' – juharr

+0

你可以做...返回((价值<低)?低:(价值>高?高:价值)); ...但我是滔滔不绝的。你们两种方法完全相同,都不如其他方法更好。即使可读性也不受影响。 – AgapwIesu

回答

3

更好吗?性能似乎不是问题,所以问题变成这是更具可读性和可维护性?如果您使用ReSharper,它会将第一个标记为不必要的else s。如果你不使用ReSharper,它应该归结为你和你的团队发现哪一个最容易理解。

我原本打算建议使用max(min(input,high),low)。我决定不会因为而更难理解(imo)。

+2

任何原因的downvote? –

+0

我发现这很有关系,有时它会降低到最适合你的团队的水平。 – ImDeveloping

0

这几乎是相同的。如果该值介于低值和高值之间,那么它将不得不在两种方式上执行两次检查和返回语句。如果该值高于高值,则两者都必须进行两次检查(低检查是第一次),然后是返回语句。如果该值低于低值,则两者都必须执行一次检查和一个返回语句。

0

好吧,也许不会有点face。。这里是我会怎么做

function constrain (low, value, high) { 
    return (value<low? low: 
      value>high? high: 
      value); 
} 
+1

@MoH。这取决于你的团队对三元运营商的看法。我觉得这很容易解析,但如果您想强调可能不适合新开发人员的可用性,那么这可能不是一个很好的选择。 –

+0

@KyleW我同意,它是一种非常“适合你的东西”的陈述。我通常更喜欢我的代码尽可能可读。是的,我的团队可能会喜欢它并且能够理解它,但是如果他们转移到不同的团队并被替换,会发生什么。我更喜欢任何人都能够尽可能地理解我的代码,因为阅读其他人的代码往往是单调乏味的,不要让它变得更难。我不是说Agapwlesu的答案无论如何都不好,只是可读性稍差。 –

+1

@MoH。 - 同意KyleW。但是我想补充一点,所有的程序员都应该非常熟悉三元运算符 - 熟悉这个运算符并且无需停顿就可以阅读。给你一个单一的退出点;它很快,很重要。我发现三元运算符在合理范围内非常有用。如果我聘请了一个没有得到这个的新程序员,我希望他/她学会了解它,同时避开20个三元运算符在一个命令中的表达。 – AgapwIesu

-1

我有一个不能低于设定值或高于另一组的值。

所以这意味着,只要他们使用这个值,这就要求程序员调用Constrain - 这听起来像是一个容易做出的简单错误。

如果你有它的范围,你可以通过这个方法来创建一个更加面向对象的方法,并创建一个夹住double值的类。这样,您可以随心所欲地使用它,并且永远不会超出限制。

+0

有趣的是,我很高兴看到你的意思。 –

1

没有真正回答你的问题,但由于我们在这里的答案有一个良好的交谈我想补充一点的版本作为一个更通用的代码片段:

public static T Constrain <T>(this T val, T low, T high) where T : IComparable<T> 
{ 
    if (val.CompareTo(low) < 0) return low; 
    if (val.CompareTo(high) > 0) return high; 
    return val; 
}