![Hero background image](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F7126a77ab4e5e767cbab512caf69318010e6baa0-3840x2160.jpg&w=3840&q=100)
Несмотря на то, что не существует единственно верного способа форматирования кода на C#, согласование единого стиля в команде может привести к созданию более чистой, читаемой и масштабируемой кодовой базы. Хорошо организованное руководство по стилю поможет вам устранить несоответствия и создать целостный конечный продукт. На этой странице собраны советы и основные соображения, которые следует учитывать при создании собственного руководства по стилю, касательно соглашений об именовании и форматировании кода.
Примечание: Рекомендации, представленные здесь, основаны на рекомендациях, предоставленных компанией Microsoft. Лучшие правила руководства по стилю кода - это те, которые лучше всего подходят для нужд вашей команды.
Вы можете найти пример руководства по стилю кода здесь или скачать полную электронную книгу, Создайте руководство по стилю C#: Пишите более чистый код, который масштабируется.
Вы не можете определить переменные с пробелами в имени, потому что C# использует символ пробела для разделения идентификаторов. Схемы корпусов могут облегчить проблему использования составных имен или фраз в исходном коде.
Ниже перечислены некоторые известные соглашения об именовании и корпусе:
Чехол для верблюда
Также известный как camel caps, camel case - это практика написания фраз без пробелов и знаков препинания, разделяя слова одной заглавной буквой. Самая первая буква - строчная.
Как правило, локальные переменные и параметры методов отображаются в верблюжьем регистре. Например:
examplePlayerController
maxHealthPoints
endOfFile
Дело Паскаля
Паскаль - это разновидность верблюжьего регистра, в котором начальная буква пишется с большой буквы. Используйте его для имен классов и методов в разработке Unity. Публичные поля также могут быть в паскальном регистре. Например:
ExamplePlayerController
MaxHealthPoints
EndOfFile
Дело о змее
В этом случае пробелы между словами заменяются символом подчеркивания. Например:
example_player_controller
max_health_points
end_of_file
Кейс для кебаба
Здесь пробелы между словами заменяются тире. Затем слова появляются на своеобразном "шампуре" из символов тире. Например:
example-player-controller
Очки здоровья
конец файла
Проблема с кебабным регистром заключается в том, что во многих языках программирования тире используется как знак минус. Кроме того, некоторые языки интерпретируют числа, разделенные тире, как календарные даты.
Венгерская нотация
Имя переменной или функции часто указывает на ее назначение или тип. Например:
int iCounter
string strPlayerName
Венгерская нотация - это более старая конвенция, которая не часто используется в разработке Unity.
![Таблица полей и переменных](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F1ad784c3c71fff33a70f7d6b007f2d9297c813a4-810x442.jpg&w=3840&q=75)
Учитывайте эти правила для своих переменных и полей:
- Используйте существительные для имен переменных: Имена переменных должны быть четкими и описательными, поскольку они представляют конкретную вещь или состояние. Используйте существительное при их именовании, за исключением случаев, когда переменная имеет тип bool (см. ниже).
- Префикс Booleans с глаголом: Эти переменные указывают на истинное или ложное значение. Часто они являются ответом на вопрос, например: Бежит ли игрок? Игра окончена?
- Приправьте их глаголом, чтобы сделать их значение более очевидным. Часто это описание или состояние, например, isDead, isWalking, hasDamageMultiplier и т. д.
- Используйте осмысленные имена. Не сокращайте (если только это не математика): Имена ваших переменных раскроют их замысел. Выбирайте имена, которые легко произносить и искать.
- Хотя однобуквенные переменные подходят для циклов и математических выражений, не сокращайте их в других ситуациях. Ясность важнее, чем время, сэкономленное на опускании нескольких гласных.
- Для быстрого создания прототипов можно временно использовать короткие "мусорные" имена, а затем рефакторить их до более осмысленных.
- Используйте регистр pascal для открытых полей и регистр camel для приватных переменных: В качестве альтернативы публичным полям используйте свойства с публичным "геттером" (см. предыдущий и следующий разделы).
- Избегайте слишком большого количества префиксов или специальных кодировок: Чтобы отличить приватные переменные-члены от локальных переменных, можно поставить перед ними знак подчеркивания (_).
- В качестве альтернативы используйте ключевое слово this, чтобы отличить переменные-члены от локальных переменных в контексте и пропустить префикс. Публичные поля и свойства обычно не имеют префиксов.
- В некоторых руководствах по стилю используются префиксы для закрытых переменных-членов (m_), констант (k_) или статических переменных (s_), чтобы имя могло с первого взгляда рассказать о переменной больше.
- Многие разработчики отказываются от них и полагаются на редактор. Однако не все IDE поддерживают подсветку и цветовое кодирование, а некоторые инструменты вообще не могут показать богатый контекст. Учтите это, когда будете решать, как (или если) вы будете применять префиксы вместе, как команда.
- Последовательно указывайте (или опускайте) модификаторы уровня доступа: Если вы не укажете модификатор доступа, компилятор будет считать, что уровень доступа должен быть приватным. Это хорошо работает, но будьте последовательны в том, как опускать модификатор доступа по умолчанию.
- Помните, что вам нужно будет использовать protected, если вы захотите использовать это в подклассе позже.
Перечисления - это специальные типы значений, определяемые набором именованных констант. По умолчанию константы являются целыми числами, отсчитываемыми от нуля.
Используйте регистр pascal для имен и значений перечислений. Вы можете поместить публичные перечисления за пределы класса, чтобы сделать их глобальными. Используйте существительное единственного числа для имени перечисления.
Примечание: Битовые перечисления, помеченные атрибутом System.FlagsAttribute являются исключением из этого правила. Обычно их пишут во множественном числе, поскольку они представляют более одного типа.
Следуйте этим стандартным правилам при именовании классов и интерфейсов:
Используйте падежные окончания существительных для названий классов: Это поможет вам организовать занятия.
Если MonoBehaviour находится в файле, имя исходного файла должно совпадать: В файле могут быть и другие внутренние классы, но в каждом файле должен существовать только один MonoBehaviour.
Префикс названий интерфейсов с большой буквы "I": После этого добавьте прилагательное, описывающее функциональность.
В C# каждая выполненная инструкция выполняется в контексте метода.
Методы выполняют действия, поэтому применяйте эти правила, чтобы называть их соответствующим образом:
Начните название с глагола: При необходимости добавьте контекст (например, GetDirection, FindTarget и т. д.).
Используйте верблюжий регистр для параметров: Форматируйте параметры, передаваемые в метод, как локальные переменные.
Методы, возвращающие bool, должны задавать вопросы: Как и в случае с булевыми переменными, припишите методам глагол, если они возвращают условие "истина-ложь". Это формулирует их в виде вопроса (например, IsGameOver, HasStartedTurn).
Примечание: Термины "функция" и "метод" часто используются как взаимозаменяемые в разработке Unity. Однако, поскольку в C# вы не можете написать функцию, не включив ее в класс, правильнее использовать термин "метод".
События в C# реализуют паттерн наблюдателя. Этот шаблон проектирования программного обеспечения определяет отношения, в которых один объект, субъект (или издатель), может уведомлять список зависимых объектов, называемых наблюдателями (или подписчиками). Таким образом, субъект может транслировать изменения состояния своим наблюдателям без жесткой связи между объектами.
Существует несколько схем именования событий и связанных с ними методов у субъекта и наблюдателей. Попробуйте применить методы, описанные в следующих разделах.
Назовите событие с помощью глагольной фразы. Выберите тот, который точно передает изменение состояния.
Используйте причастие настоящего или прошедшего времени, чтобы указать на состояние событий до или после. Например, укажите "OpeningDoor" для события перед открытием двери и "DoorOpened" для последующего события.
Используйте делегат System.Action для событий. В большинстве случаев Action<T> делегат может обрабатывать события, необходимые для игрового процесса.
Вы можете передать до 16 входных параметров различных типов с типом возврата void. Использование предопределенного делегата экономит код.
Примечание: Вы также можете использовать EventHandler или EventHandler<TEventArgs> делегаты. Договоритесь с командой о том, как каждый должен реализовывать события.
Префикс "On" (в теме) к способу привлечения внимания к событию. Субъект, вызывающий событие, обычно делает это из метода с префиксом "On" (например, "OnOpeningDoor" или "OnDoorOpened").
Припишите к методу обработки событий (в наблюдателе) имя субъекта и знак подчеркивания (_). Если объект называется "GameEvents", ваши наблюдатели могут иметь метод под названием "GameEvents_OpeningDoor" или "GameEvents_DoorOpened".
Определитесь с последовательной схемой наименований для вашей команды и внедрите эти правила в руководство по стилю.
Примечание: Этот "метод обработки событий" не следует путать с делегатом EventHandler.
Создавайте пользовательские EventArgs только в случае необходимости. Если вам нужно передать в событие пользовательские данные, создайте новый тип EventArgs, либо унаследованный от System.EventArgs либо из собственной структуры.
Используйте пространства имен для того, чтобы ваши классы, интерфейсы, перечисления и т. д. не конфликтовали с уже существующими классами из других пространств имен или глобального пространства имен. Пространства имен также могут предотвратить конфликты со сторонними активами из Unity Asset Store или другими тестовыми сценами, которые не войдут в финальную версию проекта.
При применении пространств имен:
Используйте регистр pascal без специальных символов и подчеркиваний.
Добавьте директиву using в начало файла, чтобы избежать повторного ввода префикса пространства имен.
Создайте также подпространства имен. Используйте оператор dot(.) для разделения уровней имен, что позволит вам организовать ваши скрипты в иерархические категории. Например, вы можете создать "MyApplication.GameFlow", "MyApplication.AI", "MyApplication.UI" и так далее, чтобы хранить различные логические компоненты вашей игры.
В коде эти классы называются Enemy.Controller1 и Enemy.Controller2 соответственно. Добавьте строку using, чтобы не вводить префикс (например, используя Enemy;).
Когда компилятор находит имена классов Controller1 и Controller2, он понимает, что вы имеете в виду Enemy.Controller1 и Enemy.Controller2.
Если сценарий должен ссылаться на классы с одинаковыми именами из разных пространств имен, используйте префикс, чтобы различать их. Например, если у вас есть классы Controller1 и Controller2 в пространстве имен Player, вы можете записать Player.Controller1 и Player.Controller2, чтобы избежать конфликтов. В противном случае компилятор сообщит об ошибке.
Получите больше советов по стилю кода
Узнайте больше об общем форматировании здесь или ознакомьтесь с полной версией электронной книги. Вы также можете изучить пример нашего руководства по стилю кода.