Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
发现违反单一责任原则时的Tdd工作流_Tdd_Single Responsibility Principle - Fatal编程技术网

发现违反单一责任原则时的Tdd工作流

发现违反单一责任原则时的Tdd工作流,tdd,single-responsibility-principle,Tdd,Single Responsibility Principle,我正试图跟随TDD。这就是我的问题 我与方法有接口风险 boolean check(...) Risk1和Risk2是首先在测试中开发的实现,所以现在已经完全涵盖了它们。 我决定检查所有风险的单位(复合风险)也可以实施风险。 复合风险适用于每个风险1和风险2 rezult(如果一个风险为真,则整个风险为真)。但一切都是先测试的 现在,我正在寻找一个风险和思考-这一个有单词“和”,并检查不同的领域。似乎我可以将其拆分为两个对象,然后再创建一个CompositeAndRisk,它将应用于两个拆分的

我正试图跟随TDD。这就是我的问题

我与方法有接口风险

boolean check(...)
Risk1和Risk2是首先在测试中开发的实现,所以现在已经完全涵盖了它们。 我决定检查所有风险的单位(复合风险)也可以实施风险。 复合风险适用于每个风险1和风险2 rezult(如果一个风险为真,则整个风险为真)。但一切都是先测试的

现在,我正在寻找一个风险和思考-这一个有单词“和”,并检查不同的领域。似乎我可以将其拆分为两个对象,然后再创建一个CompositeAndRisk,它将应用于两个拆分的风险。这样我就可以为风险决策树构建DSL(看起来不错,因为风险规则可能会发生很多变化)


那么我应该如何处理风险的I分割测试呢?我应该将I重命名为CompositeAndRiskTest吗?我应该删除它吗?我应该为SplitClass编写测试吗?

首先,我建议您将
CompositeRisk
类转换为一个接口,并拥有它的两个独立子类:
CompositeOrRisk
CompositeAndRisk
。不过这只是设计上的问题

关于你的问题,我相信没有单一的正确答案,所以让我分享一下我的看法。
正如您所知,在TDD中,您会遵循一些具体的步骤(包括TDD循环),并且在每个步骤之间都有一个特定的测试状态。我的意思是:

[State = No tests]  
1. Write a test that fails  
[State = Test fails]
2. Write as little code as possible in order for the test to pass  
[State = Test passes]  
3. Refactor  
[State = Test still passes]
鉴于这正是我们在TDD中的目标,我将执行您在重构阶段所说的更改,包括相应地重构测试。
这意味着,如果我拆分一个类,那么我也将拆分相关的测试。测试决不能失败,因为我只是在改变代码的结构,而不是它的功能(这毕竟是重构的意义)


如果您有更大的更改要做,我会从头开始创建一个新类(当然是TDD),然后从旧类中删除不再需要的功能,以及现在冗余的测试用例。

在这种情况下,我会采取的方法是“无害地玩”——当您发现新需求时,只需编写一个测试及其实现,假装一开始就忽略了与先前需求的关系

这里的“和”案例显然是新的功能。此时无需修改现有测试的内容,只需使用反映新需求的名称创建另一个测试,例如
CompositeAndRiskTest
,并创建相应的实现

然后,在重构步骤中,“意识到”前面的两个对象是同一硬币的两面,并相应地重构它们。这可能只是意味着将
复合磁盘
重命名为
复合磁盘
,或者更复杂的事情


一旦识别、测试和实施了这两种风险,您就可以继续为它们的组合创建新的测试。

我的想法是将CompositeRisk重命名为CompositeOrRisk。创建CompositeAndRisk。两者都存在实现风险(组件实现的接口相同)。我可能会将我想要的CLA重命名为CompositeAndRisk,将EXTRACT功能重命名为新类。但我现在的测试似乎会测试不必要的细节。看来你对分割测试的建议是最好的,这就是我要说的。除此之外,我唯一想做的就是把一个通用的接口<代码> > CyrimeSISK/<代码>到 CypItError Reals和 CypItEng/Value,因为以后可能需要添加更多的复合材料,并可能增加它的功能性(使其扩展<代码>可迭代< /代码>或类似的东西)。