快速设计问题。
ClassA有一个名为DoSomething(args)的方法
在DoSomething()中,在它实际上可以做某事之前,它需要用args做一些准备工作。我认为这应该封装在ClassA中(而不是在外面做准备工作并将其传入),因为没有其他任何事情需要知道DoSomething需要这个准备工作。
然而,实际的准备工作代码属于让我思考的地方。
我的具体例子中的准备工作是从args创建满足特定条件的项目列表。
我的预感是我应该创建一个新的类ListOfStuff,它在构造函数中使用args并将此准备工作放在这里。
从TDD的角度来看,我认为这是正确的选择。然后我们可以对ListOfStuff进行单元测试,直到我们内心深处。如果我们将准备工作放在ClassA的私有方法中,我们只能通过测试DoSomething()来间接测试它。
但这有点过分吗?自从采用TDD和DI方法以来,我已经看到了我写的多个类 - 我应该担心吗?
的Ta。
答案 0 :(得分:4)
最简单的事情是什么?那是TDD的口头禅。不要试着想太远。如果是时候创建帮助器类,你就会知道它,因为你将在其他类的多个方法中做各种相关的工作。在那之前,做你方法的工作。如果它使方法读取太长或太麻烦,请将工作提取到自己的方法。此方法也可以根据您的心脏内容进行测试,而无需其他课程。
答案 1 :(得分:4)
这里有几种启发式方法。
答案 2 :(得分:2)
绝对把它放在一个新的课堂上。它被称为分离关注点。你不想重载一个类,让它做各种其他的东西。这是因为你的课程不能在其他任何地方使用,因为它对一件事情如此具体。
将它放在课堂上,然后在其他地方使用该课程。否则你将来必须一次又一次地写这个。
为了使其可扩展,并能够传递各种不同的算法,此后的设计模式是Strategy模式。但那是为了将来......
答案 3 :(得分:1)
您的对象模型设计应该由它自己考虑,而不是在您的开发策略的上下文中。如果构建ListOFStuff并传递给DoSomething真的是对象模型如何最佳地结合在一起,那么,,无论您的开发策略如何。
我认为你已经回答了一些问题,但是,因为ListOfStuff使单元测试更容易,这可能意味着它也是一个更清洁的设计。
希望有所帮助!
答案 4 :(得分:1)
采用TDD和DI 方法,我已经看到了数量 我写的多个类 - 应该 我很担心?
如果您的目标是程序编程,是的。但是,因为你几乎肯定想要以OO的方式工作,没有。
大多数人使用太少的类型,花太少时间考虑OO设计。
关于课堂责任的问题反映了思维的成熟(imho)。
答案 5 :(得分:1)
只有当问题中的“关注点”与班级无关时,或者您发现共享此“关注”(又称违反DRY)的类时,SoC才有效。在你的情况下,似乎代码是类的内在代码 - 因此private
函数可能更适合。
正如tvanfosson所说,你需要平衡SoC和YAGNI。就个人而言 - 我想你可能会过早地考虑这个问题(我知道!我也一直这样做)。