gpt4 book ai didi

java - 单一职责原则重构

转载 作者:行者123 更新时间:2023-11-30 02:46:27 25 4
gpt4 key购买 nike

我想重构一些代码,使其不违反单一职责原则 (SRP)。

据我了解,以下类可能会因多种原因而发生更改:

  • 分析的业务规则可能会发生变化
  • 元数据架构可能会发生变化
  • 上传方法可能会改变

但是,我很难弄清楚如何将其重构为单独的类。

引擎.java

package com.example;

import java.util.List;

public interface Engine {
public List<Recording> analyze(List<String> files);
public List<Recording> getMetadata(List<Recording> recordings);
public List<Recording> upload(List<Recording> recordings);
}

CallEngine.java

package com.example;

import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CallEngine implements Engine {

final static Logger log = LoggerFactory.getLogger(Main.class);

public List<Recording> analyze(List<String> files) {
log.info("Analyzing recording files per business rules...");

List<Recording> recordings = new ArrayList<Recording>();
return recordings;
}

public List<Recording> getMetadata(List<Recording> r) {
log.info("Retrieving metadata for calls...");
List<Recording> recordings = new ArrayList<Recording>();
return recordings;
}

public List<Recording> upload(List<Recording> r) {
log.info("Uploading calls...");
List<Recording> recordings = new ArrayList<Recording>();
return recordings;
}
}

最佳答案

SRP 主要是通过抽象接口(interface)后面的代码并将不相关功能的责任委托(delegate)给运行时恰好位于接口(interface)后面的任何实现来实现的。

在这种情况下,您需要将职责抽象到自己的接口(interface)后面。

例如...

public interface Analyzer {
public List<Recording> analyze(List<String> files);
}
public interface Retriever {
public List<Recording> getMetadata(List<Recording> recordings);
}
public interface Uploader {
public List<Recording> upload(List<Recording> r);
}

并将它们作为 Engine 实现的可注入(inject)依赖项。

public class CallEngine implements Engine {
private Analyzer analyzer;
private Retriever retriever;
private Uploader uploader;

public CallEngine(Analyzer analyzer, Retriever retriever, Uploader uploader) {
this.analyzer = analyzer;
this.retriever = retriever;
this.uploader = uploader;
}

public List<Recording> analyze(List<String> files) {
return analyzer.analyze(files);
}

public List<Recording> getMetadata(List<Recording> r) {
return retriever.getMetadata(r);
}

public List<Recording> upload(List<Recording> r) {
return uploader.upload(r);
}
}

可以更改它们的运行时实现,而不会影响依赖类实现的总体责任,这使其更能适应更改。

关于java - 单一职责原则重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40070029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com