суббота, 19 января 2019 г.

Эффективный Go: имена

Имена в 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 вместо подчеркивания для записи имени из нескольких слов.


Читайте также:


Комментариев нет:

Отправить комментарий