【发布时间】:2019-08-19 00:51:54
【问题描述】:
我阅读了“Clean Code”一书((c) Robert C. Martin)并尝试使用SRP(单一责任原则) .我对此有一些疑问。我的应用程序中有一些服务,但我不知道如何重构它以匹配正确的方法。比如我有服务:
public interface SendRequestToThirdPartySystemService {
void sendRequest();
}
如果你查看类名,它会做什么? - 向第三方系统发送请求。但我有这个实现:
@Slf4j
@Service
public class SendRequestToThirdPartySystemServiceImpl implements SendRequestToThirdPartySystemService {
@Value("${topic.name}")
private String topicName;
private final EventBus eventBus;
private final ThirdPartyClient thirdPartyClient;
private final CryptoService cryptoService;
private final Marshaller marshaller;
public SendRequestToThirdPartySystemServiceImpl(EventBus eventBus, ThirdPartyClient thirdPartyClient, CryptoService cryptoService, Marshaller marshaller) {
this.eventBus = eventBus;
this.thirdPartyClient = thirdPartyClient;
this.cryptoService = cryptoService;
this.marshaller = marshaller;
}
@Override
public void sendRequest() {
try {
ThirdPartyRequest thirdPartyRequest = createThirdPartyRequest();
Signature signature = signRequest(thirdPartyRequest);
thirdPartyRequest.setSignature(signature);
ThirdPartyResponse response = thirdPartyClient.getResponse(thirdPartyRequest);
byte[] serialize = SerializationUtils.serialize(response);
eventBus.sendToQueue(topicName, serialize);
} catch (Exception e) {
log.error("Send request was filed with exception: {}", e.getMessage());
}
}
private ThirdPartyRequest createThirdPartyRequest() {
...
return thirdPartyRequest;
}
private Signature signRequest(ThirdPartyRequest thirdPartyRequest) {
byte[] elementForSignBytes = marshaller.marshal(thirdPartyRequest);
Element element = cryptoService.signElement(elementForSignBytes);
Signature signature = new Signature(element);
return signature;
}
它实际上是做什么的? - 创建一个请求 -> 签署这个请求 -> 发送这个请求 -> 将响应发送到队列
此服务注入另外 4 个服务:eventBus、thirdPartyClient、cryptoSevice 和 marshaller。并在 sendRequest 方法中调用每个此服务。
如果我想为这个服务创建一个单元测试,我需要 mock 4 个服务。我觉得太多了。
有人可以指出如何更改此服务吗?
更改班级名称并保持原样? 分成几个班? 还有什么?
【问题讨论】:
-
你可以在softwareengineering.stackexchange.com提出这个问题
标签: java spring oop architecture single-responsibility-principle