Чистый код

Чистый код - функции

Чистые функции - это первая линия организации в любой программе.

Привет, программисты, сегодня я научу вас чему-то, что поможет вам и вашим коллегам. Эта статья является второй из серии, состоящей из двух частей, первую часть вы можете найти здесь. Давайте начнем и узнаем, как кодировать чистые функции! Вот мои советы:

Держите это маленьким

Первое правило функции - они должны быть небольшими. Насколько они должны быть маленькими? Для этого не существует точного и быстрого числа. Но, как предлагает Дядя Боб, он вряд ли когда-либо будет содержать 20 строк.

Сделай одно дело

Функции должны делать одно, и они должны делать это хорошо. Функция должна выполнять только одну ответственность. Как мы можем понять, выполняет ли функция более одной ответственности? Если функция выполняет шаги, которые всего на один шаг ниже указанного имени функции, то функция выполняет одно действие. В противном случае функция требует некоторого рефакторинга.

Правило понижения

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

Заявление об избежании переключения

Заявление о переключении некрасиво. Даже оператор switch только с двумя регистрами длиннее 10 строк. Более того, корпуса Switch по своей конструкции выполняют N функций. Их следует избегать как можно дольше. Но есть случаи, когда мы не можем. В этом случае закопайте корпус переключателя в класс более низкого уровня и никогда не повторяйте этого.

Используйте описательные имена

Опять же, именование - это самое необходимое для написания чистого кода. Разработчики будут читать ваш код по именам переменных, функций, классов, методов, интерфейсов. Название должно походить на историю, а не на что-то загадочное. Длинное описательное имя лучше загадочного. Потратьте время на выбор имени, иногда даже больше, чем на написание функции. По умолчанию имена функций должны быть глаголами.

Аргументы функции

Идеальное количество аргументов для функции - Ноль. Далее идет Один, а за ним - Два. По возможности следует избегать трех аргументов. Больше трех недопустимо. В большинстве случаев их можно выделить в класс.

Избегайте выходных аргументов

По привычке мы привыкли к мысли, что функция будет принимать какие-то входы и возвращать выходы. Итак, не вызывайте функции по выходным аргументам. Вместо этого используйте возвращаемое значение для замены аргумента

Распространенные формы функций с одним аргументом

Есть три распространенные формы функции с одним аргументом:

  1. Задать вопрос: функция может задавать вопросы о входном аргументе. file_exists = file_exists('myfile') - эта простая функция проверяет, существует ли файл с именем myfile, и возвращает логическое значение.
  2. Преобразовать и вернуть: функция может преобразовывать входной аргумент и возвращать его.
  3. Событие: функция может изменять состояние программы на значение входного аргумента.

Старайтесь избегать любой функции с одним аргументом, которая не соответствует приведенному выше шаблону. Скорее всего, вы делаете что-то не так или у вас родилась другая закономерность. Но кто хочет новый паттерн, у нас уже есть много паттернов для изучения 🤯

Избегайте аргументов, связанных с флагом

Избегайте аргументов флага. По замыслу они делают больше чем одно дело. Если флаг истинен, то запускаем блок. Иначе другое. Разделите функцию на две разные функции и вызовите их.

Две функции аргумента

Две функции аргумента труднее интерпретировать, чем функции с одним аргументом. Но бывают случаи, когда мы не можем игнорировать две функции-аргументы. Одним из примеров может быть декартова функция точки. По своему замыслу они должны иметь два аргумента (x, y). Даже мы будем удивлены, увидев декартову точку с одним аргументом.

Опять же, трудно интерпретировать порядок в двух функциях аргумента. Вроде assert(expected, actual) - каждый раз мне приходилось проверять, будет ли ожидаться первый аргумент или второй.

Две функции-аргументы - не зло. Просто используйте их, когда это необходимо и аргументы имеют естественную связность и порядок.

Три функции аргумента

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

Объекты аргумента

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

Списки аргументов

Иногда функция может принимать переменное количество аргументов. Рассмотрим print функцию Python. Для печати может потребоваться переменное количество аргументов. Но даже в этом случае следует соблюдать все правила, изложенные ранее.

Без побочных эффектов

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

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

Разделение командных запросов

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

Предпочитать исключения для возврата кодов ошибок

Возврат кодов ошибок является явным нарушением нашего последнего правила - разделения запросов команд. Вместо этого мы должны использовать try-catch и throw для обработки ошибок.

Извлечь Try Catch

Блок try catch должен быть извлечен на более низкий уровень функций, чем на более высокий уровень.

Не повторяйся (СУХОЙ)

Никогда не повторяйте один и тот же код. Если вам нужно где-то изменить логику, вам нужно найти все места и изменить логику везде.

Есть хорошее правило поддерживать СУХОЙ -

  1. Если это первый раз, закодируйте его
  2. Если это второй раз, скопируйте его
  3. Если это третий раз, извлеките его (для работы или класса)

Заключение

Необходимо поддерживать множество правил, и трудно думать о тех, которые реализуют бизнес-логику. Никто не может сделать все правильно с первого раза. Функции похожи на написание рассказа. Есть первый черновик, второй черновик… n-ый черновик и, наконец, Окончательная версия. Так что не бойтесь писать запутанные и длинные функции. Когда он работает (то есть проходит все тесты), доработайте его и рефакторинг, пока он не станет похож на книгу Гарри Поттер.

Не стесняйтесь размещать любые комментарии или предложения.

"I'M STILL LEARNING." - MICHELANGELO

Первоначально опубликовано на https://dipta007.com 13 июня 2020 г.