agolddog Ответов: 2

Насколько меня должны беспокоить внешние переменные?


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

Наш код усеян такими методами, как этот:

public int fetchStuff(int param1, int param2, out int returnA, out string returnB...)


Где этот метод выполняет какие-то вычисления на основе параметров 1 & 2 (обычно запрос БД, но это не обязательно).

Речь идет не о верблюжьей оболочке имени метода. Хотя это неверно (а также свидетельствует о качестве кода, создаваемого людьми, которые делают это-они не могут получить маленькие вещи правильно, как они могут получить большие вещи правильно?), я ставлю под сомнение использование переменных out. Это кажется таким не-ОО. Возьмите некоторые входные данные и выдайте результат или создайте исключение.

Кроме того, использование переменных out означает, что сигнатура должна изменяться при добавлении новых данных к результатам. Конечно, мы можем использовать перегрузки, чтобы старая сигнатура вызывала новый метод и выбрасывала новые данные, чтобы уменьшить влияние на потребителей, которые не заботятся о новых данных, но это кажется неуклюжим. (В отличие от возврата объекта, где мы можем добавить новую информацию, а потребители могут использовать ее или нет, по своему усмотрению, но подписи не меняются).

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

Что я уже пробовал:

В зависимости от ситуации и временных ограничений я обычно рефакторирую их, чтобы вернуть объект StuffContainer, а затем рефакторирую вызывающие объекты, чтобы ссылаться на него. Просто не уверен, насколько это необходимо.

(Необходимо не то слово; очевидно, что нет необходимость сделать это. Хотя я не могу придумать правильное слово-не желательно, так как это явно так.)

F-ES Sitecore

Если функция возвращает сложные данные, то она должна возвращать выделенный объект с соответствующими свойствами.

agolddog

Вау, спасибо за быстрые ответы. Но, как я уже сказал, это не совсем вопрос программирования; конечно, мы могли бы использовать кортежи или выделенный объект, как упоминает F_ES Sitecore.

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

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

2 Ответов

Рейтинг:
0

RickZeeland

Если вас беспокоят внешние переменные, вы можете использовать вместо них кортежи.
Увидеть это CodeProject статьи: C# 4 - Кортежи[^]


Рейтинг:
0

OriginalGriff

Ну, вы можете вернуть тройной кортеж (код MS был написан до того, как кортежи были добавлены в спецификацию C#), но это довольно тяжело и может потребовать дополнительного кода каждый раз, когда вы вызываете метод:

private (int first, int second, string str) FetchStuff(int param1, int param2)
    {
    ...
    return (1, 2, "3" );
    }

int intResult;
string stringResult;
...
var result = FetchStuff(1, 2);
intResult = result.first;
stringResult = result.str;
Однако, когда вы привыкнете к этому, станет немного более очевидно, что происходит.