使用TDD:客户端/服务器文件同步

5
我开始尝试学习tdd,并希望在实际项目中使用它。因此,我决定用Java编写一个简单的客户端和服务器文件同步程序。在完成了客户端部分后,我在编写服务器部分时遇到了困难。
为了对逻辑进行单元测试而不访问外部资源,我将它们放在单独的类中,以便可以模拟它们。到目前为止,一切都很好。
现在我的问题是: 这张图片展示了我想象的整个架构,其中绿色部分已经完成,黄色部分尚未实现。
在我的情况下,我需要向RemoteServer传递ConnectionManagerConnectionManager需要一个FileAdapter和一个Communicator,以创建ClientConnectionHandler。对我来说,这听起来有点过于复杂。这种情况在tdd'ing中正常吗?还是我在保持可测试性方面做错了什么?
编辑:类ClientConnectionHandler仅负责服务器端的文件同步逻辑,也就是说:按照自己的小协议从客户端接收文件。
1个回答

2
这是一段英文文本,以下是翻译:

这很正常。如果您有一个具有许多依赖项的类,则很可能也具有太多职责。但是,一个类依赖于另一个类,而另一个类依赖于另一个类 - 这很正常。

这就是为什么IoC容器库如Spring很受欢迎的原因。它们使配置和解析所有依赖项变得更加容易。


关于太多职责的问题,你说得很对(客户端连接处理程序可能实际上需要一个小的类层次结构——1个基类和两个派生类——但从图表中很难看出它实际上做了什么)。而控制反转容器库是解决依赖关系问题的好方法。 - Merlyn Morgan-Graham
感谢您的评论!我会看一下Spring。关于担负过多职责的问题:我已经试着遵循SRP原则了。ClientConnectionHandler类只负责服务器端文件同步逻辑,也就是按照自己的小协议从客户端接收文件。我无法想到将其分解为几个不同类的方法。有什么提示吗? - b1nh
@b1nh:所以它是将网络转换为文件(或反之亦然)吗?您可能需要一个中间表示(流/基于事件的流抽象,如果您不想要或没有使用内存对象模型-有点像XML读取器),以避免违反SRP。同时保持或处理连接+文件对于一个类来说责任太大了,在我看来。 - Merlyn Morgan-Graham
@Merlyn:连接处理程序本身将文件访问委托给FileSystemAdapter,将网络通信委托给SocketCommunicator,因此在处理程序中接收文件可能看起来像fileadapter.writeToFile(communicator.getbytes,filename)。我认为这样做不会违反SRP原则。 - b1nh
@b1nh:那听起来不错。我需要看代码才能确定,但你可能不需要将其拆分。顺便说一句,如果这个答案对你有帮助(我认为这是一个好答案),请标记它为已接受。这会给TrueWill加分 :) - Merlyn Morgan-Graham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接