Я пытаюсь освоить рефакторинг для проекта, над которым я сейчас работаю. В основном у меня есть два класса, каждый из которых расширяется от интерфейса.
Если вы посмотрите на мой код, вы можете заметить, что много дублирования кода, поскольку реализации методов в каждом классе практически одинаковы - они просто используют разные типы объектов (Хотя InvestmentRequests
и FundingRequests
также реализуют один и тот же интерфейс).
Так, что было бы идеальным подходом для рефакторинга этого кода? Это можно сделать на уровне интерфейса? Я попытался сделать это, объявив объекты в моем интерфейсе так:
RequestsData allRequests = null;
RequestsData fixedRequests = null;
RequestsData trackerRequests = null;
но это не похоже на то, что я пытаюсь сделать, и я не уверен в синтаксисе.
Интерфейс
public interface RequestDataBase<E,T> {
T getAllRequests();
T getFixedRequests();
T getTrackerRequests();
void add(E newRequest);
void addAll(List<E> accounts);
}
Класс A
public class FundingRequestData implements RequestDataBase<FundingRequest,FundingRequestData.FundingRequests> {
private static FundingRequests fundingRequests;
private static FundingRequests fixedFundingRequests;
private static FundingRequests trackerFundingRequests;
private static FundingRequestData instance = new FundingRequestData();
public static FundingRequestData getInstance() {
return instance;
}
private FundingRequestData() {
fundingRequests = new FundingRequests();
fixedFundingRequests = new FundingRequests();
trackerFundingRequests = new FundingRequests();
}
@Override
public FundingRequests getAllRequests() {
return fundingRequests;
}
@Override
public FundingRequests getFixedRequests() {
return fixedFundingRequests;
}
@Override
public FundingRequests getTrackerRequests() {
return trackerFundingRequests;
}
private void listSpecifier(FundingRequest request) {
if (request.getType().equals("FIXED")) {
fixedFundingRequests.add(request);
} else {
trackerFundingRequests.add(request);
}
}
@Override
public void add(FundingRequest newRequest) {
fundingRequests.add(newRequest);
listSpecifier(newRequest);
}
@Override
public void addAll(List<FundingRequest> accounts) {
fundingRequests.getRequests().addAll(accounts);
for (FundingRequest request : accounts) {
listSpecifier(request);
}
}
Класс B
public class InvestmentRequestData implements RequestDataBase<InvestmentRequest,InvestmentRequestData.InvestmentRequests> {
private static InvestmentRequests investmentRequests;
private static InvestmentRequests fixedInvestmentRequests;
private static InvestmentRequests trackerInvestmentRequests;
private static InvestmentRequestData instance = new InvestmentRequestData();
public static InvestmentRequestData getInstance() { return instance; }
private InvestmentRequestData() {
investmentRequests = new InvestmentRequests();
fixedInvestmentRequests = new InvestmentRequests();
trackerInvestmentRequests = new InvestmentRequests();
}
public void investAll() {
for (InvestmentRequest request : investmentRequests.getUnfulfilledRequests()) {
request.investAll();
}
}
public InvestmentRequests getAllRequests() {
return investmentRequests;
}
public InvestmentRequests getFixedRequests() { return fixedInvestmentRequests; }
public InvestmentRequests getTrackerRequests() {
return trackerInvestmentRequests;
}
private void listSpecifier(InvestmentRequest newRequest) {
if(newRequest.getType().equals("FIXED")) {
fixedInvestmentRequests.add(newRequest);
} else {
trackerInvestmentRequests.add(newRequest);
}
}
public void add(InvestmentRequest newRequest) {
investmentRequests.add(newRequest);
listSpecifier(newRequest);
}
public void addAll(List<InvestmentRequest> newRequests) {
for (InvestmentRequest request : newRequests) {
listSpecifier(request);
}
}