- 2008-05-31 (土)
- tutorial/strategy
fromhttp://nodebox.net/code/index.php/Commands
NodeBoxリファレンスhttp://nodebox.net/code/index.php/Referenceの定義済みのコマンドとは別に、あなた自身でカスタムコマンドを定義できる。
コマンドを作成することは、スクリプトのある動作や断片を再利用するデザイン戦略である。
画像省略
例えば上の例では、花を描くための全ての動作(線と接続した10個のレッドーピンクの円)は、手軽なflower()コマンドにグループ化されている。
このコマンドは一回でも100回でも1000回でも呼び出せる。
花を描く方法を変更したければ、コードの1つの箇所を変更するだけである。
コマンドを定義することは、何度も使うことが出来る道具のセットを使って、道具箱を構成するのと同じである。
Command definition
シンプルな例として、独自に定義した header()コマンドを下記に記す。
def header(txt, x, y):
fill(1, 0, 0)
font("Dolly-Bold", 18)
text(txt, x, y)
コマンドの定義はdefで始める。続いてコマンドの名前(関連性のある名前を付けよ)、次いでパラメータのリストが来る。
行の最後に:コロンを付けるのを忘れないように。これは、続くインデントされたステートメントがそのコマンドであるということをNodeboxに伝えるためである。
Naming conventions:
- コマンドが何をするのかの記述となるような、シンプルで関連性のある名前を使え。
- 小文字とアンダースコアを使えlower_case_with_underscores。(imagesizeのような不可欠なコマンドは除く)
- コマンドがTrueかFalseを返すものなら頭にisを付けろ。: is_white, is_alive, is_big, ...
- 値を変化させて返すコマンドには頭に動詞を付けろ。: adjust_contrast, strip_tags, ...
Parameters
コマンド定義はそれ自身では実行されない。:
あなたが代りにNodeBoxに何かを教えている。 (例えば、headerが何か?)
コマンド定義はスクリプトのどこかで呼び出される必要がある。
これが、パラメータを入れさせる所である。:
header()の定義がどうtxt,x,yを使用するかに注意せよ。
これらは変数の定義のように使用される。
一度コマンドが呼び出され、txt,x,yに実際の値を与える。
header("Templating", 20, 40)
これでNodeboxは、header()で定義された全てのコードに、textへ"Templating",xへ20、yへ40が実行される。
Return value
NodeBox内のコマンドが返す値を持っており、変数を保持できることに注意。
例えば、textheight(txt, w) は表示されたtxtのパラグラフの高さを、幅と共に返す。
def paragraph(txt, x, y, w):
fill(0.2)
font("Dolly-Roman", 14)
text(txt, x, y, w)
return textheight(txt, w)
定義でのreturnステートメントは値を返す。
これは数値、文字列、リストなんででもできる。
returnステートメントは定義の最後にいつもくる。
Example
下の例では、2つのスクリプトとも同じ動作をする。
片方は上から下へプレーンに使用していて、片方はテンプレートを使用している。
実際には最初のコードの方が短い、しかし、2つでなく20個のパラグラフを書くことを想像せよ。
…フォントを定義して、カラーもまた定義して…結局ロボットに何か説明する別のロボットが欲しくなるだろう。
そのうえ、ヘッダのカラーや、水平マージンを変更するには2番目のスクリプトがはるかに簡単である。
なぜなら、header()の定義を変えるか、変数xの値を変えるかのただ一回で済むから。
1st:plain top-to-bottom scripting.
fill(1, 0, 0.25)
font("Dolly-Bold", 14)
txt = "Without templating"
text(txt, 20, 30, 200)
fill(0.2)
font("Dolly-Roman", 14)
txt = "Without templating, ..."
text(txt, 20, 50, 200)
fill(1, 0, 0.25)
font("Dolly-Bold", 14)
txt = "Messy"
text(txt, 20, 120, 200)
fill(0.2)
font("Dolly-Roman", 14)
txt = "This makes your script...."
text(txt, 20, 140, 200)
2nd:The same script with templates.
def header(txt, x, y):
fill(1, 0, 0.25)
font("Dolly-Bold", 14)
text(txt, x, y, outline=True)
return textheight(txt)
def paragraph(txt, x, y, w):
fill(0.2)
font("Dolly-Roman", 14)
text(txt, x, y, w, outline=True)
return textheight(txt, w)
x = 20
y = 30
w = 200
y += header("With templating", x, y)
txt = "With templating, ..."
y += paragraph(txt, x, y, w) + 10
y += header("Clean", x, y)
txt = "This keeps your script..."
paragraph(txt, x, y, w)
- Newer: Psyco specialization ≫
- Older: ≪ Repetition