我有正在重构的工作代码,以使其更具可读性/遵循Java / OOP约定。
我将分享代码,然后分享一些想法:
public class AbstractTaggingService {
@Autowired
private JoinPointTaggingService joinPointTaggingService;
@Autowired
private StackTraceTaggingService stackTraceTaggingService;
@Autowired
private UserTaggingService userTaggingService;
public Iterable<Tag> getTags(ProceedingJoinPoint joinPoint, MetricsContextHolder contextHierarchy, Authentication authentication){
return Tags.of(
Iterables.concat(
joinPointTaggingService.getTags(joinPoint),
stackTraceTaggingService.getTags(contextHierarchy),
userTaggingService.getTags(authentication)
)
);
}
。
public class JoinPointTaggingService {
public Iterable<Tag> getTags(ProceedingJoinPoint joinPoint) {
return Tags.of(
"methodName", joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName(),
"parameters", parameters.toString()
);
}
。
public class StackTraceTaggingService {
public Iterable<Tag> getTags(MetricsContextHolder contextHolder) {
Stack<MetricsContext> contextHierarchy = contextHolder.getStack();
return Tags.of(
"trace", contextHierarchy.toString(),
"parent", getParent(contextHierarchy),
"children", contextHierarchy.peek().childrenToString(),
"threadID", contextHolder.getID()
);
}
}
。
public class UserTaggingServiceImpl implements UserTaggingService {
@Override
public Iterable<Tag> getTags(Authentication authentication) {
OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();
return Tags.of(
"user", getUserName(authentication),
"auth_session_id", getUserSessionID(details)
);
}
}
我的想法是,这些单独的标记服务都应该是某个抽象标记服务的抽象,在该抽象标记服务中将调用该服务,并根据arg类型(重载)决定要使用的正确服务。
但是,我不知道在Java OOP中这种方式是否有效。例如,仅在采用相同arg类型的情况下才重写Interface方法。
所以这是一个问题:我有3个类,所有这些类都实现了返回getTags
的方法Iterable<Tag>
。每个参数均采用不同的arg类型作为参数,并且具有从该对象返回标签的某些行为。我不想做诸如类型转换之类的丑陋事情。正确的抽象是什么?您将如何重构此代码?