Руководство по стилю 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 two blank lines:

func heal(amount):
    health += amount
    health = min(health, max_health)
    emit_signal("health_changed", health)


func take_damage(amount, effect=null):
    health -= amount
    health = max(0, health)
    emit_signal("health_changed", health)

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

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

Static typing

Since Godot 3.1, GDScript supports optional static typing.

Type hints

Place the colon right after the variable’s name, without a space, and let the GDScript compiler infer the variable’s type when possible.

Хорошо:

onready var health_bar: ProgressBar = get_node("UI/LifeBar")

var health := 0 # The compiler will use the int type

Плохо:

# The compiler can't infer the exact type and will use Node
# instead of ProgressBar
onready var health_bar := get_node("UI/LifeBar")

When you let the compiler infer the type hint, write the colon and equal signs together: :=.

var health := 0 # The compiler will use the int type

Add a space on either sides of the return type arrow when defining functions.

func heal(amount: int) -> void: