комбинированные общие границы - это анти-паттерн?
-
11-07-2019 - |
Вопрос
в качестве продолжения моего предыдущего вопроса Наличие функции с комбинированными общими границами, такими как:
<T extends Foo & Bar> void doStuff(T argument) {
//do stuff wich should only be done if arguments is both foo and bar
}
Поскольку он не может быть преобразован из неопределенного объекта, вам необходимо знать некоторый объект, который фактически реализует эти интерфейсы. мне кажется, что необходимость знать конкретный тип аргумента объекта для передачи в doStuff (T a)
является нарушением закона Деметера.
Функция не определяет необходимость знать фактический класс (может быть много разных), и я действительно не хочу знать это, так как знание этого класса увеличивает зависимость в моей кодовой базе.
использует эти границы как анти-паттерн? и если да, то как лучше избегать этого?
сценарий случая включал один интерфейс, указывающий, что объект является постоянным, а другой указанный объект имеет связанную сущность. функция doStuff (T a)
в этом случае сохранила связанный объект, когда он был сохранен. однако непостоянные сущности также могут иметь связанную сущность, но не должны обрабатываться функцией doStuff (T a)
Нет правильного решения
Другие советы
Я бы не рассматривал комбинированные родовые границы как антишаблон. По крайней мере, у меня есть некоторые использования для них в моем коде. Например, следующий пример кода находит самый большой экземпляр Number в коллекции с использованием compareTo из интерфейса Comparable:
<T extends Number & Comparable<T>> T max(Collection<T> numbers)
мне кажется, что необходимость знать конкретный тип аргумента объекта для передачи в doStuff (T a) является нарушением закона Деметера
Я не согласен. Я не понимаю, как
T<? extends Foo & Bar> void doStuff(T argument)
требуется больше знаний об аргументах, чтобы передать их
T<? extends Foo> void doStuff(T argument)
Или даже больше, чем просто
void doStuff(T argument)
Во всех случаях вам нужно что-то знать об аргументе, и я не думаю, что в первых случаях требуется больше знаний, чем в других, поскольку он имеет два идентификатора.
Анти-паттерн кастинг.
Тем не менее, сложная работа дженериков может сбить с толку непрофессионалов-программистов. Использование таких типов и методов должно быть намного проще, чем их реализация.