Метод, который делает условный возврат метода, называя его?

Хорошо это могло бы быть небольшим количеством взлома, но терпеть меня :) Фон - то, что я устал от методов это, как которое некоторый оператор "if" к этому портит изрезывание для целого метода:

public SomeClass DoStuff(string inputStr)
{
  SomeClass result =null;
  if (IsOpenFilter(inputStr))
  {
    ....
  }

  return result;
}

Таким образом, я думал, не будет это быть аккуратным, если я мог бы сделать что-то вроде этого вместо этого:

public SomeClass DoStuff(string inputStr)
{
  Require(IsOpenFilter(inputStr),null);


  ....

  return result;
}

Этот случай мог бы быть охвачен контрактами кода в некоторой форме, раз так исправьте меня :)

Идея состоит в том, что, если бы оператор не делает, оценивает к истинному, он возвратил бы пустой указатель. Если бы не было типа возврата для метода, то это просто было бы: Потребуйте (IsOpenFilter (inputStr));

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

Другой вопрос, действительно ли это - хорошая идея? Это немного странно к monkeypatch язык как это, но я хотел бы способ, которым читает код. Я был бы даже инструментом для очистки, если это могло бы быть помещено в атрибут выше метода: [Потребуйте (IsOpenFilter (inputStr))]

5
задан Homde 3 April 2010 в 08:50
поделиться

2 ответа

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

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

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

return? expression;

Это вернет вычисленное значение выражения , если оно не равно нулю; вы можете использовать его для типов, не допускающих значения NULL, например:

int Foo()
{
    return? Bar(); // Where Bar() has a return type of int?
    ...
}

В основном это будет оператор return, эквивалентный оператору объединения NULL.

Это не поможет в вашем случае, заметьте - вы хотите, чтобы возвращал null раньше ...

7
ответ дан 13 December 2019 в 22:04
поделиться

А как насчет того, чтобы переписать ваш первый пример следующим образом:

public SomeClass DoStuff(string inputStr) 
{ 
  if (!IsOpenFilter(inputStr)) 
      return null;

  SomeClass result =null; 

  // Some code .... 

  return result; 
} 

Похоже, вы пытаетесь придерживаться старого соглашения об одной точке возврата в каждой функции. Короче говоря: получение одного возврата - это наследие языков с явной обработкой ресурсов. Длинная история доступна в некоторых старых сообщениях SO:

3
ответ дан 13 December 2019 в 22:04
поделиться
Другие вопросы по тегам:

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