Подтвердить что ты не робот

Что такое плохая практика при использовании параметров?

Существуют ли какие-либо принципы, которые следует учитывать при использовании параметров? Или я могу взглянуть на них как на хороший способ, чтобы метод возвращал несколько значений?

Что говорили разработчики языка, когда они указывали параметр out?

Редактировать после некоторой мысли:

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

4b9b3361

Ответ 1

Лично я не слишком увлекаюсь параметрами out за пределами установленного соглашения TryParse. Я предпочитаю возвращать экземпляр определенного типа, который инкапсулирует различные параметры, поскольку он делает код намного легче читать imo.

Если вы не хотите определять конкретные типы для этого, вы можете использовать тип Tuple в будущей платформе .NET. Кортежи в основном представляют собой набор значений, завернутых в тип. Они широко используются в, например, F #.

Ответ 2

Использование параметров вообще - это, как правило, плохая практика. Обычно это указывает метод, который выполняет более чем одну четко определенную вещь. Единственный раз, когда я рекомендую использовать их, - это сценарии Interop, где они иногда необходимы из-за подписи API.

Ответ 3

В инструментах проектирования классов специально говорится "Избегайте параметров" , с длинным обсуждением для обоснования.

Если нет веской причины использовать параметр out для метода, обычно лучше сделать собственный класс или структуру для хранения ваших результатов. Использование параметров out уменьшает удобство использования API.

Ответ 4

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

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

Ответ 5

Я использую параметры, когда пишу статические методы TryParse на своих классах. Просто чтобы синхронизировать с CLR.

Кроме того, вероятно, это лучшая идея вернуть класс, который имеет то, что вам нужно.

Ответ 6

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

why-are-out-parameters-in-net-a-bad-idea содержит дополнительную информацию.

Ответ 7

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

Ответ 8

Только то же, что и возвращаемые значения - т.е. будьте осторожны с тем, что вызываемый класс сохранит и будет использовать позже. В целом, я предпочитаю объект-обертку; делает код вызова более читабельным.

Ответ 9

Я часто использую типы с нулевым значением при возврате типов значений плюс показатель успеха, а не возврат bool и использование параметра out для типа значения. Я даже обертываю метод TryParse, чтобы он возвращал значение nullable.

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

Почти всегда лучше создать пользовательский класс/структуру, использовать кортежи или типы с нулевым значением.

Ответ 10

Есть две ситуации, когда я вообще не вижу проблемы при использовании параметров out, и эта ситуация чаще всего происходит друг с другом:

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

Комментарии к обоснованию:

  • Иногда у вас могут быть операции, которые изменяют более одного состояния, поэтому вы можете работать в группе объектов, принадлежащих одному процессу, только с одним вызовом функции (может быть более семантически значимым);
  • Поскольку переменные внутри класса должны иметь высокую степень сцепления, таким образом, высокая связь, я считаю, что "не больно" иметь методы с использованием параметров out. Это абсолютно противоположное для публичных функций, которые вы ожидаете найти в API.
  • В С# параметры вывода, похоже, много показывают код, полученный из более процедурных API, перенесенных в OO. Наилучшим примером, который я могу найти, являются численные и научные подпрограммы (alglib, AForge и т.д.). Это усиливает мою мысль о том, что для внутренних деталей реализации при использовании out следует прибегнуть к помощи, которая может быть очень процедурной в зависимости от проблемной области.

В качестве примера семантически "атомной" операции, которая изменяет две связанные, но независимые переменные, здесь приведен некоторый код Python и как я портировал его на С# (в частном методе):

Python:

p1, p2 = FindClosestPair(p, listOfValues)

С#:

Point3D p1, p2;
FindClosestPair(p, listOfValues, out p1, out p2);

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