Проблема при определении типа возврата метода, который возвращает SortedSet - PullRequest
1 голос
/ 22 мая 2010

Я должен создать класс, который должен быть контейнером для интервала значений (как в математике).Я уже решил, что я буду использовать внутри SortedSet.

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

  1. SortedSet getSortedElements(); Я внутренне использую SortedSet, поэтому я должен вернуть этот тип.Я должен указать это намерение в имени метода.
  2. SortedSet getElements(); Я внутренне использую SortedSet, но нет смысла указывать это в имени метода (я не вижу большой точки в этомone).
  3. Set getElements(); Я должен стараться всегда возвращать самый простой тип, поэтому я возвращаю Set.По договору и определению метода люди уже знают, что все элементы в порядке.
  4. Set getSortedElements(); Для типа возврата метода, такого же, как указано выше.Что касается имени метода, вы четко указываете, что этот метод будет возвращать: набор отсортированных элементов.

Я склонен использовать 4., но остальные также выглядят хорошо,Есть ли явный победитель?Почему?

Ответы [ 3 ]

4 голосов
/ 22 мая 2010

SortedSet - это интерфейс с договором, по которому элементы сортируются. Он также предоставляет некоторые методы, недоступные в Set (например, first()). Если вы должны вернуть объект, который подчиняется этому контракту (например, возвращает упорядоченные значения в iterator ()), то вы должны вернуть Sorted Set. Если нет, вы должны вернуть Set (или Collection).

Вы выясняете, что возвращать, исходя из того, как вы хотите, чтобы результат был использован. Сначала подумайте, что означает «получает упорядоченный набор со всеми элементами в интервале», а затем подумайте о реализации.

Кстати код

private SortedSet sortedSet = new SortedSet();

недопустимо, потому что SortedSet является интерфейсом. Поскольку это домашнее задание, я предоставлю вам понять, почему это проблема.

1 голос
/ 22 мая 2010

Я думаю, что возвращение Set - это верный путь к удобству сопровождения, но мне не нравятся имена методов. Почему бы не что-то более наглядное, например:

Set getIntervalValues();

или что-то там около.

0 голосов
/ 26 августа 2014

Если метод должен возвращать SortedSet, это должен быть тип возврата метода. Вызывающие абоненты могут присваивать результат SortedSet или Set, в зависимости от того, заботятся ли они о порядке или нет. если ваш метод javadoc или name подразумевает, что вы возвращаете отсортированный набор, но типом возвращаемого вами метода является только Set, это все равно, что сказать своему сантехнику, что вы заплатите ему 100 долларов за его услуги, а затем написать в контракте, что вы заплатите ему " не менее 50 долларов США.

Возвращая SortedSet
1) вы обещаете своим клиентам, что вы и будете возвращать отсортированный набор. вы не можете изменить этот контракт (установить), не нарушая код вашего клиента (не будет компилироваться).
Если вместо этого тип возвращаемого вами метода установлен, то не имеет значения, что вы обещаете своим клиентам / абонентам в своем javadoc или в имени метода, вы все равно можете изменить реализацию в любое время, чтобы вернуть несортированный набор. Если тип возвращаемого значения установлен, и вызывающая сторона хочет возможности SortedSet, они могут привести возвращенное значение к SortedSet (некрасиво), но затем однажды, если вы решите, что просто собираетесь вернуть несортированный (все еще) набор, ваш код вызывающих программ будет прерываться во время выполнения (очень рискованно для ваших клиентов. представьте, что код ваших клиентов работает нормально, а затем они обновляют предоставленную вами библиотеку ...).
2) звонящим может понадобиться отсортированный набор вашего результата. Если вы возвращаете Set, у них может возникнуть соблазн пересортировать ваш результат (хотите ли вы, чтобы он читал ваш Javadoc?). Если вы возвращаете SortedSet, они знают, что им не нужно повторно сортировать.

...