kb

MAXScript スタイルガイド

言語

禁止

  • セミコロン
    構文規則が曖昧なので使用しない。

  • 永続グローバル変数
    不具合の温床になりやすいので使用しない。
    シーンに値を保存する場合はカスタムアトリビュートを使用する。

  • breakcontinueexit、および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
)

名前

原則

  • パスカル形式またはキャメル形式を使用する。

  • スネーク形式は既定の名前に限り使用を認める。
    使用する際は以下のように変換する。

    基本形式 スネーク形式 ポイント
    PascalCase Snake_Case 単語の頭文字が大文字
    camelCase snake_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コントロール
種類 識別子
System.Windows.Forms.ListView Lvw
System.Windows.Forms.Splitter Spl
System.Windows.Forms.StatusBar Sbr
System.Windows.Forms.TabControl Tab
System.Windows.Forms.TreeView Tvw
System.Windows.Forms.WebBrowser Wb

スタイル

全般

  • 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" (
)

構造体メンバの宣言順序

大枠は以下の通り。
その上でアルファベット昇順に並べる。

  1. publicな作成パラメータ

  2. publicプロパティ

  3. 変動するprivateプロパティ

  4. 変動しないprivateプロパティ

  5. publicメソッド

  6. privateメソッド

  7. 共通プロパティやメソッド

    1. private version

    2. public fn StructName

    3. public fn Dump

    4. public fn Equals

    5. public fn GetVersion

    6. publicな通知元プロパティ

    7. privateな通知元プロパティ

  8. Cloneイベントハンドラ

  9. Createイベントハンドラ

assert関数

比較式同様にテスト値を前に、期待値を後に記述する。

assert (actual == expected)

コメント

  • コメントの記号とテキストの間には半角スペースを1つ入れる。

    -- テキスト
    
    /* テキスト */
    
  • 複数行のブロックコメントにおいてテキストのインデントは行わないこと。

    -- 悪い例
    /*
      テキスト
    */
    
    -- 良い例
    /*
    テキスト
    */
    

ドキュメンテーションコメント

詳細はドキュメントコメントの構文を参照。

文体
  • 普通体で記述する。

  • 句読点を付ける。
    ただし、テーブル内の項目や値には付けない。
    テーブル内でも文章の場合には付ける。

定型
  • BooleanClassの変数、パラメータ、戻り値等の説明は以下の形式で記述する。

    /*-
    ○○の場合は`true`、○○の場合は`false`。
    */
    

    真の条件が明確な場合は以下の形式も可。

    /*-
    ○○かどうか。
    */
    
  • 戻り値がBooleanClassのメソッドの説明は以下の形式で記述する。

    /*-
    ○○かどうかを判定する。
    */
    
  • 既定値は文章の最後に記述する。

    /*-
    ○○の値。既定値は○○。
    */
    
  • 大文字と小文字を区別しない。

    /*-
    大文字と小文字を区別しない。
    */
    

テキストエディタの設定

項目 設定
文字エンコーディング UTF-8 BOM無し
改行コード LF
タブ幅 2桁
インデント 半角スペース