У меня есть рабочий код, который я реорганизую, чтобы сделать его более читабельным / следуйте соглашениям 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.Метод интерфейса переопределяется, только если он принимает, например, те же типы аргументов.
Итак, вот вопрос: у меня есть 3 класса, которые все реализуют метод getTags
, который возвращает Iterable<Tag>
.Каждый принимает в качестве параметра свой тип аргумента и имеет некоторое поведение для возврата тегов из этого объекта.Я не хочу делать что-то уродливое, например, приведение типов и т. Д. Какая правильная абстракция? Как бы вы реорганизовали этот код?