Почему кортежи использования вместо объектов?

Я думаю, что вы можете использовать следующий запрос.

@Query (value = "{'users.id':? 0, 'products.id':? 1}") Список findByproductsByUserIdAndproductId (String userId, String productId);

44
задан Mogsdad 27 September 2015 в 01:54
поделиться

10 ответов

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

Второй из всех, они универсальны. Например, в C++ станд.:: отобразитесь использует станд.:: пара ключа и значения. Таким образом ЛЮБАЯ пара может использоваться, вместо того, чтобы иметь необходимость сделать некоторый класс обертки с методами доступа для каждой перестановки двух типов.

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

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

36
ответ дан rlbond 26 November 2019 в 22:06
поделиться

Пример кода имеет несколько различных запахов:

  • Изобретение велосипед

Уже существует кортеж, доступный в платформе; KeyValuePair структура. Это используется Dictionary класс для хранения пар но можно использовать его где угодно, это соответствует. (Не говорящий, что это соответствует в этом случае...),

  • Создание квадратного колеса

Если у Вас есть список пар, лучше использовать KeyValuePair структура, чем класс с той же целью, поскольку это приводит к меньшему количеству выделений памяти.

  • Сокрытие намерения

Класс со свойствами ясно показывает то, что значения означают, в то время как a Pair<int,int> класс ничего не говорит Вам о том, что представляют значения (только, что они, вероятно, связаны так или иначе). Для создания кода обоснованно сам объяснительным со списком как этот, необходимо было бы дать список очень desciptive имя, как productIdAndQuantityPairs...

10
ответ дан Guffa 26 November 2019 в 22:06
поделиться

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

List<Pair<Integer, Integer>> products_weak = blah1();
List<Pair<Product, Integer>> products_strong = blah2();

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


Так как это сказан, кортежи чрезвычайно полезны при использовании их правильный:

  • Кортежи существуют для собирания в группу специальных значений. Они, конечно, лучше, чем создание чрезмерных чисел классов обертки.
  • Полезная альтернатива/касательно параметрам, когда необходимо возвратить больше чем одно значение от функции.

Однако кортежи в C# делают мою глазную воду. Много языков как OCaml, Python, Haskell, F#, и так далее имеют специальный, краткий синтаксис для определения кортежей. Например, в F#, модуль Карты определяет конструктора следующим образом:

val of_list : ('key * 'a) list -> Map<'key,'a>

Я могу создать экземпляр использования карты:

(* val values : (int * string) list *)
let values = 
    [1, "US";
     2, "Canada";
     3, "UK";
     4, "Australia";
     5, "Slovenia"]

(* val dict : Map<int, string> *)
let dict = Map.of_list values

Код equilvalent в C# является ridicuous:

var values = new Tuple<int, string>[] {
     new Tuple<int, string>(1, "US"),
     new Tuple<int, string>(2, "Canada"),
     new Tuple<int, string>(3, "UK"),
     new Tuple<int, string>(4, "Australia"),
     new Tuple<int, string>(5, "Slovenia")
     }

 var dict = new Dictionary<int, string>(values);

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

8
ответ дан Juliet 26 November 2019 в 22:06
поделиться

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

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

16
ответ дан Aaron Maenpaa 26 November 2019 в 22:06
поделиться

Это - просто код опытного качества, который, вероятно, был разбит вместе и никогда не был пересмотрен. Не фиксация его является просто ленью.

Реальное использование для кортежей для универсальной функциональности, которая действительно не заботится, каковы составные части, но просто работает на уровне кортежа.

2
ответ дан Eclipse 26 November 2019 в 22:06
поделиться

Очевидным примером является координатная пара (или трижды). Маркировки не важны; использование X и Y (и Z) является просто конвенцией. Создание их, универсальная форма проясняет, что их можно рассматривать таким же образом.

1
ответ дан Daniel Earwicker 26 November 2019 в 22:06
поделиться

Это - повторное использование кода. Вместо того, чтобы писать еще один Класс С Точно Той же Структурой Как Последние 5 Подобных Кортежу Классов Мы Сделанный, Вы делаете... класс Кортежа и использование это каждый раз, когда Вам нужен кортеж.

Если бы единственное значение класса состоит в том, чтобы "сохранить пару значений", затем я сказал бы, что использование кортежей является очевидной идеей. Я сказал бы, что это был запах кода (так же, поскольку я ненавижу термин), если Вы начали реализовывать несколько идентичных классов именно так, что Вы могли переименовать эти двух участников.

5
ответ дан jalf 26 November 2019 в 22:06
поделиться

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

Языки функционального программирования как Haskell, например, не имеют классов вообще.

1
ответ дан Georg Schölly 26 November 2019 в 22:06
поделиться

Если Вы делаете, Schwartzian преобразовывают к виду конкретным ключом (который является дорогим для вычислений неоднократно), или что-то как этот, класс, кажется, немного излишества:

val transformed = data map {x => (x.expensiveOperation, x)}
val sortedTransformed = transformed sort {(x, y) => x._1 < y._1}
val sorted = sortedTransformed map {case (_, x) => x}

Наличие a class DataAndKey или независимо от того, что кажется немного лишним здесь.

Вашим примером не был хороший пример кортежа, тем не менее, я соглашаюсь.

0
ответ дан Andy Morris 26 November 2019 в 22:06
поделиться

В Scala есть типы с кортежными значениями, от двухкортежных (пар) до кортежей с более чем 20 элементами. См. Первые шаги к Scala (шаг 9):

val pair = (99, "Luftballons")
println(pair._1)
println(pair._2)

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

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

2
ответ дан 26 November 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: