Хорошо это могло бы быть небольшим количеством взлома, но терпеть меня :) Фон - то, что я устал от методов это, как которое некоторый оператор "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))]
Я согласен с Андерсом: поменять условия и вернуться пораньше. «Единая точка возврата» была полезна, когда вам нужно было явно выполнить кучу очистки ресурсов в этой точке возврата; с блоками finally
, с использованием операторов
и сборкой мусора, это даже больше не является полезным руководством, IMO. Каждый раз, когда вы обнаруживаете, что делаете что-то только , чтобы получить единственную точку возврата, подумайте, действительно ли это делает код более читабельным.
Я почти всегда нахожу, что если в какой-то момент кода я знаю возвращаемое значение и нет других действий, которые я хочу предпринять в рамках метода, лучше всего вернуться немедленно. Заставлять читателей просматривать остальную часть метода на случай , что есть другое действие, не является ни элегантным, ни полезным, IMO.
Я думаю, что это хорошо, что метод не может указать, что он должен вызвать возвращение вызывающего объекта - эта способность звучит как кошмар удобочитаемости. Сказав это, я рассмотрел новый вид оператора условного возврата:
return? expression;
Это вернет вычисленное значение выражения
, если оно не равно нулю; вы можете использовать его для типов, не допускающих значения NULL, например:
int Foo()
{
return? Bar(); // Where Bar() has a return type of int?
...
}
В основном это будет оператор return, эквивалентный оператору объединения NULL.
Это не поможет в вашем случае, заметьте - вы хотите, чтобы возвращал null раньше ...
А как насчет того, чтобы переписать ваш первый пример следующим образом:
public SomeClass DoStuff(string inputStr)
{
if (!IsOpenFilter(inputStr))
return null;
SomeClass result =null;
// Some code ....
return result;
}
Похоже, вы пытаетесь придерживаться старого соглашения об одной точке возврата в каждой функции. Короче говоря: получение одного возврата - это наследие языков с явной обработкой ресурсов. Длинная история доступна в некоторых старых сообщениях SO: