Post image

Early return or Single return point. Вот в чем вопрос.

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

Вчера наткнулся на статью в которой, в очередной раз, осуждался подход раннего выхода из функции. По этому хочу обсудить с вами плюсы и минусы подходов `early return', 'single return' и узнать ваше мнение.

Немного вводных данных: есть некий метод принимающий аргумент, делает некую работу и возвращает результат. Для простоты в примерах возвращаемое значение имеет тип Boolean, но это не важно! :)

Early return

Для начала разберем критикуемый многими ранний выход. При данном подходе метод стремиться завершиться как только получит необходимый результат и код метода не продолжает выполнение до конца его тела. В early return подходе есть огромный плюс: мелкие методы становятся читабельнее. С помощью раннего выхода мы избавляемся от вложенных логических цепочек if, else. Но есть и свои минус: если метод большой, трудно найти ранние точки выхода с первого взгляда, а если читать метод с конца, операторы return расположенные выше можно упустить из виду.

Single return point

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

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

И очень важный момент: если у языка нету деструкторов, то single return point уменьшает количество мест где необходима очистка памяти. К тому же, Некоторые языки требуют единственную точку выхода (например, Pascal и Eiffel).

Но и у этого подхода есть свой жирный минус: цепочки if, else с бесконечным количеством ступенчатых скобок.

Где же правда?

Лично я при разработке стараюсь сократить использования оператора return к минимуму. Разбиваю большие и громоздкие методы на более мелкие и понятные с первого взгляда. Но если метод early return улучшает читабельность кода, я его использую. Порой даже более его "агрессивный" вариант.


Какими способами пользуетесь вы? Как улучшаете свой код и что вообще думаете по этой теме? Поделитесь в комментариях, очень интересно узнать.