LSL Style Guide/ja
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
LSLにおける効率的なプログラミングには、スクリプトを定型と規約に定めるための制約的実行が必要です。
これら、スタイルガイドと呼ばれる集約的要素のガイドラインは、言語コンパイラが必要とするルールほど厳密ではありませんが、それでもなお効率的なメンテナンス性のあるコードを作成するためには必要です。最も効果的なスタイルの様相は、あなたの書くコードに首尾一貫性を持たせることです。
一般的なガイドライン
プログラミングを始めるときに、多くの人々はそれをみて確実に不快感を催すでしょう。彼らは大抵以下のようなものを目にします。
default {state_entry(){llSay(0,"Hello World.");}}
しかしながら、このコードは一行が一万語で書かれているプログラムの場合、読み解く(あるいは最後まで解釈する)ことが困難です。それ故、プログラマー達は括弧とインデントについて以下の二つの手法を主に用いて、コードを整形します。
手法 1:
default { state_entry() { llSay(0, "Hello World."); } }
手法 2:
default { state_entry() { llSay(0, "Hello World."); } }
手法1のスタイルでは行数を節約できますが、手法2のスタイルの方が初心者にとってより読みやすくなります。スクリプタは記述スタイルとして実施することにより、さらに読みやすいコードとなるでしょう。首尾一貫したインデントは、さまざまなスタイルをさらに読みやすくします。手法1におけるインデントは、スコープレベルでの要素を表す鍵です。
命名規則
Second Lifeには、多くの命名規則が存在します。ただ、最も使われるものは次に並んだものでしょう。
グローバル変数(プログラム全体を通して持ちいられる変数)は最初に小文字のgをつけるべきです。
integer gSelected = 0; string gMyName = "Please set one";
定数として使用する変数は全て大文字を使用します。
integer CHAT_CHAN = -517265; key OWNER_KEY = llGetOwner();
ユーザ定義関数やイベントの中で用いられる引数は、アンダーバー(_)から始めます。
listen( integer _channel, string _name, key _id, string _message ) { if ( _channel == 1 || _id == llGetOwner() ) llOwnerSay("Hello Avatar"); }
コードの分離
多くの人達は一行で余りにも沢山の関数を呼び出そうとするでしょう。これはコードを読み難くして、極めてデバッグを困難にします。例として、このようなプログラムを挙げてみます。
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)); } }
いまここに、簡潔になる方法をとった、まったく同じ処理のコードがあります。誰かが、先ほどのコードが一体何を行っているのか、あなたに説明することで困難になっている間に、多くの人達はこのコードを教えるでしょう。
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)); } }
LSLは最適化コンパイラではありません。これは、二つのスタイルがさらに軽快なコードにすることにはバランスが必要となる理由でしょう。行を混ぜ合わせる最適化は、後々コードの動作をバグでいっぱいにするでしょう。間違った最適化は、よくない結果を招きいれます。常に十分に最適化されたコードを試みましょう。
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)); } }
スクリプト構成
LSLスクリプトは、関数、ステートメント、イベントハンドラ、ステートの要素によって構成されています。LSLコンパイラはスクリプトに正確な構造化を強制します。
- 定義された変数を用いる(LSL_Variablesを参照)
- 定義された関数を用いる(User-defined_functionsを参照)
- default State (stateを参照)
- 定義されたステートを用いる
エディタ
多くのサードパーティ製エディタとLSL構文ファイルがあります。その他の情報はLSL Alternate Editorsを参照してください。