Руководство по стилю GDScript

Описание

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

Поскольку GDScript очень близок к Python, это руководство вдохновлено Python-ическим руководством по стилистике написания кода `PEP 8 <https://www.python.org/dev/peps/pep-0008/>.

Примечание

Встроенный в Godot редактор скриптов использует большинство этих соглашений по умолчанию. Позвольте ему помочь вам.

Структура кода

Отступы

Тип отступа: Табуляция (по умолчанию)

Размер отступа: 4 (по умолчанию)

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

Хорошо:

for i in range(10):
    print("hello")

Плохо:

for i in range(10):
  print("hello")

for i in range(10):
        print("hello")

Используйте 2 уровня отступа, чтобы отличать строки продолжения от обычных блоков кода.

Хорошо:

effect.interpolate_property(sprite, 'transform/scale',
            sprite.get_scale(), Vector2(2.0, 2.0), 0.3,
            Tween.TRANS_QUAD, Tween.EASE_OUT)

Плохо:

effect.interpolate_property(sprite, 'transform/scale',
    sprite.get_scale(), Vector2(2.0, 2.0), 0.3,
    Tween.TRANS_QUAD, Tween.EASE_OUT)

Пустые строки

Surround functions and class definitions with a blank line.

Используйте одну пустую строку внутри функций для отделения логических частей друг от друга.

One statement per line

Никогда не объединяйте несколько выражений в одну строку. Нет, программисты C, не надо писать условные выражения в одну строку (за исключением тернарного оператора)!

Хорошо:

if position.x > width:
    position.x = 0

if flag:
    print("flagged")

Плохо:

if position.x > width: position.x = 0

if flag: print("flagged")

Avoid unnecessary parentheses

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

Хорошо:

if is_colliding():
    queue_free()

Плохо:

if (is_colliding()):
    queue_free()

Пробел

Всегда ставьте пробел с обоих сторон от оператора, а также после запятой. Избегайте лишних пробелов как при обращении к словарям, так и при вызове функций, либо для выравнивания кода «в столбик».

Хорошо:

position.x = 5
position.y = mpos.y + 10
dict['key'] = 5
myarray = [4, 5, 6]
print('foo')

Плохо:

position.x=5
position.y = mpos.y+10
dict ['key'] = 5
myarray = [4,5,6]
print ('foo')

НИКОГДА:

x        = 100
y        = 100
velocity = 500

Naming conventions

Эти соглашения об именах следуют стилю Godot Engine. Нарушение данных правил приведет к конфликту вашего кода со встроенными соглашениями об именах, что является ужасным.

Classes and nodes

Используйте PascalCase: extends KinematicBody

Также при загрузке класса в константу или переменную:

const MyCoolNode = preload('res://my_cool_node.gd')

Functions and variables

Используйте змеиный_регистр: get_node()

Добавьте одно нижнее подчеркивание (_) к наименованию виртуальных методов (функции, которые пользователь должен переопределить), приватных функций и приватных переменных: func _ready()

Сигналы

Используйте прошедшее время:

signal door_opened
signal score_changed

Константы

Используйте CONSTANT_CASE, все большими буквами, с нижним подчеркиванием (_) в качестве разделителя слов: const MAX_SPEED = 200