動機

HSPで作る時って普通は1個のファイルでガリガリ書いていきますよね?
もちろんモジュールは別ファイルですが。

しかし私の場合、規模が大きくなってくると1個のファイルでは整理が付かなくなってくるので 最近はできるだけファイルを分けて開発するようにしています。
このごろはツール系が多いので、ウィンドウ1個=ファイル1個という感じですね。

今回はファイルを分割して作業するための便利な方法を考えてみました。
一般向けな方法でもないだろうから、HSP開発wikiとかじゃなく、ここでメモしておこうかと。
真似する時は自己責任でお願いします。

効果

この方法なら次のような効果が得られます。

  • 1ファイルの行数が少なくなるのでファイル内を移動しやすい。
  • ファイル単体でのテストが用意なので、必要な部分だけに集中して開発を行える。(例えばボタン配置を調整するために全体をコンパイルする必要がない。)

あれー。以外に少なかった。(^ ^;

サンプル

まずは、呼び出し元のファイルと呼び出されるファイル2つのスクリプトの例をあげます。

main.hsp
呼び出し元 ファイル

#define _DEBUG_MODE
#include "test1.hsp"
#include "test2.hsp"
mes_test "モジュールのテスト"
gosub *Make_button

test1.hsp
呼び出される ファイル

// 
// このファイルのINCLUDE元は、必ず
// #define _DEBUG_MODE
// というようにマクロを登録しておく必要があります。
// 
#ifndef _DEBUG_MODE
	// TODO:ここにこのファイル単体での動作テスト用コードを記述して下さい。
	mes_test "単独動作テスト。"
	stop
#endif


#ifndef __MODULE_NAME__
#define global __MODULE_NAME__
#module 

////////////////////////////////////////////////////////////////////////////////////////////////////
//
//	命令サンプル
//
// [ Infomation ]
//	mes_test p1
//	[IN] p1 : サンプル
//
//	return : -
//
// [ comment ]
// モジュールのサンプル
//
#deffunc mes_test str p1
	mes "モジュール:" + p1
	return

#global
#endif	// __MODULE_NAME__

test2.hsp
呼び出される ファイル

// 
// このファイルのINCLUDE元は、必ず
// #define _DEBUG_MODE
// というようにマクロを登録しておく必要があります。
// 
#ifndef _DEBUG_MODE
	// TODO:ここにこのファイル単体での動作テスト用コードを記述して下さい。
	mes "単体テスト"
	gosub *Make_button
	stop
#endif

goto *@f

*Make_button
button gosub "test", *l_label
return

*l_label
	dialog "test"
	return

*@

main.hspを実行するともちろん3つのファイルがincludeで連結されて実行されます。
test1.hspやtest2.hspをそのまま実行するとサンプルスクリプトが起動します。

普通はモジュールやサブルーチンだけをまとめたファイルは単体で実行しても上手く動きません。 むしろ動いてしまうとincludeしたときにじゃまなんですよね。
呼び出されるファイルにサンプルを記述する場合は、「#if」を使うと便利ではあるんですが、 テストするときは#ifを探さなければいけません。

しかしこの方法であれば手軽にファイル単体のテストが行えます。#ifを探す必要もない。楽ちんです!
その分多少制約が出るわけですが…。

解説

ここで肝心なのは、
#define _DEBUG_MODE
です。
呼び出し元で_DEBUG_MODEをマクロに登録することで、各ファイルに埋め込まれたテストスクリプトが 単体で動作しないようにしています。

もう一つのポイントは、test2.hsp。これはサブルーチンをまとめたファイルです。
普通はサブルーチンをまとめたファイルは最後にincludeしないといけません。
最初にincludeするとその位置でサブルーチンが実行されてしまうからです。
私の場合これを、
goto *@f ~ *@
を呼び出される側に入れることで回避しています。
おかげでうかつに「*@」を利用できなくなったわけですが、私個人は全く使わないので問題ありません。

でもこうすることで、include命令を1箇所にまとめて記述することができます。
たくさんincludeするので管理が楽になるわけです。

何処が便利なんだ?という話

最近はツール開発が多いのですが、ツールを作る時はウィンドウがたくさん出来ます。
設定用のダイアログであったり、表示用や操作用などのウィンドウだったり…。 こういうのを1個のファイルに書いていると収集がつかなくなります。
そこで「1ウィンドウ=1ファイル」というわけです。
さらに1ファイル=1ウィンドウなので、そのファイルだけでウィンドウのデバッグや開発ができるわけです。
普通に全体を実行していたらそのウィンドウ開くまでボタンたくさん押さないといけなかったりしますしね。
と、こんな感じでこのやり方は便利なんです。(個人的には!)