GDScript style guide

Opis

Ten przewodnik po stylistyce eleganckiego pisania eleganckiego GDScriptu. Celem jest zachęcenie do pisania czystego i czytelnego kodu oraz promowanie spójności pomiędzy projektami, dyskusjami i samouczkami. Miejmy nadzieję, że zachęci to również do opracowania narzędzi do autoformatowania.

Ponieważ GDScript jest związany z Pythonem, ten przewodnik jest inspirowany przez stylem pisania w Pythonie PEP 8.

Informacja

Wbudowany edytor skryptów Godota domyślnie korzysta z wielu z tych konwencji. Pozwól mu, pomóc sobie.

Code structure

Wcięcia

Typ wcięcia: Tabulator *(domyślne w edytorze) *

Rozmiar wcięcia: 4 (domyślne w edytorze)

Każdy poziom wcięcia powinien być o jeden większy niż w bloku, w którym się znajduje.

Dobrze:

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

Źle:

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

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

Użyj dwóch poziomów wcięcia dla odróżnienia bloku kodu od kontynuacji poprzedniej linii.

Dobrze:

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

Źle:

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

Puste wiersze

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)

Użyj jednego pustego wiersza wewnątrz funkcji, aby oddzielić sekcje logiczne.

One statement per line

Nigdy nie należy łączyć wielu instrukcji w jednej linii. Programiści C i C++, nie piszcie instrukcji warunkowych w jednej linii (z wyjątkiem operatora trójargumentowego)!

Dobrze:

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

if flag:
    print("flagged")

Źle:

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

if flag: print("flagged")

Avoid unnecessary parentheses

Unikaj nawiasów w wyrażeniach i instrukcjach warunkowych, o ile nie jest to konieczne ze względu na kolejność operacji. Ograniczają one jedynie czytelność.

Dobrze:

if is_colliding():
    queue_free()

Źle:

if (is_colliding()):
    queue_free()

Biały znak

Zawsze używaj odstępu jednej spacji przy operatorach i po przecinkach. Unikaj dodatkowych spacji w odwołaniach do słowników i wywołań funkcji lub tworzenia „kolumn”.

Dobrze:

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

Źle:

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

NIGDY:

x        = 100
y        = 100
velocity = 500

Naming conventions

Owe konwencje nazywania są zgodne ze stylem używanym Godot Engine. Ich złamanie spowoduje, że twój kod będzie sprzeczny z daną konwencją nazewniczą i jest po prostu brzydkie.

Classes and nodes

Użyj PascalCase: extends KinematicBody

Również podczas ładowania klasy do stałej lub zmiennej:

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

Functions and variables

Użyj snake_case: get_node()

Stosuj pojedyncze podkreślenie (_) do metod wirtualnych (funkcje, które użytkownik musi nadpisać), funkcji prywatnych i zmiennych prywatnych: func _ready()

Sygnały

Używaj czasu przeszłego:

signal door_opened
signal score_changed

Stałe

Używaj CONSTANT_CASE, wielkimi literami, z podkreśleniem (_), aby oddzielić słowa: const ILOSC_DNI = 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.

Dobrze:

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

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

Źle:

# 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: