Использование нового класса System.Tuple - плохой дизайн?

19

Мне нравится концепция System.Tuple в том смысле, что она позволяет мне возвращать несколько параметров в одном вызове функции без создания экземпляра нового класса, однако это игнорирует любые хорошие методы программирования, такие как Microsoft Patterns & Practices, SOLID Principles и т. Д.

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

Кайл Баллард
источник
+1: отличный вопрос. Также - интересно, если Андерс Хейлсберг взвесил это.
Джим Г.

Ответы:

11

Проблема с использованием Tupleзаключается в том, что параметры универсального типа не передают значение.

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

Одед
источник
Как насчет описания параметров XML? Не самое очевидное место для поиска, но лучше, чем ничего.
Джон Бубриски
@SkippyFire - Как ты имеешь в виду? Все , что вы получите это тип T1, и T2т.д. Не скажу , что они означают.
Одед
2
Я должен сказать: каждый раз, когда я (или кто-то из нашей команды) использовал Tuple в качестве типа, я постоянно возвращаюсь к другим частям кода, чтобы вспомнить, что такое .Item1, .Item2 и т. Д. Для всего, что не совсем тривиально, создайте дискретные классы. Дайте себе шанс в будущем узнать, что вы делаете.
Джо
@Oded Я говорю о добавлении XML-документации в метод, принимающий кортеж. Опять же, не идеально, но лучше, чем ничего, если вы хотите / должны использовать кортежи.
Джон Бубриски
1
@Oded Кроме того, параметр или возвращаемое значение могут не передавать значение, но имя метода может. Допустим, у вас есть метод с именем, GetTopTwoPercentages()который возвращает Tuple<decimal, decimal>. Это может быть достаточно ясно.
Джон Бубриски
8

Одним из наиболее важных качеств кода является удобочитаемость. Так что спросите себя:
когда я (то есть в ком-то еще, кроме вас) смотрю на сигнатуру метода, знаю ли я, что означают соответствующие компоненты Tuple?
Например, если возвращаемая пара чисел представляет собой набор полярных координат, это ясно?

Это понятно

Tuple<Float, Float> getPolarCoords();

Это вводит в заблуждение (потому что можно принять декартовы координаты):

Tuple<Float, Float> getCoords();

И это лишено смысла:

Tuple<Float, Float> getTuple();

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

back2dos
источник