2010-12-10 5 views
1

Я использую Java 6.Каковы плюсы и минусы вложенных шаблонов против новых интерфейсов?

Иногда я нахожу себя чем-то вроде этого.

Map<String,List<Integer>> myMap; 

Это всего лишь пример. Это может пойти глубже, чем это.

Каковы преимущества и недостатки создания нового интерфейса и выполнение этого вместо этого?

Map<String,NewInterface> myMap; 

Единственное, что я вижу, это немного более читаемо. Что-нибудь еще с точки зрения производительности, модульности, связи, или вы назовете его?

ответ

2

В вашем примере, если у вас есть логические операции, которые сложны вокруг списка компонентов, вы можете обернуть что-то вокруг него, просто чтобы увеличить модульность и упростить тестирование.

Но если то, что вы делаете, просто, вам может и не понадобиться.

Вы указываете, однако, что существуют более сложные случаи, поэтому Id говорит абстрактное.

Вы указываете на другое преимущество абстрагирования внеуровневой структуры.

Читаемость может быть ключевым в крупных проектах программного обеспечения. Он сохраняет код в чистоте и упрощает его обслуживание. Его трудно понять намерение за огромными подструктурами. Вы не хотите, чтобы кто-то, кто должен поддерживать это расходы полдня, выясняя, что вы делаете, когда код может быть самостоятельно документирован.

0

Для одного, List<Integer>, очевидно, не будет реализовывать ваш новый интерфейс. Вероятно, у вас есть много мест в вашем коде, где переменные вводятся как List<Integer>. Простой Map<String, List<Integer>> мог бы разместить эти списки сразу, но ваша версия интерфейса требует изменения всех этих мест в вашем коде, чтобы вместо этого создать новую пользовательскую версию List<Integer>, которая также реализует ваш пользовательский интерфейс.

Это только проблема, потому что вы выбрали в качестве примера класс JDK, который нельзя изменить. Если вы имеете дело со своими собственными классами, которые вы можете свободно изменять, то абстрагирование интерфейсов - отличный подход. Полученный код часто намного легче читать, поскольку он может помочь свести к минимуму использование подстановочных знаков generics.

0

Даже для одной коллекции вы должны смотреть на введение абстракции для нее. Нет ничего удивительного в том, что, когда вы используете программное обеспечение OO, вам нужны новые абстракции.

Против введения абстракций он добавляет дополнительный код. По крайней мере, в краткосрочной перспективе.

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

Средние корпоративные программисты избегают чего-либо ориентированного на объект.

0

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

public class Graph<T> { 

    private Set<T> nodes; 

    private Map<T, List<T>> edges; 

} 

Если бы я сделал интерфейс

public interface NodeList implements List<T> { 

} 

Это уменьшило бы читаемость и, возможно, позволит ошибки, не может гарантировать, что NodeList в

private Map<T, NodeList> edges; 

был построен с тем же значением T как Карта. Например:

edges = new Map<Cities, NodeList>(new NodeList<States>()); 

который, очевидно, не является тем, что предназначалось.

+0

Ваш интерфейс NodeList не имеет параметра типа и поэтому не может быть создан как NodeList . Если у него был параметр типа, подпись ребер должна привязать его к типу параметра T его класса Graph, что делает несоответствующую конструкцию ошибкой времени компиляции. –

0

Вы должны почти всегда программировать до самой общей абстракции, которая дает вам то, что вам нужно. Если содержимое не нужно заказывать, примите Map<String, ? extends Collection<Integer>. Если вам не нужно знать размер, элементы поиска и т. Д., Но просто нужно иметь возможность перебирать элементы, используйте Map<String, ? extends Iterable<Integer>>.

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

Смежные вопросы