清洁代码,测试和可重用性澄清

时间:2015-04-10 19:33:10

标签: testing reusability code-cleanup

瞄准clean codetesting。每个功能/方法应该执行一个且只有一个的事情。这就是理论。为了说明我想与你分享一些代码,然后提问。

假设我们需要一种方法,如果条件为真且条件的空列表为假,则会返回一个玩家列表。

第一种方法:一种方法:

public List<int> ListOfPlayersIDs(int InputNumber)
             {
                 if (Condition)
                 {
                     return new List<int>(new int[] {1, 2, 3}); // return a list with items
                 }
                 else 
                 {
                     return new List<int>();//return an empty list
                 }

             }

所以这里方法ListOfPlayersIDs执行两件事:

  1. 返回玩家列表
  2. 验证条件是否有效,如果不是
  3. 则返回空列表

    划分那些&#34;功能&#34;我们可以有一种方法来检查条件,一种方法可以返回玩家列表。

    这样的事情:


    第二种方法:两种方法:

    第一种方法

    public bool ArePlayerValidForThisNumber(int InputNumber)
    {
    If (condition)
    return true;
    else return false;
    //Or simply return condition;
    }
    

    第二种方法

    public List<int> ListOfPlayersIDs(int InputNumber)
                 {
              return new List<int>(new int[] {1, 2, 3}); // return a list with items 
    }
    

    我的问题是:

    您遵循哪种方法并应用于您的编码。 对我来说,第二个是可测试的,可重复使用的,并且每个方法都完全按照它的预期进行。但这不仅仅是书中的理论吗?我阅读了很多代码,并不尊重这种模式。

    你对此有何看法?

1 个答案:

答案 0 :(得分:3)

取决于(tm)。这取决于你在将事情分解为更小的方法时使代码更清晰,更容易理解。

就个人而言,我会保持外部接口相同(该方法可以返回填充列表或空),否则,如果您的客户端需要执行代码if / else子句,您可能会泄漏逻辑。此外,我将使用一种称为“两个抽象级别的代码”或“每个方法应该下降一个抽象级别”的方法。通过这样做,最终代码可能看起来像

public List<int> ListOfPlayersIDs(int InputNumber)
{
   if (methodDescribingTheBusinessCondition()) {
      return methodDescribingPositiveOutcome(); 
   } else {
      return methodNameDescribingNegativeOutcome();
   }
}

这个想法是所有这些应该读作“普通”英语,所以阅读代码的人会知道发生了什么,而不必了解所有细节。在这里,每个方法也只做一件事,编排整个事物的方法通常称为“策略”(因为它描述了你的功能)。

如果您的方法很简单,这种抽象级别可能会使其更难理解。

最后但并非最不重要的是,这种方法在几本书(清洁代码非常具体)中有所解释,并且它被用作专业发展的良好实践。