Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 最佳实践:验证方法调用的条件?_C#_C++ - Fatal编程技术网

C# 最佳实践:验证方法调用的条件?

C# 最佳实践:验证方法调用的条件?,c#,c++,C#,C++,我猜在几乎每一个程序中,有时方法不需要一直被调用,只需要在特定的条件下。 检查是否必须调用方法非常容易。一个简单的if语句就可以做到这一点 if (value == true) { DoSomething(); } 但是如果你有很多条件,验证就会变得复杂,代码也会越来越长。 所以我用每次调用的方法编写代码 方法本身将检查并验证她的代码是否需要执行 DoSomething(value); 。。。然后 public void DoSomething(bool value) { i

我猜在几乎每一个程序中,有时方法不需要一直被调用,只需要在特定的条件下。 检查是否必须调用方法非常容易。一个简单的if语句就可以做到这一点

if (value == true)
{
    DoSomething();
}
但是如果你有很多条件,验证就会变得复杂,代码也会越来越长。 所以我用每次调用的方法编写代码 方法本身将检查并验证她的代码是否需要执行

DoSomething(value);
。。。然后

public void DoSomething(bool value)
{
    if (value == true)
    {
    // Do Something here ...
    }
}
现在我有两种做事的方法。我不确定哪条路是正确的。
或者可能还有另一个选项?< /P> < P>检查C(不知道为什么需要C++:)/p>< P>如果方法可以抛出一个参数/AgUnTrimeNoUT异常,那么在调用方法之前应该验证它。另外,Microsofts会告诉您,对于任何使用契约的代码(基本上是静态分析的断言),在调用方法之前是否需要验证输入

一般规则是,验证输入的次数不超过必要的次数。如果某个内容无效,则应抛出异常(C#),或返回错误(C++)。由于输入无效而不执行代码,并且不说明原因,使得下一个开发人员几乎不可能找出问题所在

但是如果你有很多条件,验证就会变得复杂,代码也会越来越长

如果验证很复杂,则表示下面的逻辑很复杂。期望你的代码和你的逻辑一样复杂-它必须在某个地方,对吗?想一想如何用干净的方式写清洁的道路并不总是最短的道路。


我推荐这种变体:

if (value == true)
{
    DoSomething();
}
为什么??因为:

  • 调用
    DoSomething
    的代码将更加清晰(*),因为它明确显示了何时应该执行
    DoSomething
    的逻辑,何时不执行
  • DoSomething
    本身所依赖的参数较少(这使得它更通用和可重用)

*)是的,“更清晰”在这里实际上意味着“更长”,但它也意味着“明确”和“自我记录”。较短的变体实际上试图隐藏一些逻辑,这使得代码不那么清晰。

我建议使用第二种方法,但我有一些意见:

  • 您不需要检查
    if(value==true)
    ,只需检查
    if(value)

  • 更早返回,我的意思是
    if(!value){Return;}

  • 升级为不编写接受单个布尔参数的方法,因为每个方法都应该做一件事,而且只能做一件事。如果一个方法使用一个布尔参数来决定做什么,它会自动做两件事:决定做什么和实际做什么。该方法应该被重构为两个独立的方法来做一些事情,一个方法决定调用这两个方法中的哪一个


    此外,使用
    value==true
    计算布尔值是多余和不必要的。该值本身表示布尔状态(
    true
    /
    false
    ),不需要再次与
    true
    进行比较也就是说,最佳实践是使用
    if(value)
    而不是
    if(value==true)
    (或
    if((value==true)==true
    ;这似乎很愚蠢,但与
    if(value==true)
    的方法没有太大区别.

    我发现这个问题的答案相当明显——除非我遗漏了什么。适应每种情况。 被调用的函数应该做它想做的事情。如果它想处理一些参数集,那么一定要在函数内部进行检查。 如果您计划有条件地调用函数,请在外部执行检查。 我认为,将检查移到内部以便保存一些额外的验证不是一个好主意,因为其他人可能想调用您的函数,但不知道它是否在给定参数的情况下实际工作。我说,除非必须进行内部检查,否则将检查留在外部

    编辑: 我只是重读了你的问题。。。 你基本上有:

    void foo(bool actuallyExecuteFoo)
    {
        ////
    }
    

    真的吗?真的吗?

    第二种方法会花费更多的执行时间,尽管代码看起来会更好。为什么不使用宏呢

    #define DOSOMETHING(value)  if (value) {DoSomething();}
    
    全部替换

    if (value == true) {DoSomething(); }  
    
    使用宏
    DOSOMETHING(值)

    你的目的会得到解决,代码看起来会更好

    在第二种情况下,它实际上就像是
    MayDoSomething
    而不是
    DoSomething
    ,你不能一次性验证,然后处理或处理一组项目。第一种情况明确说明何时执行请扩展你的答案,包括原因。为什么我第二种方法是正确的吗?另外-第1点。只是一种无害的语法冗余,第2点。imho可以被认为是一种偏好。有一些老派程序员建议,为了清晰起见,所有块都应该有一个单一的入口和出口。@Kos:我改为推荐。这只是我的意见。