GDScript Style Guide

Beschreibung

Dieser Style Guide listet Konventionen zum Schreiben von elegantem GDScript. Das Ziel ist, einen dazu zu ermutigen, sauberen und lesbaren Code zu schreiben und die Konsistenz aller Projekte, Diskussionen und Tutorials zu fördern. Hoffentlich wird dies auch die Entwicklung von Auto-Formatierungswerkzeugen ankurbeln.

Da GDScript Python ähnelt, ist dieser Guide inspiriert von Python’s PEP 8 Programmier-Styleguide.

Bemerkung

Godot’s integrierter Skripteditor verwendet standardmäßig einige dieser Konventionen.

Programmstruktur

Einrückungen

Einrücksungstyp: Tabs (Standard)

Einrückungsgroße: 4 (Standard)

Jede Einrückungsebene sollte um eins größer sein als die des umgebenden Blocks.

Gut:

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

Schlecht:

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

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

Rücke 2 Ebenen ein, um fortgesetzte Zeilen von regulären Codeblöcken zu unterscheiden.

Gut:

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

Schlecht:

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

Leere Zeilen

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)

Verwende eine Leerzeile um logische Abschnitte innerhalb einer Funktion zu separieren.

Eine Anweisung pro Zeile

Schreibe niemals mehrere Anweisungen in einer Zeile. Nein, liebe C Programmierer, auch keine einzeiligen bedingten Anweisungen (außer der Ternäroperator)!

Gut:

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

if flag:
    print("flagged")

Schlecht:

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

if flag: print("flagged")

Vermeide unnötige Klammern

Vermeide Klammern in Ausdrücken und Bedingungen. Außer um logische Reihenfolgen zu bestimmen, sie verringern nur die Lesbarkeit.

Gut:

if is_colliding():
    queue_free()

Schlecht:

if (is_colliding()):
    queue_free()

Leerzeichen

Setze immer ein Leerzeichen um Operatoren und nach Kommas. Vermeide zusätzliche Leerzeichen in Dictionary-Referenzen oder Funktionsaufrufen, oder um „Spalten“ zu erzeugen.

Gut:

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

Schlecht:

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

NEVER:

x        = 100
y        = 100
velocity = 500

Benennungsrichtlinien

Diese Benennungsrichtlinien folgen dem Godot Engine Style. Bei Nichtbeachtung wird dein Code mit den eingebauten Bennennungsrichtlinien kollidieren, was hässlich ist.

Klassen und Nodes

Nutze PascalCase: extends KinematicBody

Außerdem beim abspeichern einer Klasse in einer Konstante oder Variable:

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

Funktionen und Variablen

snake_case benutzen: get_node()

Benenne virtuelle Methoden (Funktionen, die der Nutzer überschreiben muss), private Funktionen und private Variablen mit führendem Unterstrich: func _ready()

Signale

Vergangenheitsform benutzen:

signal door_opened
signal score_changed

Konstanten

Verwende CONSTANT_CASE, alles in Großbuchstaben, mit einem Unterstrich zur Worttrennung: 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.

Gut:

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

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

Schlecht:

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