Я задаюсь вопросом, было ли какое-либо исследование (и случайно и устойчиво) на пригодности для обслуживания проектов, которые используют "защитную парадигму" оператора по сравнению с "единственной функциональной точкой выхода" парадигма?
Пример оператора Guard (в C#):
string GetSomeString()
{
if(necessaryConditionFails) { return null; }
if(!FunctionWithBoolReturn(someAttribute)) { return null; }
//all necessary conditions have been met
//do regular processing...
return finalStringValue;
}
единственный функциональный пример точки выхода (в C#):
string GetSomeString()
{
string valueToReturn = null;
if(necessaryConditionPasses && FunctionWithBoolReturn(someAttribute))
{
//all necessary conditions have been met
//do regular processing...
valueToReturn = finalStringValue;
}
return valueToReturn;
}
Я знаю достоинства, и сбои обоих были обсуждены бесконечно на Так, но я ищу фактическое исследование как удобный в сопровождении каждая парадигма is*. Это может быть неизвестно, но я фигурировал, там ли информация, кто-то на ТАК знал бы, где это было. Мои веб-поиски не были успешны до сих пор.
** Я также знаю, что многие программисты (включая меня) используют оба принципа всюду по своему коду, в зависимости от ситуации. Я просто надеюсь обнаружить, который имеет успешный опыт работы большей пригодности для обслуживания для использования в качестве предпочтительной парадигмы.*
У принудительного использования единой точки выхода есть некоторые проблемы.
Во-первых, это может привести к сложным конструкциям. Представьте функцию, в которой вам нужно открыть файл, прочитать строку, преобразовать строку в число и вернуть это число или ноль, если что-то идет не так. С единственной точкой выхода вы в конечном итоге используете множество вложенных if (если файл существует, откройте его, если открытие завершится успешно, прочтите строку, если чтение успешно преобразует значение в целое число), что делает ваш код не читается. Некоторые из них можно решить, поставив метку в конце функции и используя goto (нам приходилось использовать это в прошлом, поскольку мы также использовали единую точку выхода и предпочтительную читаемость), но это не идеал.
Во-вторых, если вы используете исключения, вы вынуждены перехватывать все, если вам снова нужна единая точка выхода.
Лично я предпочитаю ставить множество проверок (и утверждений) в начале и во время выполнения функции и выходить из функции при первых признаках проблемы.