gpt4 book ai didi

java - 重构代码的好方法

转载 作者:太空宇宙 更新时间:2023-11-04 10:52:43 25 4
gpt4 key购买 nike

我有几个 DTO 对象。

public class MovieRequest {}
public class OtherTitle extends MovieRequest {}
public class ReleaseDate extends MovieRequest {}

这些对象是使用通用贡献(DTO 对象)上传的 public class ContributionNew<T extends MovieRequest> {}方法

void createOtherTitleContribution(
final ContributionNew<OtherTitle> contribution,
...
);
void updateOtherTitleContribution(
final ContributionUpdate<OtherTitle> contribution,
...
);
void createReleaseDateContribution(
final ContributionNew<ReleaseDate> contribution,
...
);
void updateReleaseDateContribution(
final ContributionUpdate<ReleaseDate> contribution,
...
);

电影的信息较多,这些方法会重复大约 30 次。 e. createBoxOfficeContribution ETC例如,更新贡献的方法如下所示

@Override
public void updateOtherTitleContribution(
ContributionUpdate<OtherTitle> contribution,
Long contributionId,
Long userId
) throws ResourceNotFoundException {
log.info("Called with contribution {}, contributionId {}, userId {}",
contribution, contributionId, userId);

final UserEntity user = this.findUser(userId);
final ContributionEntity contributionEntity = this.findContribution(contributionId, EditStatus.WAITING, user, MovieField.OTHER_TITLE);

this.validIds(contributionEntity.getIdsToAdd(), contribution.getElementsToAdd().keySet());
this.validIds(contributionEntity.getIdsToUpdate().keySet(), contribution.getElementsToUpdate().keySet());
this.validIds(contributionEntity.getIdsToDelete(), contribution.getIdsToDelete());

this.cleanUpIdsToAdd(contributionEntity.getIdsToAdd(), contribution.getElementsToAdd().keySet(), contributionEntity.getMovie().getOtherTitles());
this.cleanUpIdsToUpdate(contributionEntity.getIdsToUpdate(), contribution.getElementsToUpdate().keySet());
this.cleanUpIdsToDelete(contributionEntity.getIdsToDelete(), contribution.getIdsToDelete());

contribution.getElementsToAdd().forEach((key, value) -> {
this.moviePersistenceService.updateOtherTitle(value, key, contributionEntity.getMovie());
});
contribution.getElementsToUpdate().forEach((key, value) -> {
this.moviePersistenceService.updateOtherTitle(value, key, contributionEntity.getMovie());
});
contribution.getNewElementsToAdd()
.forEach(otherTitle -> {
final Long id = this.moviePersistenceService.createOtherTitle(otherTitle, contributionEntity.getMovie(), user);
contributionEntity.getIdsToAdd().add(id);
});

contributionEntity.setSources(contribution.getSources());
Optional.ofNullable(contribution.getComment()).ifPresent(contributionEntity::setUserComment);
}

如您所见,这些方法的唯一区别是调用方法

this.moviePersistenceService.updateOtherTitle(...)

调用 updateReleaseDateContribution 方法

this.moviePersistenceService.updateReleaseDate(...)

正如您所看到的,差异只有几行,而按照旧方式,当前代码将有几千行。您对通用通用方法有什么想法吗?如何做得更好?

最佳答案

  • 您可以创建一个方法moviePersistenceService.update(MovieRequest req),该方法将在执行持久性部分之前检查req 的类型。

  • 您还可以将一个函数(将执行持久性部分的函数)作为参数传递给 updateOtherTitleContribution(检查 How to pass a function as a parameter in Java? )

关于java - 重构代码的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47637594/

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