2008-11-26 6 views
2

как следить за мой previous question Имея функцию с комбинированными общими границами, такие как:объединяет общие рамки анти-шаблона?

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

+0

Этот вопрос, похоже, связан с вопросом [приведение к комбинированному родовому] (http://stackoverflow.com/questions/318208/cast-to-combined-generic) (тем же автором). – 2008-11-26 11:26:20

+0

это так, но я подумал, что было бы лучше для того, чтобы сделать этот вопрос другим вопросом. – pvgoddijn 2008-11-26 13:09:25

+0

Ну, вы знали все об этом, очевидно, я просто думал обо всех остальных, кто мог бы получить больше контекста :) – 2008-11-26 13:13:20

ответ

3

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

<T extends Number & Comparable<T>> T max(Collection<T> numbers) 
1

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

Я не согласен. Я не вижу, как

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

требует больше знаний аргумента передать то

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

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

void doStuff(T argument) 

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

0

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

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