В преддверии старта курса «Разработчик Golang» подготовили перевод небольшой полезной заметки.




Десять технических рекомендаций для написания простого, читаемого и удобного в обслуживании кода на Go. Представлено в рамках GopherCon Israel 2020.

Каждый пакет имеет только одно назначение


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

Явная обработка ошибок


Надежные программы состоят из элементов, которые обрабатывают ошибки до того, как те успеют ударить их в спину. Многословность if err != nil { return err }оправдана важностью хорошо продуманной обработки каждой ошибки в местах, где они могут возникать. Panic и recover не являются исключениями, они не предназначены для использования таким образом.

Предотвращайте глубокую вложенность с помощью return


Каждый раз, когда вы делаете отступ, вы добавляете еще одно условие в мысленный стек программиста, занимая один из 7 ± 2 слотов в его кратковременной памяти. Избегайте потоков управления с многоуровневыми отступами. Вместо глубокой вложенности, удерживайте успешный путь прохождения кода как можно левее, используя граничные операторы.

Оставьте параллелизм вызывающему


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

Перед тем, как запускать горутину, поинтересуйтесь, когда она остановится.


Горутины располагают ресурсами; блокировки, переменные, память и т. д. Самый надежный способ освободить эти ресурсы — остановить располагающую ими горутину.

Избегайте свойств на уровне пакета


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

Простота имеет значение


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

Пишите тесты, чтобы фиксировать поведение API вашего пакета.


Начинаете ли вы с тестов или заканчиваете, стремитесь ли к 100% покрытия тестами или довольствуетесь необходимым минимумом — независимо от всего этого API вашего пакета является вашим контрактом с пользователями. Тесты являются гарантией того, что эти контракты четко прописаны. Убедитесь, что вы тестируете поведение, которое пользователи могут наблюдать и на которое они могут положиться.

Если что-то вам кажется медленным, сначала докажите это с помощью бенчмарка.


Множество преступлений против поддерживаемости совершается во имя производительности. Оптимизация разрушает абстракции, обнажает внутренности и намертво связывает. Если вы решите взять на себя эту ношу, убедитесь, что на то есть реальные причины.

Умеренность — добродетель


Используйте горутины, каналы, блокировки, интерфейсы, встраивание с чувством меры.

Поддерживаемость имеет значение


Четкость, читаемость, простота — все это аспекты поддерживаемости. Можно ли поддерживать то, над чем вы упорно работали, после вашего ухода? Что вы можете сделать сегодня, чтобы облегчить жизнь тем, кто сменит вас завтра?



Узнать подробнее о курсе.