Guide de style GDScript

Description

Ce guide de style liste les standards pour écrire du GDScript élégant. Le but est d’encourager l’écriture de code propre et lisible ainsi que de promouvoir l’uniformité au travers des projets, les discussions et les tutoriaux. Également, nous espérons que cela encourage le développement d’outil auto-formatage.

Puisque GDScript ressemble à Python, ce guide est inspiré par celui de Python PEP 8 programming styleguide.

Note

L’éditeur de script intégré dans Godot utilise beaucoup de ces standards par défaut. Laissez-le vous aider.

Structure de code

Indentation

Type d’indentation : Tabulations (défaut de l’éditeur)

Taille d’indentation : 4 (défaut de l’éditeur)

Chaque niveau d’indentation doit être supérieur d’une unité au bloc qui le contient.

Bon :

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

Mauvais :

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

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

Utiliser 2 niveaux d’indentations pour distinguer les suites de lignes des blocs de code réguliers.

Bon :

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

Mauvais :

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

Lignes vides

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)

Utiliser une ligne vide à l’intérieur des fonctions pour séparer les sections logiques.

Une Instruction par ligne

Ne combinez jamais plusieurs instructions sur une même ligne. Non, les programmeurs C, pas avec une seule ligne d’instruction conditionnelle (sauf avec l’opérateur ternaire) !

Bon :

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

if flag:
    print("flagged")

Mauvais :

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

if flag: print("flagged")

Évitez les parenthèses inutiles

Évitez les parenthèses dans les expressions et les instructions conditionnelles. Sauf si elles sont nécessaires pour l’ordre des opérations, elles ne font que réduire la lisibilité.

Bon :

if is_colliding():
    queue_free()

Mauvais :

if (is_colliding()):
    queue_free()

Espace

Utiliser toujours un seul espace autour des opérateurs et après les virgules. Éviter les espaces supplémentaires dans les références de dictionnaires et les appels de fonctions, ou pour créer des « colonnes. »

Bon :

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

Mauvais :

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

JAMAIS :

x        = 100
y        = 100
velocity = 500

Conventions de nommage

Ces conventions de nommage suivent le style du moteur Godot. Si vous les brisez, votre code se détachera des conventions de nommage intégrés, ce qui est laid.

Classes et Noeuds

Utilisez PascalCase : extends KinematicBody

Également, lorsque vous chargez une classe dans une constante ou une variable :

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

Fonctions et Variables

Utilisez snake_case: get_node()

Préfixer un seul souligner (_) aux méthodes virtuelles (les fonctions que l’usager doit redéfinir), les fonctions privées, et les variables privées : func _ready()

Signaux

Utiliser le temps passé :

signal door_opened
signal score_changed

Constantes

Utiliser CONSTANT_CASE, tout en majuscules, avec un underscore (_) pour séparer les mots: 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.

Bon :

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

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

Mauvais :

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