瞄准clean code
和testing
。每个功能/方法应该执行一个且只有一个的事情。这就是理论。为了说明我想与你分享一些代码,然后提问。
假设我们需要一种方法,如果条件为真且条件的空列表为假,则会返回一个玩家列表。
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执行两件事:
划分那些&#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
}
您遵循哪种方法并应用于您的编码。 对我来说,第二个是可测试的,可重复使用的,并且每个方法都完全按照它的预期进行。但这不仅仅是书中的理论吗?我阅读了很多代码,并不尊重这种模式。
你对此有何看法?
答案 0 :(得分:3)
取决于(tm)。这取决于你在将事情分解为更小的方法时使代码更清晰,更容易理解。
就个人而言,我会保持外部接口相同(该方法可以返回填充列表或空),否则,如果您的客户端需要执行代码if / else子句,您可能会泄漏逻辑。此外,我将使用一种称为“两个抽象级别的代码”或“每个方法应该下降一个抽象级别”的方法。通过这样做,最终代码可能看起来像
public List<int> ListOfPlayersIDs(int InputNumber)
{
if (methodDescribingTheBusinessCondition()) {
return methodDescribingPositiveOutcome();
} else {
return methodNameDescribingNegativeOutcome();
}
}
这个想法是所有这些应该读作“普通”英语,所以阅读代码的人会知道发生了什么,而不必了解所有细节。在这里,每个方法也只做一件事,编排整个事物的方法通常称为“策略”(因为它描述了你的功能)。
如果您的方法很简单,这种抽象级别可能会使其更难理解。
最后但并非最不重要的是,这种方法在几本书(清洁代码非常具体)中有所解释,并且它被用作专业发展的良好实践。