LSL Style Guide/fr

From Second Life Wiki
Jump to: navigation, search

Comme tout langage, LSL demande la pratique d'une discipline pour appliquer aux scripts les formats et conventions appropriés.

Ces règles, réunies sous le nom de Guide de style, ne sont pas aussi rigides que celles imposées par le compilateur mais sont néanmoins critiques pour créer du code lisible et maintenable. La chose la plus importante en matère de style est de l'appliquer avec constance.


Conventions générales

La plupart des gens, lorsqu'ils débutent en programmation, écrivent un programme MOCHE pour parler gentiment. Ça ressemble en général à ceci:

   default {state_entry(){llSay(0,"Hello World.");}}

Hélas, ce code devient impossible à lire (du moins à 'suivre') quand il s'agit d'un programme de 10000 mots. Pour y remédier, les programmeurs utilisent deux méthodes pour structurer/indenter:

Première méthode :

    default {
        state_entry() {
            llSay(0, "Hello World.");
        }
    }

Seconde méthode :

    default
    {
        state_entry()
        {
            llSay(0, "Hello World.");
        }
    }

La première méthode économise l'espace, toutefois la deuxième méthode est plus facile à lire pour le débutant. Lorsqu'un programmeur a choisi un style, la lecture de son code s'avère plus facile. Des indentations uniformes rendent les deux styles plus facile à lire. Dans la première méthode, l'indentation est le marque essentielle de l'imbrication des blocs.

Conventions de nommage

Les conventions de nommage sont nombreuses dans Second Life. Seules les plus utilisées seront citées ici.

Les variables globales (accessibles en tout point du programme) commencent par un 'g' minuscule. Exemple :

    integer gSelected = 0;
    string  gMyName = "Please set one";

Les constantes sont EN MAJUSCULES. Exemple :

    integer CHAT_CHAN = -517265;
    key OWNER_KEY = llGetOwner();

Les arguments d'une fonction ou d'un évènement commencent par un blanc souligné (_). Exemple :

    listen( integer _channel, string _name, key _id, string _message )
    {
        if ( _channel == 1 || _id == llGetOwner() )
        	llOwnerSay("Hello Avatar");
    }

Lisibilité

Beaucoup de débutants alignent beaucoup, beaucoup d'instructions sur une seule ligne. Cela rend le code peu lisible et pratiquement impossible à déboguer. Voici un mauvais exemple :

list lst;
integer numDigits = 10;
default {

   touch_start(integer n) {
       integer i = 0;
       integer index = llListFindList(lst, [llToLower(llGetSubString(llList2String(llParseString2List(llKey2Name(llDetectedKey(i)), [" "], []), 0), 0, numDigits - 1))]);
       if (!~llListFindList(lst, [llToLower(llGetSubString(llList2String(llParseString2List(llKey2Name(llDetectedKey(i)), [" "], []), 0), 0, numDigits - 1))]))
           lst += llToLower(llGetSubString(llList2String(llParseString2List(llKey2Name(llDetectedKey(i)), [" "], []), 0), 0, numDigits - 1));
       llOwnerSay(llList2CSV(lst));
   }

}

Maintenant voici un code avec exactement la même fonctionnalité mais plus simple. Alors qu'on a du mal à dire ce que fait le code ci-dessus, celui-ci coule presque de source (jeu de mot voulu).

list lst;
integer numDigits = 10;

default {
    touch_start(integer n) {
        integer i = 0;
        string name = llKey2Name(llDetectedKey(i));
        list nameAsList = llParseString2List(name, [" "], []);
        string firstName = llList2String(nameAsList, 0);
        string startPart = llToLower(llGetSubString(firstName, 0, numDigits - 1));
        integer index = llListFindList(lst, (list)startPart);
        if (!~index)
            lst += startPart;
        llOwnerSay(llList2CSV(lst));
    }
}

Le compilateur de LSL n'est pas optimiseur. Il peut donc être nécessaire de sacrifier au style pour produire du code plus rapide. Les optimisation par regroupement en une ligne seront faites seulement une fois que le code est fonctionnel et testé. Une optimisation trop précoce peut conduire à un faux résultat. Testez toujours soigneusement vos optimisations.

list lst;
integer numDigits = 10;

default {
    touch_start(integer n) {
        integer i = 0;
        string startPart = llToLower(llGetSubString(llList2String(llParseString2List(llKey2Name(llDetectedKey(i)), [" "], []), 0), 0, numDigits - 1));
        if (!~llListFindList(lst, (list)startPart))
            lst += startPart;
        llOwnerSay(llList2CSV(lst));
    }
}

Structure

Un script LSL se compose d'expressions, de fonctions, d'instructions, de gestionnaires d'évènements (event handlers) et d'états (states). Le compilateur LSL impose une certaine structure sur les scripts :

  1. Variables définies par le programmeur (cf. LSL_Variables)
  2. Fonctions définies par le programmeur (cf. User-defined_functions)
  3. État par défaut (cf. State)
  4. États définis par le programmeur

Éditeurs

Il existe plusieurs éditeurs alternatifs gérant la syntaxe de LSL avec les fichiers de définitions appropriés. Cf. éditeurs alternatifs pour plus d'informations.