单独的类与方法

时间:2008-12-19 23:53:21

标签: unit-testing language-agnostic tdd mocking

快速设计问题。

ClassA有一个名为DoSomething(args)的方法

在DoSomething()中,在它实际上可以做某事之前,它需要用args做一些准备工作。我认为这应该封装在ClassA中(而不是在外面做准备工作并将其传入),因为没有其他任何事情需要知道DoSomething需要这个准备工作。

然而,实际的准备工作代码属于让我思考的地方。

我的具体例子中的准备工作是从args创建满足特定条件的项目列表。

我的预感是我应该创建一个新的类ListOfStuff,它在构造函数中使用args并将此准备工作放在这里。

从TDD的角度来看,我认为这是正确的选择。然后我们可以对ListOfStuff进行单元测试,直到我们内心深处。如果我们将准备工作放在ClassA的私有方法中,我们只能通过测试DoSomething()来间接测试它。

但这有点过分吗?自从采用TDD和DI方法以来,我已经看到了我写的多个类 - 我应该担心吗?

的Ta。

6 个答案:

答案 0 :(得分:4)

最简单的事情是什么?那是TDD的口头禅。不要试着想太远。如果是时候创建帮助器类,你就会知道它,因为你将在其他类的多个方法中做各种相关的工作。在那之前,做你方法的工作。如果它使方法读取太长或太麻烦,请将工作提取到自己的方法。此方法也可以根据您的心脏内容进行测试,而无需其他课程。

答案 1 :(得分:4)

这里有几种启发式方法。

  1. 这个班上有州吗? 从调用中幸存下来 调用?这项准备工作是否得到 每次需要时都会完成 doSomething(),或者它完成了 得救了吗?如果是这样,那就争辩说 类。
  2. 是否需要进行此计算 在不止一次的地方?如果是这样, 争论一个阶级。
  3. 可以详情了 doSomething()的实现 方法,或准备工作 它,改变而不影响 封闭课程?如果是这样,那就是争论 为了上课。
  4. 嗯,三个启发式。没有人期待西班牙宗教裁判所。

答案 2 :(得分:2)

绝对把它放在一个新的课堂上。它被称为分离关注点。你不想重载一个类,让它做各种其他的东西。这是因为你的课程不能在其他任何地方使用,因为它对一件事情如此具体。

将它放在课堂上,然后在其他地方使用该课程。否则你将来必须一次又一次地写这个。

为了使其可扩展,并能够传递各种不同的算法,此后的设计模式是Strategy模式。但那是为了将来......

答案 3 :(得分:1)

您的对象模型设计应该由它自己考虑,而不是在您的开发策略的上下文中。如果构建ListOFStuff并传递给DoSomething真的是对象模型如何最佳地结合在一起,那么,,无论您的开发策略如何

我认为你已经回答了一些问题,但是,因为ListOfStuff使单元测试更容易,这可能意味着它也是一个更清洁的设计

希望有所帮助!

答案 4 :(得分:1)

  

采用TDD和DI   方法,我已经看到了数量   我写的多个类 - 应该   我很担心?

如果您的目标是程序编程,是的。但是,因为你几乎肯定想要以OO的方式工作,没有。

大多数人使用太少的类型,花太少时间考虑OO设计。

关于课堂责任的问题反映了思维的成熟(imho)。

答案 5 :(得分:1)

只有当问题中的“关注点”与班级无关时,或者您发现共享此“关注”(又称违反DRY)的类时,SoC才有效。在你的情况下,似乎代码是类的内在代码 - 因此private函数可能更适合。

正如tvanfosson所说,你需要平衡SoC和YAGNI。就个人而言 - 我想你可能会过早地考虑这个问题(我知道!我也一直这样做)。