Difference between revisions of "LSL Style Guide/ja"

From Second Life Wiki
Jump to navigation Jump to search
m (→‎スクリプト構成: changed to link translated page)
(Update translation)
Line 1: Line 1:
{{Multi-lang}}{{LSL Header/ja}}{{RightToc}}
{{Multi-lang|1=LSL Style Guide|2=/ja}}{{LSL Header/ja}}{{RightToc}}


LSLにおける効率的なプログラミングには、スクリプトを定型と規約に定めるための制約的実行が必要です。
LSL の効果的なプログラミングを行なうには、レイアウトと (コーディングの) 慣習をスクリプトへ適用するよう、制作者が規律正しく実践しなければなりません。


これら、スタイルガイドと呼ばれる集約的要素のガイドラインは、言語コンパイラが必要とするルールほど厳密ではありませんが、それでもなお効率的なメンテナンス性のあるコードを作成するためには必要です。最も効果的なスタイルの様相は、あなたの書くコードに首尾一貫性を持たせることです。
これら、スタイルガイドと呼ばれる集約的要素のガイドラインは、言語コンパイラが必要とするルールほど厳密ではありませんが、それでもなお効率的なメンテナンス性のあるコードを作成するためには必要です。最も効果的なスタイルの様相は、あなたの書くコードに首尾一貫性を持たせることです。
Line 7: Line 7:
==一般的なガイドライン==
==一般的なガイドライン==


プログラミングを始めるときに、多くの人々はそれをみて確実に不快感を催すでしょう。彼らは大抵以下のようなものを目にします。
殆どの人々は、プログラミングの独習を始めた当初は、端的に言うと「醜い」プログラムを書きます。それらは大概、以下のような具合です:


    default {state_entry(){llSay(0,"Hello World.");}}
<lsl>    default {state_entry(){llSay(0,"Hello World.");}}</lsl>


しかしながら、このコードは一行が一万語で書かれているプログラムの場合、読み解く(あるいは最後まで解釈する)ことが困難です。それ故、プログラマー達は括弧とインデントについて以下の二つの手法を主に用いて、コードを整形します。
しかしながら、このコードは一行が一万語で書かれているプログラムの場合、読み解く(あるいは最後まで解釈する)ことが困難です。それ故、プログラマー達は括弧とインデントについて以下の二つの手法を主に用いて、コードを整形します。
Line 15: Line 15:


手法 1:
手法 1:
<pre>
<lsl>
     default {
     default {
         state_entry() {
         state_entry() {
Line 21: Line 21:
         }
         }
     }
     }
</pre>
</lsl>


手法 2:
手法 2:
<pre>
<lsl>
     default
     default
     {
     {
Line 32: Line 32:
         }
         }
     }
     }
</pre>
</lsl>


手法1のスタイルでは行数を節約できますが、手法2のスタイルの方が初心者にとってより読みやすくなります。スクリプタは記述スタイルとして実施することにより、さらに読みやすいコードとなるでしょう。首尾一貫したインデントは、さまざまなスタイルをさらに読みやすくします。手法1におけるインデントは、スコープレベルでの要素を表す鍵です。
手法1のスタイルでは行数を節約できますが、手法2のスタイルの方が初心者にとってより読みやすくなります。スクリプタは記述スタイルとして実施することにより、さらに読みやすいコードとなるでしょう。首尾一貫したインデントは、さまざまなスタイルをさらに読みやすくします。手法1におけるインデントは、スコープレベルを表現する鍵となります。


==命名規則==
==命名規則==
Line 41: Line 41:


グローバル変数(プログラム全体を通して持ちいられる変数)は最初に小文字のgをつけるべきです。
グローバル変数(プログラム全体を通して持ちいられる変数)は最初に小文字のgをつけるべきです。
<pre>
<lsl>
     integer gSelected = 0;
     integer gSelected = 0;
     string  gMyName = "Please set one";
     string  gMyName = "Please set one";
</pre>
</lsl>


定数として使用する変数は全て大文字を使用します。
定数として使用する変数は全て大文字を使用します。


<pre>
<lsl>
     integer CHAT_CHAN = -517265;
     integer CHAT_CHAN = -517265;
     key OWNER_KEY = llGetOwner();
     key OWNER_KEY = llGetOwner();
</pre>
</lsl>




ユーザ定義関数やイベントの中で用いられる引数は、アンダーバー(_)から始めます。
ユーザ定義関数やイベントの中で用いられる引数は、アンダーバー(_)から始めます。
<pre>
<lsl>
     listen( integer _channel, string _name, key _id, string _message )
     listen( integer _channel, string _name, key _id, string _message )
     {
     {
Line 61: Line 61:
         llOwnerSay("Hello Avatar");
         llOwnerSay("Hello Avatar");
     }
     }
</pre>
</lsl>


==コードの分離==
==コードの分離==


多くの人達は一行で余りにも沢山の関数を呼び出そうとするでしょう。これはコードを読み難くして、極めてデバッグを困難にします。例として、このようなプログラムを挙げてみます。
多くの人達は一行で余りにも沢山の関数を呼び出そうとするでしょう。これはコードを読み難くして、極めてデバッグを困難にします。例として、このようなプログラムを挙げてみます。
<pre>
<lsl>
list lst;
list lst;
integer numDigits = 10;
integer numDigits = 10;
Line 80: Line 80:


}
}
</pre>
</lsl>


