关于 SOLID/TDD 的问题

Questions on SOLID/TDD

多年来,我一直对 TDD 很感兴趣,但是有一两件事情没有引起注意。我很确定这是大多数人在尝试时通常的想法。 "The examples in the book are wonderful, but my code is a lot more complicated than that. I never have a a procedure that does one thing, it will call three others, and they will call three others, and that will get data from the DB... bla bla bla".

不久前,我发现了一些关于 SOLID 的视频(任何被卡住的人,认为 TDD 会很棒,但是......然后找到一些关于 SOLID 的视频,相信我)。每一点都变得更加混乱,直到最后,一切都到位了,包括我对测试代码和 TDD 的看法。

当然,我有很多旧代码,它们不是这样写的,但我对此没有意见,因为我确实看到了更好的想法。每当我处理任何事情时,我都可以将其取出并正确地完成(即使这意味着删除需要更新的方法的一小部分,赋予它自己的 class,然后调用它。

还有几个问题。我想知道在哪里可以找到答案,或者是否有标准。

应该检测多少?
我的假设是全部。我的很多函数都会接受输入参数,运行 一个存储过程。我对如何测试的猜测是,使用一组给定的输入参数,存储过程被称为正确的存储过程,参数是否正确输入。这通常是显而易见的(有时会有一组数字输入将被转换为逗号分隔的字符串)。如果没有别的,这个例子虽然测试可能没有那么有价值,但将成为文档。

如何命名事物?
这是开发的老问题。 class 应该像方法一样命名,UpdateEmployee,还是应该有很多 er classes (EmployeeUpdaterEmplyeeGetter 等)

IOC一般是怎么处理的?
现在这还可以,我正在创建接口、实现、设置 IOC 等。 不过我可以看到,很快我将在我的 IOC 初始化方法中有一页又一页 Interface/Class 映射,或者我会想象它分成几个部分,一个方法调用其他几个方法,每个注册 classes(通过名称空间或其他)。它通常是这样运作的,还是有更聪明的管理方式?

我推荐阅读 Robert C Martin 的 Clean Code

在我看来...

应该检测多少?

多少和好坏差别很大

最终它是一个判断调用和/或一个简单的 cost/benefit 分析。 关键 apps/code 应该进行更彻底的测试。 使用纯 TDD 意味着您的代码将经过高度测试——很容易达到 90% 以上的覆盖率,但请记住,测试质量和覆盖率之间存在差异。您可能决定测试更多边缘情况。

您可以通过一个测试用例获得 100% 的覆盖率,但是测试一系列值是务实的,例如0、1、许多 & 边界。

如何命名?

以Java为例,查看标准Java API文档,看看他们是怎么做的。 参考 Clean Code,命名是而且应该是困难的,如果名称不再合适,可能会重构。

示例 类 来自 Java 的 API 的

  1. 文件过滤器
  2. 桌面管理器

名称应该使 class/method/variable 的功能一目了然。

参考 Kent Beck 的简单设计四原则(表达意图)

IOC一般是怎么处理的?

也许其他人可以在这一点上进行更多扩展,但是参考极限编程,不要为了它而使用接口,而是在需要时才使用接口。如果您只有一个具体实例,则可能不需要接口。当您真正需要它们时,重构以添加接口以遵循已知的设计模式。

https://www.martinfowler.com/articles/designDead.html