MAXScript スタイルガイド
言語
禁止
-
セミコロン
構文規則が曖昧なので使用しない。 -
永続グローバル変数
不具合の温床になりやすいので使用しない。
シーンに値を保存する場合はカスタムアトリビュートを使用する。 -
break、continue、exit、およびreturn式
低速なので使用しない。
変数の可視性
全ての変数および構造体メンバは可視性を明示する。
エラー処理
複雑なエラー処理を実装するとかえってバグを発見しづらくなるため、可能な限りMAXScriptに委ねる。
try式
プラグインのバグ等、自力で回避できない場合にのみ使用する。
throw関数
言語仕様上はエラーにならない処理にあえて制限をかけたい場合等、限定的な利用に留める。
グローバル変数へのアクセス
新たに定義したグローバル変数へのアクセスは::を付けて行う。
global sample = 0
format "sample:%\n" ::sample
関数の戻り値
- 配列要素の追加・削除やファイルの作成・削除において真偽値を返す関数
-
動作の成否ではなく結果の成否を返す。
- 誤
-
fn AddValue input = ( if findItem this.list input = 0 then ( append this.list input true ) else ( false ) ) - 正
-
fn AddValue input = ( if findItem this.list input = 0 do ( append this.list input ) findItem this.list input > 0 )
- 配列インデックスを返す関数
-
findItem関数に合わせる。
存在する場合はその要素のインデックス、存在しない場合は0。
構造体のprivateプロパティ
privateプロパティをメソッドの戻り値として返したり、外部の関数に引数として渡したりする場合、変更されると困る値はcopyもしくはdeepCopyを使用する。
fn GetData = (
deepCopy this.data
)
名前
原則
-
パスカル形式またはキャメル形式を使用する。
-
スネーク形式は既定の名前に限り使用を認める。
使用する際は以下のように変換する。基本形式 スネーク形式 ポイント PascalCaseSnake_Case単語の頭文字が大文字 camelCasesnake_case全て小文字 -
チェイン形式は使用しない。
ファイル名等、慣例的にチェイン形式が利用されているものは除く。
略語
-
2文字以内は全て大文字で記述する。
-
3文字以上の略語はパスカル形式またはキャメル形式にする。
| 一般的な表記 | パスカル形式 | キャメル形式 |
|---|---|---|
UI |
UIControl |
uiControl |
HTML |
HtmlParser |
htmlParser |
ID |
IdGenerator |
idGenerator |
ファイル名
| 種類 | 形式 |
|---|---|
| ディレクトリ | Pascal |
| クラスファイル | Pascal |
| その他のファイル | Camel |
識別子
| 種類 | 形式 | 例 | 備考 |
|---|---|---|---|
attributes |
Pascal | FooAttribute |
|
macroscript |
Pascal | FooMacro |
|
parameters |
Pascal | FooParameter |
|
plugin |
Pascal | FooPlugin |
|
privateメンバ |
Camel | FooProperty |
|
publicメンバ |
Pascal | FooProperty |
|
rcmenu |
Pascal | MnuFoo |
構造体定義と同様の扱い |
rollout |
Pascal | RltFoo |
構造体定義と同様の扱い |
struct |
Pascal | FooStruct |
|
tool |
Pascal | FooTool |
|
| UIコントロール | Pascal | BtnFoo |
publicメンバと同様の扱い |
| イベントハンドラ | Pascal | Pressed |
publicメンバと同様の扱い |
| インタフェース | Pascal | InstanceMgr |
|
| 関数 | Camel | fooBar |
|
| 記号パス | Pascal | "$StartupScripts" |
|
| 変数 | Camel | fooBar |
|
| 名前値リテラル | Pascal | #FooBar |
|
| 予約キーワード | Camel | true |
UIコントロールの変数名
UIコントロールの変数名の先頭には以下に定めた識別子を使用する。
標準コントロール
| 種類 | 型 | 識別子 |
|---|---|---|
angle |
AngleControl |
Ang |
bitmap |
BitmapControl |
Bmp |
button |
ButtonControl |
Btn |
checkBox |
CheckBoxControl |
Ckbx |
checkButton |
CheckButtonControl |
Ckbtn |
colorPicker |
ColorPickerControl |
Cpk |
comboBox |
ComboBoxControl |
Cbx |
curveControl |
MaxCurveCtl |
Cc |
dropdownList |
ComboBoxControl |
Ddl |
editText |
EditTextControl |
Edt |
groupBox |
GroupBoxControl |
Gbx |
hyperLink |
LinkControl |
Hlk |
imgTag |
ImgTag |
Itg |
label |
LabelControl |
Lbl |
listBox |
ListBoxControl |
Lbx |
mapButton |
MapButtonControl |
Mpbtn |
materialButton |
MtlButtonControl |
Mtbtn |
multiListBox |
MultiListBoxControl |
Mlbx |
pickButton |
PickerControl |
Pkbtn |
progressBar |
ProgressBar |
Pbr |
radioButtons |
RadioControl |
Rdbtn |
rollout |
RolloutClass |
Rlt |
slider |
SliderControl |
Sld |
spinner |
SpinnerControl |
Spn |
subRollout |
SubRollout |
Srlt |
timer |
Timer |
Tmr |
RCMenu
| 種類 | 型 | 識別子 |
|---|---|---|
rcMenu |
RCMenu |
Mnu |
menuItem |
Value |
Mi |
separator |
Value |
Sep |
subMenu |
.NETコントロール
スタイル
全般
-
1行の文字数は80桁以内に収まるよう努める。
-
インデントは半角スペースを2つ使用する。
継続行
-
継続行は半角スペース4つのぶら下げインデントを行う。
foo \ bar -
部分式の終わりで区切ること。
-- 悪い例 foo and \ bar and \ baz for i = 1 to 10 where \ mod i 2 == 0 do ( expr ) -- 良い例 foo \ and bar \ and baz for i = 1 to 10 \ where mod i 2 == 0 do ( expr ) -
構文規則で改行が許されている場合でも、一貫性のために明示的な継続行にする。
-- 悪い例 foo + bar - baz -- 良い例 foo + \ bar - \ baz -- より望ましい例 foo \ + bar \ - baz
空白
- 演算子の前後
-
-
前後とも入れる
x + y == z foo and bar
-
:の前後-
-
前には入れない
varname: -
case式のラベルの後には入れるcase of ( (#Foo): expr (#Bar): ( expr ) default: expr ) -
キーワードパラメータの後には入れない
fn foo x:0 y: = ( -- ... ) foo x:1
-
- 括弧の内側
-
-
括弧の内側には入れない
#(foo, bar) #{1..3, 5} [x, y, z] foo[1]
-
,の前後-
-
前には入れない
[x, y, z] -
改行しない場合は後に入れる
#(foo, bar, baz) -
改行する場合は後には入れない
#( foo, bar, baz )
-
比較式
順序
原則としてテスト値を前に、期待値を後に記述する。
currentTime == 0
範囲判定
値が範囲内、または範囲外かどうかをテストする場合は視覚的に分かりやすい順序で記述する。
- 範囲内
-
20 <= currentTime and currentTime <= 60 - 範囲外
-
currentTime < 20 and 60 < currentTime
ブロック式
字下げスタイル
-
部分式であるブロック式は、直前のトークンと同じ行で開始する。
fn foo = ( expr )
ブロック式の省略
-
ぶら下がり文によるブロック式の省略は行わないこと。
-- 悪い例 if foo then expr else expr -- 良い例 if foo then ( expr ) else ( expr ) -
式が1行に収まる場合はブロック式を省略してもよい。
format "%%" (if i == 1 then "" else ",") i fn foo obj = obj != undefined for i = 1 to 10 collect i if i < 0 do i = 0
コンテキスト式
- ブール値の指定には
trueまたはfalseを使用する。
onを使用するとテキストエディタの構文ハイライトが正しく機能しない場合があるため。
Case式
-
必ず
defaultラベルを定義する。 -
default以外のラベルは必ずブロック式にする。
リテラルのみだとエラーになる場合があるため。case input of ( (0): () (#Name): () ("Foo"): () default: () )
定義構文
構造体、カスタムアトリビュート、ロールアウト等の定義構文は制御文や関数定義と同様にキャメル形式で記述する。
struct FooStruct (
on Create do ()
)
attributes FooAttribute version:1 (
)
rollout RltFoo "Foo" rolledUp:false (
spinner spnValue "Value:" range:[0, 100, 0] type:#Integer
)
rcMenu MnuFoo (
menuItem mi "Item"
)
macroScript FooMacro buttonText:"Macro" (
)
構造体メンバの宣言順序
大枠は以下の通り。
その上でアルファベット昇順に並べる。
-
publicな作成パラメータ -
publicプロパティ -
変動する
privateプロパティ -
変動しない
privateプロパティ -
publicメソッド -
privateメソッド -
共通プロパティやメソッド
-
private version -
public fn StructName -
public fn Dump -
public fn Equals -
public fn GetVersion -
publicな通知元プロパティ -
privateな通知元プロパティ
-
-
Cloneイベントハンドラ -
Createイベントハンドラ
assert関数
比較式同様にテスト値を前に、期待値を後に記述する。
assert (actual == expected)
コメント
-
コメントの記号とテキストの間には半角スペースを1つ入れる。
-- テキスト /* テキスト */ -
複数行のブロックコメントにおいてテキストのインデントは行わないこと。
-- 悪い例 /* テキスト */ -- 良い例 /* テキスト */
ドキュメンテーションコメント
詳細はドキュメントコメントの構文を参照。
文体
-
普通体で記述する。
-
句読点を付ける。
ただし、テーブル内の項目や値には付けない。
テーブル内でも文章の場合には付ける。
定型
-
BooleanClassの変数、パラメータ、戻り値等の説明は以下の形式で記述する。/*- ○○の場合は`true`、○○の場合は`false`。 */真の条件が明確な場合は以下の形式も可。
/*- ○○かどうか。 */ -
戻り値が
BooleanClassのメソッドの説明は以下の形式で記述する。/*- ○○かどうかを判定する。 */ -
既定値は文章の最後に記述する。
/*- ○○の値。既定値は○○。 */ -
大文字と小文字を区別しない。
/*- 大文字と小文字を区別しない。 */
テキストエディタの設定
| 項目 | 設定 |
|---|---|
| 文字エンコーディング | UTF-8 BOM無し |
| 改行コード | LF |
| タブ幅 | 2桁 |
| インデント | 半角スペース |