комбинированные общие границы - это анти-паттерн?

StackOverflow https://stackoverflow.com/questions/320222

Вопрос

в качестве продолжения моего предыдущего вопроса Наличие функции с комбинированными общими границами, такими как:

<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) 

Во всех случаях вам нужно что-то знать об аргументе, и я не думаю, что в первых случаях требуется больше знаний, чем в других, поскольку он имеет два идентификатора.

Анти-паттерн кастинг.

Тем не менее, сложная работа дженериков может сбить с толку непрофессионалов-программистов. Использование таких типов и методов должно быть намного проще, чем их реализация.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top