Використовує новий клас System.Tuple поганий дизайн?


19

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

Я просто намагаюся оцінити, наскільки вільно я повинен використовувати цю функцію або якщо я повинен використовувати її лише в крайніх сценаріях, коли це необхідно.


+1: Відмінне запитання. Також - мені цікаво, чи на цьому зважився Андерс Хейльсберг.
Джим Г.

Відповіді:


11

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

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


Що з описом параметра XML? Не найочевидніше місце для вигляду, але краще, ніж нічого.
Іван Бубріскі

@SkippyFire - Як ти це маєш на увазі? Все , що ви отримаєте це тип T1, і T2так далі Не скажу , що вони означають.
Одед

2
Я мушу сказати: щоразу, коли я (або хтось із нашої команди) використовував кортеж як тип, я постійно посилаюсь на інші частини коду, щоб згадати, що таке .Item1, .Item2 тощо. Для всього, що не зовсім тривіально, створіть дискретні класи. Дайте собі шанс у майбутньому дізнатися, що це ви робите.
Джо

@Oded Я говорю про додавання XML-документації до методу, що приймає кортеж. Знову ж таки, не ідеально, але краще, ніж нічого, якщо ви хочете / потрібно використовувати кортежі.
Джон Бубріскі

1
@Oded Також параметр або значення, що повертається, можуть не мати значення, але ім'я методу може. Скажімо, у вас є метод, який називається GetTopTwoPercentages()a Tuple<decimal, decimal>. Це може бути досить зрозуміло.
Іван Бубріскі

8

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

Це зрозуміло:

Tuple<Float, Float> getPolarCoords();

Це вводить в оману (оскільки можна припустити декартові координати):

Tuple<Float, Float> getCoords();

І це позбавлене значення:

Tuple<Float, Float> getTuple();

Отже, загалом кажучи, ви будете оцінювати чіткість на кожному конкретному випадку та, якщо потрібно, рефактор. Якщо ви представляєте такі ж дані, як і Tupleв багатьох різних місцях, то створення класу, безумовно, є хорошою ідеєю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.