TDD和贝叶斯垃圾邮件过滤器问题

众所周知,贝叶斯分类器是过滤垃圾邮件的有效方法.这些可以相当简洁(我们的只有几百个LoC)但是在获得任何结果之前,所有核心代码都需要预先编写.

但是,TDD方法要求只能编写通过测试的最小代码量,因此请使用以下方法签名:

bool IsSpam(string text)

以下是一串文字,显然是垃圾邮件:

"Cheap generic viagra"

我可以编写的最小代码量是:

bool IsSpam(string text)
{
    return text == "Cheap generic viagra"
}

现在也许我会添加另一条测试消息,例如

"Online viagra pharmacy"

我可以将代码更改为:

bool IsSpam(string text)
{
    return text.Contains("viagra");
}

…等等等等.直到某些时候,代码变得混乱了字符串检查,正则表达式等等,因为我们已经进化了它而不是考虑它并从一开始就用不同的方式编写它.

那么TDD应该如何处理这种类型的情况,即从最简单的代码中提取代码以通过测试不是正确的方法? (特别是如果事先知道最佳实现不能简单地进化).

解决方法

首先编写垃圾邮件过滤器算法的较低级别部分的测试.

首先,您需要在脑海中对算法应该如何进行粗略设计.然后,您隔离算法的核心部分并为其编写测试.在垃圾邮件过滤器的情况下,可能使用贝叶斯定理计算一些简单的概率(我不知道贝叶斯分类器,所以我可能是错的).您可以自下而上地逐步构建它,直到最后您已经实现了算法的所有部分并将它们放在一起很简单.

它需要大量的练习才能知道哪些测试以哪种顺序写入,这样你就可以用足够小的步骤来完成TDD.如果您需要编写超过10行代码来传递一个新测试,那么您可能做错了.从较小的东西开始或模拟一些依赖项.它在较小的一侧更安全,因此步骤太小而且进度缓慢,而不是试图做出太大的步骤而且失败严重.

您拥有的“廉价通用伟哥”示例可能更适合acceptance test.它甚至可能运行得非常慢,因为您首先需要使用示例数据初始化垃圾邮件过滤器,因此它不会用作TDD测试. TDD测试需要为FIRST(F =快速,如每秒数百或数千次测试).

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...