Имена в Go так же важны, как и в любом другом языке. Они даже имеют семантический эффект: видимость имени вне пакета определяется тем, написан ли первый символ в верхнем регистре. Поэтому стоит потратить немного времени на ознакомление с соглашениями об именах в Go программах.
Имена пакетов
Когда пакет импортируется, имя пакета становится средством доступа для его содержимого. После
import "bytes"
импортирующий пакет может говорить о bytes.Buffer
. Это полезно, если каждый, кто использует пакет, может использовать одно и то же имя для ссылки на его содержимое, которое подразумевает, что имя пакета должно быть хорошим: коротким, точным, запоминающимся. По договоренности, пакетам даются имена из строчных букв, из одного слова; не должно быть необходимости подчеркивания или mixedCaps. Err - кратко, так как все использующие ваш пакет будут печатать это имя. И не беспокойтесь априори о коллизиях имен. Имя пакета является только именем по умолчанию для импорта; оно не должно быть уникальным по всему исходному коду, и в редком случае коллизии импортирующий пакет может выбрать другое имя для локального использования. В любом случае путаница встречается редко, потому что имя файла в импорте определяет, какой пакет используется.
Другое соглашение заключается в том, что имя пакета является базовым именем его исходного каталога; пакет в src/encoding/base64
импортируется как "encoding/base64"
, но имеет имя base64
, не encoding_base64
и не encodingBase64
.
Импортер пакета будет использовать имя для ссылки на его содержимое, поэтому экспортированные имена в пакете могут использовать этот факт, чтобы избежать проблем. (Не используйте нотацию import.
, которая может упростить тесты, которые должны выполняться вне пакета, который они тестируют, но в противном случае их следует избегать.) Например, buffered reader type в пакете bufio
называется Reader
, не BufReader
, потому что пользователи видят его как bufio.Reader
, что является ясным, кратким именем. Более того, потому что импортированные сущности всегда адресуются с именем своего пакета, bufio.Reader
не конфликтует с io.Reader
. Аналогично, функция для создания новых экземпляров ring.Ring
- которая является определением конструктора в Go - обычно называется NewRing
, но так как Ring
является единственным типом, экспортируемым пакетом, и поскольку пакет называется ring
, он называется просто New
, что клиенты пакета видят как ring.New
. Используйте структуру пакета для помощи в выборе хороших имен.
Еще один короткий пример - Once.Do
; Once.Do(setup)
хорошо читается и не улучшится от записи как Once.DoOrWaitUntilDone(setup)
. Длинные имена автоматически не делают вещи более читабельными. Полезный комментарий к документу часто может быть более ценным, чем дополнительное длинное имя.
Getters
Go не обеспечивает автоматическую поддержку геттеров и сеттеров. Нет ничего плохого в том, чтобы самим предоставлять геттеры и сеттеры, и это часто уместно, но это ни идиоматично, ни необходимо помещать Get
в имя геттера. Если у вас есть поле с именем owner
(нижний регистр, не экспортируется), метод получения должен называться Owner
(верхний регистр, экспортируется), а не GetOwner
. Использование имен в верхнем регистре для экспорта предоставляет возможность различать
поле от метода. Функция сеттер, если необходимо, скорее всего, будет называться SetOwner
. Оба имени хорошо читаются на практике:
owner := obj.Owner()
if owner != user {
obj.SetOwner(user)
}
Имена интерфейсов
По соглашению интерфейсы с одним методом называются именем метода плюс суффикс -er или аналогичная модификация для создания существительного агента: Reader
, Writer
, Formatter
, CloseNotifier
и т. д.
Есть несколько таких имен, и это полезно, использовать их и имена функций, которые они захватывают. Read
, Write
, Close
, Flush
, String
и подобные канонические подписи и значения. Чтобы избежать путаницы, не называйте свой метод одним из этих имен, если только он не имеет такую же подпись и значение. И наоборот, если ваш тип реализует метод с тем же значением, что и метод известного типа, дайте ему то же имя и подпись; вызывайте метод преобразования строк String
, а не ToString
.
MixedCaps
Наконец, в Go принято использовать MixedCaps
или mixedCaps
вместо подчеркивания для записи имени из нескольких слов.
Читайте также:
Комментариев нет:
Отправить комментарий