комбинированные общие границы - это анти-паттерн? - PullRequest
2 голосов
/ 26 ноября 2008

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

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

Ответы [ 3 ]

3 голосов
/ 26 ноября 2008

Я бы не рассматривал комбинированные родовые границы как антишаблон. По крайней мере, у меня есть некоторые использования для них в моем коде. Например, следующий пример кода находит самый большой экземпляр Number в коллекции с использованием compareTo из интерфейса Comparable:

<T extends Number & Comparable<T>> T max(Collection<T> numbers)
1 голос
/ 26 ноября 2008

мне кажется, что необходимость знать конкретный тип аргумента объекта для передачи в doStuff (T a) является нарушением закона Деметера

Я не согласен. Я не понимаю, как

T<? extends Foo & Bar> void doStuff(T argument) 

требуется больше знаний для аргументации, чем

T<? extends Foo> void doStuff(T argument) 

Или даже больше, чем просто

void doStuff(T argument) 

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

0 голосов
/ 26 ноября 2008

Анти-шаблон литья.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...