いまここに、簡潔になる方法をとった、まったく同じ処理のコードがあります。誰かが、先ほどのコードが一体何を行っているのか、あなたに説明することで困難になっている間に、多くの人達はこのコードを教えるでしょう。
先ほどのコードが何を行なっているかあなたに説明できる人は殆どいないでしょうが、以下のコードが何を行なっているかは殆どの人が説明できるでしょう。


<pre>
<lsl>
list lst;
list lst;
integer numDigits = 10;
integer numDigits = 10;
Line 101: Line 101:
     }
     }
}
}
</pre>
</lsl>


LSLは最適化コンパイラではありません。これは、二つのスタイルがさらに軽快なコードにすることにはバランスが必要となる理由でしょう。行を混ぜ合わせる最適化は、後々コードの動作をバグでいっぱいにするでしょう。間違った最適化は、よくない結果を招きいれます。常に十分に最適化されたコードを試みましょう。
LSL には最適化コンパイラがありません。そのため、より速いコードを実現するには二つのスタイルをバランスよく使う必要があるでしょう。行をまとめてゆく最適化は、コードが動作しバグが無くなってから初めて行なうべきです。最適化したコードのテストを常に、徹底的に行ないましょう。


<pre>
<lsl>
list lst;
list lst;
integer numDigits = 10;
integer numDigits = 10;
Line 118: Line 118:
     }
     }
}
}
</pre>
</lsl>


==スクリプト構成==
==スクリプト構成==
Line 125: Line 125:


#定義された変数を用いる([[LSL_Variables/ja|LSL_Variables]]を参照)
#定義された変数を用いる([[LSL_Variables/ja|LSL_Variables]]を参照)
#定義された関数を用いる([[User-defined_functions]]を参照)
#定義された関数を用いる([[ユーザ定義関数]]を参照)
#[[default/ja|default]] State  ([[State/ja|state]]を参照)
#[[default/ja|default]] State  ([[State/ja|state]]を参照)
#定義されたステートを用いる
#定義されたステートを用いる

Revision as of 06:21, 27 May 2009

LSL の効果的なプログラミングを行なうには、レイアウトと (コーディングの) 慣習をスクリプトへ適用するよう、制作者が規律正しく実践しなければなりません。

これら、スタイルガイドと呼ばれる集約的要素のガイドラインは、言語コンパイラが必要とするルールほど厳密ではありませんが、それでもなお効率的なメンテナンス性のあるコードを作成するためには必要です。最も効果的なスタイルの様相は、あなたの書くコードに首尾一貫性を持たせることです。

一般的なガイドライン

殆どの人々は、プログラミングの独習を始めた当初は、端的に言うと「醜い」プログラムを書きます。それらは大概、以下のような具合です:

<lsl> default {state_entry(){llSay(0,"Hello World.");}}</lsl>

しかしながら、このコードは一行が一万語で書かれているプログラムの場合、読み解く(あるいは最後まで解釈する)ことが困難です。それ故、プログラマー達は括弧とインデントについて以下の二つの手法を主に用いて、コードを整形します。


手法 1: <lsl>

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

</lsl>

手法 2: <lsl>

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

</lsl>

手法1のスタイルでは行数を節約できますが、手法2のスタイルの方が初心者にとってより読みやすくなります。スクリプタは記述スタイルとして実施することにより、さらに読みやすいコードとなるでしょう。首尾一貫したインデントは、さまざまなスタイルをさらに読みやすくします。手法1におけるインデントは、スコープレベルを表現する鍵となります。

命名規則

Second Lifeには、多くの命名規則が存在します。ただ、最も使われるものは次に並んだものでしょう。

グローバル変数(プログラム全体を通して持ちいられる変数)は最初に小文字のgをつけるべきです。 <lsl>

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

</lsl>

定数として使用する変数は全て大文字を使用します。

<lsl>

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

</lsl>


ユーザ定義関数やイベントの中で用いられる引数は、アンダーバー(_)から始めます。 <lsl>

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

</lsl>

コードの分離

多くの人達は一行で余りにも沢山の関数を呼び出そうとするでしょう。これはコードを読み難くして、極めてデバッグを困難にします。例として、このようなプログラムを挙げてみます。 <lsl> 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));
  }

} </lsl>

先ほどのコードが何を行なっているかあなたに説明できる人は殆どいないでしょうが、以下のコードが何を行なっているかは殆どの人が説明できるでしょう。

<lsl> 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>

LSL には最適化コンパイラがありません。そのため、より速いコードを実現するには二つのスタイルをバランスよく使う必要があるでしょう。行をまとめてゆく最適化は、コードが動作しバグが無くなってから初めて行なうべきです。最適化したコードのテストを常に、徹底的に行ないましょう。

<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コンパイラはスクリプトに正確な構造化を強制します。

  1. 定義された変数を用いる(LSL_Variablesを参照)
  2. 定義された関数を用いる(ユーザ定義関数を参照)
  3. default State (stateを参照)
  4. 定義されたステートを用いる

エディタ

多くのサードパーティ製エディタとLSL構文ファイルがあります。その他の情報はLSL Alternate Editorsを参照してください。