下面的方法被三个不同的服务所使用,并且在将来可能其他的实现也会被同样的使用,目前的方法不是集中的,它是锅炉板的,因为它存在于每个服务实现中。我正在寻找一种方法,使它集中使用泛型或任何其他建议的解决方案。
public void persistImageDetailsV2() {
String bucketKey = null;
String modelCode = null;
List<S3Object> objList = new ArrayList<>();
String bucketName = s3BucketDetails.getBucketName();
String bucketPath = s3BucketDetails.getMsilBucketPrefix();
log.info("[{}]:Intializing the required attributes: Bucket name [{}] and Bucket path [{}] ", appName,
bucketName, bucketPath);
try {
fillMap();
List<ModelCode> modelCodes = layoutRepository.findDistinctAllBy();
List<String> modelCodePresent = modelCodes.stream().map(ModelCode::getModelCode)
.collect(Collectors.toList());
List<CommonPrefix> allKeysInDesiredBucket = listAllKeysInsideBucket(bucketName, bucketPath);
List<String> s3ModelCodes = allKeysInDesiredBucket.stream().map(CommonPrefix::prefix)
.map(s -> new File(s).getName()).collect(Collectors.toList());
if (!AppUtil.listEqualsIgnoreOrder(s3ModelCodes, modelCodePresent)) {
synchDB(s3ModelCodes, s3ModelCodes);
}
if (null != allKeysInDesiredBucket && !allKeysInDesiredBucket.isEmpty()) {
for (CommonPrefix commonPrefix : allKeysInDesiredBucket) {
bucketKey = commonPrefix.prefix();
modelCode = new File(bucketKey).getName();
if (modelCodePresent.contains(modelCode)) {
log.info("[{}]: Model code [{}] found,skipping iteration", appName, modelCode);
continue;
}
objList = s3Service.getBucketObjects(bucketName, bucketKey);
if (null != objList && !objList.isEmpty()) {
for (S3Object object : AppUtil.skipFirst(objList)) {
Integer overlayId = overlayMasterMap.get(AppUtil.removeExtension(object.key()));
saveLayout(bucketName, object.key(), modelCode, overlayId);
}
}
}
}
} catch (Exception e) {
log.error("[{}]: Exception occurred while processing: error is: {}", appName, e.getMessage());
e.printStackTrace();
}
}
在本例中,layoutRepository的片段List<ModelCode> modelCodes = layoutRepository.findDistinctAllBy();
是ServiceA,以类似的方式,它可以是ServiceB或ServiceC的示例,等等。
所以我正在寻找一种方法,我可以隔离和克服这种紧密耦合的东西形成的代码。
请帮帮忙
1条答案
按热度按时间qaxu7uf21#
那么所有实现之间的唯一区别是
List<ModelCode> modelCodes = layoutRepository.findDistinctAllBy()
吗?如果是,那么
ModelCode
在所有实现中是否都是相同的?如果是,你可以简单地用Supplier<List<ModelCode>>
参数化这个方法,然后把它作为某种可以重用的公共函数:那么所有的实现都只是通过调用这个公共方法:
如果
ModelCode
在所有实现中不相同,则首先从它们中提取一个接口,如下所示:并使所有ModeCode实现都实现这个接口,上面常用的方法就会变成: