畳を敷く(4)
オブジェクト機能をつかって生きた畳ツールを作ってみましょう。
第4章 カスタム関数を作ってみる
ここまでで、5つのプログラムができました。
このまま5つのオブジェクトプラグインを作ってもいいのですが、1つにまとめましょう。
本来のカスタム関数(ユーザ定義関数)の使い方は、同じような処理が頻繁に出てくる場合に、関数化してソースコードをまとめることでプログラム変更を容易にする役割がありますが、それ以外にもメイン部分にダラダラと書くのではなく、機能ごとに細分化しプログラムが見やすくする役目もあります。こちらの場合には関数化というより、サブルーチン化と言った方がいいかもしれません。
書き方はメインになる(呼び出す側)プログラムの変数定義(VAR)のところにプログラムをいれます。
PROCEDURE tatami; VAR ii : INTEGER; PROCEDURE SubRoutine;{関数の宣言} BEGIN END; BEGIN{メイン} SubRoutine; END; Run( tatami );
各関数は畳数となりますので、この部分もパラメータ化(pTType)しておきましょう。
変数の内容によって、描く畳数(実行する関数)がかわるようにIF文を使って分岐させます。
pTTypeに文字列として「四畳半」「六畳」「八畳」「十畳」「十二畳」が入ってくると各畳数が描かれます。
PROCEDURE tatami; CONST pTSize = 880.0; pTAtumi = 60.0; pTType = '四畳半'; { pTType = '六畳';} { pTType = '八畳';} { pTType = '十畳';} { pTType = '十二畳';} VAR ii : INTEGER; PROCEDURE tatami45; BEGIN BeginXtrd( 0, pTAtumi ); Rect( 0.0, 0.0, pTSize*2, pTSize ); Rect( pTSize*2, 0.0, pTSize*3, pTSize*2 ); Rect( 0.0, pTSize, pTSize, pTSize*3 ); Rect( pTSize, pTSize*2, pTSize*3, pTSize*3 ); Rect( pTSize, pTSize, pTSize*2, pTSize*2 ); EndXtrd; END; PROCEDURE tatami6; BEGIN BeginXtrd( 0, pTAtumi ); Rect( 0.0, 0.0, pTSize, pTSize*2 ); Rect( pTSize, 0.0, pTSize*3, pTSize ); Rect( pTSize, pTSize, pTSize*3, pTSize*2 ); Rect( pTSize*3, 0.0, pTSize*4, pTSize*2 ); Rect( 0.0, pTSize*2, pTSize*2, pTSize*3 ); Rect( pTSize*2, pTSize*2, pTSize*4, pTSize*3 ); EndXtrd; END; PROCEDURE tatami8; BEGIN BeginXtrd( 0, pTAtumi ); Rect( 0.0, 0.0, pTSize*2, pTSize ); Rect( pTSize*2, 0.0, pTSize*4, pTSize ); Rect( 0.0, pTSize, pTSize, pTSize*3 ); Rect( pTSize, pTSize, pTSize*3, pTSize*2 ); Rect( pTSize, pTSize*2, pTSize*3, pTSize*3 ); Rect( pTSize*3, pTSize, pTSize*4, pTSize*3 ); Rect( 0.0, pTSize*3, pTSize*2, pTSize*4 ); Rect( pTSize*2, pTSize*3, pTSize*4, pTSize*4 ); EndXtrd; END; PROCEDURE tatami10; BEGIN BeginXtrd( 0, pTAtumi ); Rect( 0.0, 0.0, pTSize, pTSize*2 ); Rect( 0.0, pTSize*2, pTSize, pTSize*4 ); Rect( pTSize, 0.0, pTSize*3, pTSize ); Rect( pTSize*3, 0.0, pTSize*5, pTSize ); Rect( pTSize, pTSize, pTSize*2, pTSize*3 ); Rect( pTSize*2, pTSize, pTSize*4, pTSize*2 ); Rect( pTSize*2, pTSize*2, pTSize*4, pTSize*3 ); Rect( pTSize*4, pTSize, pTSize*5, pTSize*3 ); Rect( pTSize, pTSize*3, pTSize*3, pTSize*4 ); Rect( pTSize*3, pTSize*3, pTSize*5, pTSize*4 ); EndXtrd; END; PROCEDURE tatami12; BEGIN BeginXtrd( 0, pTAtumi ); Rect( 0.0, 0.0, pTSize, pTSize*2 ); Rect( 0.0, pTSize*2, pTSize, pTSize*4 ); Rect( pTSize, 0.0, pTSize*3, pTSize ); Rect( pTSize*3, 0.0, pTSize*5, pTSize ); Rect( pTSize, pTSize, pTSize*2, pTSize*3 ); Rect( pTSize*2, pTSize, pTSize*4, pTSize*2 ); Rect( pTSize*2, pTSize*2, pTSize*4, pTSize*3 ); Rect( pTSize*4, pTSize, pTSize*5, pTSize*3 ); Rect( pTSize, pTSize*3, pTSize*3, pTSize*4 ); Rect( pTSize*3, pTSize*3, pTSize*5, pTSize*4 ); Rect( pTSize*5, 0.0, pTSize*6, pTSize*2 ); Rect( pTSize*5, pTSize*2, pTSize*6, pTSize*4 ); EndXtrd; END; BEGIN IF pTType = '四畳半' THEN BEGIN tatami45; END ELSE IF pTType = '六畳' THEN BEGIN tatami6; END ELSE IF pTType = '八畳' THEN BEGIN tatami8; END ELSE IF pTType = '十畳' THEN BEGIN tatami10; END ELSE IF pTType = '十二畳' THEN BEGIN tatami12; END ELSE BEGIN BeginXtrd( 0, pTAtumi ); Rect( 0.0, 0.0, pTSize, pTSize ); EndXtrd; END; END; Run( tatami );