功能用例

时间:2011-03-28 06:20:42

标签: c# java language-agnostic

我对函数用例有疑问,在哪种情况下我应该使用下面的函数?

void function(string k,string l)
{
    if(k!=null &l!=null)
    {
        //do some operation on k and l 
    }
}

void function(string k,string l)
{     
    //do some operation on k and l
    //i do understand that i get nullreference 
    //exceptions for null values of k and l
    //one use case i have seen this type of function: in a class
    //private methods when u are sure of passing non-null objects.
}


void function(string k,string l)
{     
    if (k==null)
        throw new ArgumentNullException("k is null");
    if (k==null)
        throw new ArgumentNullException("l is null");
        // do some operation on k and l
}

我使用string来证明我的观点,那些args可能是任何对象。

请列出每个功能的用例。

5 个答案:

答案 0 :(得分:3)

最后一种情况在API和框架中最有用,其中API的使用者在调试时需要特定的错误消息。第二个例子在应用程序代码中更常见,应用程序员可以通过源代码进行调试,尽管我常常更喜欢第三个解决方案。

几乎不应该使用第一种解决方案。只有在调用者非常清除的情况下,如果值为null,代码将不会执行,则应使用此类技术。

我怀疑你真正想知道的(但不知道的话)是Design by Contract。 DbC是一种设计技术/范例,其中开发人员根据关于如何处理输入以及每种方法承诺的内容的非常具体的规则与呼叫者建立显式合同。一个结构良好的契约将使调用者明确地知道该方法对任何给定输入的行为。

答案 1 :(得分:1)

您的问题实际上是:我应该在哪里检测参数中的错误,如果我检测到它们应该怎么做 - 换句话说,谁应该处理错误?

检测位置:在子程序中检测到情况#1和#3。情况#2由调用者检测到(因为例程可能不会在参数错误时抛出异常 - 它可能会执行,只是提供错误的结果)

谁处理:子例程中的案例#1句柄。案例#2和案例#3由来电者处理。

我的建议始终是案例#3。原因:

  1. 案例#1默默失败。除非您返回错误代码,否则调用者可能永远不会知道。
  2. 案例#2太不可预测,因为调用者负责检测和处理。如果调用者认为调用正常,然后您更改子例程的实现,则可能会破坏调用代码。
  3. 使用.NET的建议:安装代码合同。这样,您可以获得参数的静态检查。你可以这样做:

    string MyFunction (string k, string l)
    {
        Contract.Requires(!string.IsNullOrWhiteSpace(k));
        Contract.Requires(!string.IsNullOrWhiteSpace(l));
        Contract.Ensures(!string.IsNull(Contract.Return<string>()));
             :
    }
    

答案 2 :(得分:0)

在大多数情况下,我会这样做:

void function(string k,string l)
{
 if(k!=null && l!=null)
  {
    //do some operation on k and l ..
  } else {
    //throw exception / other error handling...
  }
}

如果参数可能是null对象,最好在函数开头检查它们并采取必要的操作。

上面的编码风格也是一个Java编码标准(你比较!= null)。标准建议在==比较null时使用它。

对没有验证的函数进行编码并不好。但是对于小项目和确定拍摄功能,您可以避免验证。

答案 3 :(得分:0)

使用:处理无效时k或l为空的情况。用于无法使用无效参数进行任何操作的情况 注意:你可能意味着&amp;&amp;而不是&amp;

void function(string k,string l)
{
 if(k!=null &l!=null)
   {
    //do some operation on k and l 
    }
}

使用:忽略k或l为空的可能性。如果您确定知道k和l已被实例化,则使用。

void function(string k,string l)
{     
   //do some operation on k and l
   //i do understand that i get nullreference 
   //exceptions for null values of k and l
   //one use case i have seen this type of function: in a class
  //private methods when u are sure of passing non-null objects.
}

使用:通过强制调用位置来处理错误,处理k或l为空的情况。用于函数没有足够知识来正确处理错误的情况。

void function(string k,string l)
    {     
       if (k==null)
          throw new ArgumentNullException("k is null");
       if (k==null)
          throw new ArgumentNullException("l is null");
       // do some operation on k and l
    }

答案 4 :(得分:0)

第一种格式:参数可以为null。在这个用例中,您不关心哪一个是null,也不关心在发生这种情况时向日志文件写入任何内容。 这种方法可能会导致您需要调试此代码时遇到困难,因为没有任何内容写入日志,甚至没有写入“调试”级别。

第二种格式:指定的一个用例是私有方法,其中参数先前已经过验证。另一个可能是您希望监视k或l为空的情况。这些情况可能表示存在问题,您希望上层通过运行时异常监视它们。

第三种格式:参数可以为null。在这个用例中,您希望区分不同的情况,因为使用此方法对上层很重要,以了解哪个参数导致此失败并可能以不同方式处理它。