我经常有基于特定的明确定义的算法的代码。这得到了很好的评论并且似乎是正确的。对于大多数数据集,该算法效果很好。

但随后会添加边缘情况、特殊情况和启发法来解决特定数据集的特定问题。随着特例数量的增加,评论也变得越来越模糊。我害怕在一年左右的时间内回过头来查看这段代码,并试图记住为什么添加每个特定的特殊情况或启发式方法。

有时我希望有一种方法可以在源代码中嵌入或链接图形,这样我就可以有效地说,“在这个数据集的图形中,这里的这个特殊功能导致例程错误地触发,所以这就是为什么这段代码代码已添加”。

处理此类情况的最佳做法是什么?

似乎总是需要特殊情况来处理这些异常/边缘情况。如何才能保持代码相对可读和易于理解?

考虑一个处理照片特征识别的示例(不完全是我正在研究的内容,但类比似乎很恰当)。当我发现通用算法失败并且需要特殊情况的特定图片时,我会尽可能在注释中记录该信息(或者正如下面有人建议的那样,描述性函数名称)。但经常缺少的是指向表现出相关行为的特定数据文件的永久链接。虽然我的评论应该描述这个问题,并且可能会说“请参阅文件 foo.jp 以获取此行为的示例”,但该文件永远不会在源代码树中,并且很容易丢失。

在这种情况下,人们是否会将数据文件添加到源树中以供参考?

有帮助吗?

解决方案

如果您有该项目的知识库或 wiki,您可以在其中添加图表,并按照以下方法在方法中链接到它 马修·福勒的名言e 以及边缘情况更改的源代码控制提交消息。

//See description at KB#2312
private object SolveXAndYEdgeCase(object param)
{
   //modify param to solve for edge case
   return param;
}

Commit Message: Solution for X and Y edge case, see description at KB#2312

这是更多的工作,但却是一种比单纯的测试用例或注释更彻底地记录用例的方法。例如,尽管有人可能会认为测试用例应该有足够的文档,但您可能不希望将整个失败数据集存储在其中。

请记住,模糊的问题会导致模糊的解决方案。

其他提示

马丁·福勒在他的重构书中说,当你觉得有必要的注释添加到您的代码,首先看你是否可以封装代码到一个方法,给方法的名称,以取代意见。

,以便作为一个抽象可以创建一个名为方法。

private bool ConditionXAndYHaveOccurred(object param)
{
   // code to check for conditions x and y
   return result;
}

private object ApplySolutionForEdgeCaseWhenXAndYHappen(object param)
{
   //modify param to solve for edge case
   return param;
}

然后就可以写出这样的代码

if(ConditionXAndYHaveOccurred(myObject))
{
    myObject = ApplySolutionForEdgeCaseWhenXAndYHappen(myObject);
}

不是一个硬性的具体的例子,但它会在一年可读性或两个帮助。

单元测试可以帮助在这里。实际上模拟特殊情况下有测试通常可以作为为什么代码做什么它做文档。这通常是更好的然后就描述注释的问题。

不,这取代了移动的特殊案件处理他们自身的功能和体面的评论......

我不是一般测试驱动开发和压力测试过于类似风格的倡导者,但是这似乎是一个完美的情况下一堆单元测试可以有很大的帮助。即使没有在第一时间捕捉从改变后的bug,而仅仅是为了所有需要解决的特殊情况记录。

在他们的意见几个不错的单元测试是在自身的特殊情况最好的说明。本身变得更容易过的代码和注释。人们可以简单地指向一些单元测试示出了在代码中的该点被解决的问题。

关于

  

我有时希望有一种方式嵌入或链接的图形中的源代码,   这样我就可以有效地说,“在这组数据的图表,这个特殊的   此功能是造成程序不正确地触发,所以这就是为什么这片   码被添加的”。

部分:

如果“图形”要嵌入是一个曲线图,如果使用 Doxygen的,则可以嵌入在您的评论命令来生成的文档中的图表:

/**
If we have a subgraph looking like this:
\dot
digraph g{
A->B;
A->C;
B->C;
}
\enddot
the usual method does not work well and we use this heuristic instead.
*/

唐克努特发明文学编程来很容易让你的程序文件,包括图表,图形,图表,数学方程,你需要的任何事情就可以明白。一个有文化的计划是一个伟大的方式来解释的东西是它的方式,以及它如何得到随着时间的推移这种方式。有很多很多有文化的编程工具;了“noweb”工具是最简单的并且是随一些Linux发行。

不知道你的问题的具体性质是不容易给出答案,但在我自己的经验,一定要避免在硬编码处理的特殊情况。你有没有想过实现一个规则引擎或类似的东西来处理你的主处理算法之外的特殊情况?

这听起来像你需要的不仅仅是代码的注释更彻底的文档。有人这样可以查找功能有问题的文件中,并用一个例子图片,需要一个特殊的情况下呈现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top