Найти тему

Чистый код. Конспект. Глава 3. Функции.

Заметки:

  1. Функция должна быть еще более компактная. Еще компактней. Максимально компактной.
  2. Желательно не делать функции больше 20 строк.
  3. Всякие if, else, while должны состоять из одной строчки и содержать вызов функции. С красивым именем это будет читаться как захватывающая история. Например:
    if (book.isNotFinished) readBook() else startNewBook()
  4. Старайтесь делать минимум вложенности. Максимум отступов — 2. По себе знаю, что это довольно сложно. Иногда, когда много логики и алгоритмов, выходит достаточно много отступов. :(
  5. Функция должна выполнять только одну операцию. Всегда.
  6. Одна операция — это когда на одном уровне абстракции (ui, алгоритмы, соединения строк, парсинг, БД — это все разные уровни).
  7. Как проверить, что функция выполняет больше одной операции? Попробовать извлечь из нее другую. Именно новую функцию, а не просто переименовать.
  8. Если функцию можно разделить на секции (объявление, инициализация, сортировка) — это больше одной операции.
  9. Код должен читаться как рассказ — сверху вниз. По мере чтения понижаем уровень абстракции.
  10. switch и длинные if — else if — else сложно сократить. Автор советует похоронить такие функции в абстрактной фабрике (https://refactoring.guru/ru/design-patterns/abstract-factory) и никому не показывать. Вот этот пункт для меня самый сложный. Я пока что не выношу switch.
  11. Команды из 10 пункта допустимы, если встречаются однократно, используются для создания полиморфных объектов и скрываются за отношениями наследования, чтобы остаться невидимыми для остальных частей системы.
  12. Содержательные имена! Глава два полностью посвящена именам. Там все описано. https://zen.yandex.ru/media/android_junior/chistyi-kod-konspekt-glava-2-soderjatelnye-imena-6064d9892a842913a70b0804
  13. В идеальном мире количество аргументов равно нулю. Функций с тремя аргументами надо избегать. Почему? Нам постоянно надо помнить о всех аргументах и читать код становится намного сложнее. Да и в тестировании покрыть тестами метод с несколькими аргументами сложно, потому что придется перебрать все доступные варианты.
  14. Флаги ужасны. Они сразу говорят, что функция выполняет минимум два действия. Не используйте их.
  15. Если функция должна принимать три и более аргументов, то подумайте над тем, чтобы упаковать их в класс. Раз эти аргументы идут в один метод, то, возможно, они вместе образуют какой-то объект.
  16. Для унарных функций обычно используется название в виде глагол и существительное: write(name) или writeField(name).
  17. Никаких скрытых эффектов, которые не очевидны из названия. Если функция называется checkPassword(), то там должен проверяться пароль. Не надо внутри функции очищать какие-нибудь базы или делать запросы на получение нового пароля. А то это будет внезапный сюрприз для разработчика, который захочет использовать метод проверки пароля.
  18. Никаких выходных аргументов. Если функция должна изменять состояние, то только состояние своего владельца, а не других объектов.
  19. Функция или что-то делет или отвечает на вопрос.
  20. Вместо кодов ошибок используйте исключения. Заодно это уменьшает вложенность.
  21. Try-catch выделяем в отдельные блоки. try { deletePage() } catch (exception) { }. Так и читать гораздо легче и сразу видно, что происходит в try, а что в catch.
  22. Раньше использовали такую вещь, как магнит зависимости — класс с кодами ошибки. Но при добавлении нового кода приходится перекомпилировать проект, поэтому исключения намного лучше. Я впервые услышала про такое. Но все равно интересно. :)
  23. Не дублируйте.
  24. Сначала пишем много и неуклюже — потом уменьшаем. Совет на все времена. У меня прям сегодня такое было, когда я изменила кучу классов, прокидывала флаги и хардкодила. Потом, когда разобралась, что и как работает, — потихоньку удаляла флаги, переносила и уменьшала код. В итоге получилась красота.