Version 4.01
テストアプリの準備
『新章突入!』
「というわけで、今回から細かい部分について見ていきます。まずは、テス
トアプリの作り方から」
『テストアプリ?』
「たとえば、まだ使ったことのない MFC のクラスをフリーウェアに使いた
いと思ったとします」
『うん、思った』
「そういうときは、いきなり使うんじゃなくて、まずどんな感じかテストし
ます」
『試運転って感じねー』
「そういうテストをするためのが〈テストアプリ〉。今回は、いつも僕がし
てる方法を紹介します」
『それって一般的なの?』
「さあ。〈テストアプリを作る〉ってこと自体あんまり広まってないような
気がするんだけど、僕は大事だと思うから」
『まー試運転は大事よね』
「さて、まずは昔を思い出しつつプロジェクトを作成してみましょう」
『おー! えっと、まずメニューから【ファイル】−【新規作成】っと』
【新規作成】ダイアログが表示される。
『【プロジェクト】のページを開いて……【 MFC AppWizard (exe) 】で
いーの?』
「うん、いいよ。プロジェクト名だけど、〈テストアプリ〉ってことが分か
る名前がいいかな」
『んじゃ TestApp とか?』
「テストアプリってこの先いっぱい作るから TestApp01 みたいにした方が
いいかな」
『んじゃ番号付けて TestApp01 っと。【位置】はこの前のと同じ……じゃ
なくて、テストアプリっていっぱい作るんだから、専用のフォルダとか作っ
といた方がいい?』
「そだね」
『んじゃ作ってそこに位置をセット。そして OK !』
ダイアログが【 MFC AppWizard - ステップ1】に変わる。
『種類は?』
「今回もダイアログ」
『んじゃ【ダイアログ ベース】っと』
「そしたら終了」
『あら早いね。んじゃ終了』
【新規プロジェクト情報】のダイアログが表示される。
『 OK っと』
ダイアログエディタにダイアログが表示される。
「まず【 TODO 】コントロールと【 OK 】ボタンを削除して」
『ええっ、【 OK 】ボタン要らないの?』
「今回はテストアプリだからね。【キャンセル】ボタンさえあればいいから」
『はーい』
「で、そのキャンセルボタンは右下に」
『右下ねぇ』
「そしたらダイアログの形が縦長になるように横幅を狭めて」
『狭めて……』
「そしたら新しくボタンを左上に貼り付けて」
『【コントロール】ツールバーからボタンをドラッグアンドドロップ』
「ボタンの横幅を、ダイアログいっぱいまで広げて」
『横長ボタンにするってことね』
「ボタンのキャプションを【最初のテスト】に」
『右クリックメニューの【プロパティ】開いて、キャプションを書きかえて』
「そしたらボタンの右クリックメニューから【イベント】」
『イベントっと』
【クラス CTestApp01.Dlg 用の Windows メッセージおよびイベント ハン
ドラの新規作成】ダイアログが表示される。
「そのままの状態で【追加と編集】ボタン押して」
『あ、ボタン押したときに呼ばれる関数、作るんだ』
【メンバ関数の追加】ダイアログが表示される。
「そのまま OK 」
『 OK! 』
テキストエディタが開き CTestApp01Dlg::OnButton1() の中の TODO が選
択状態になっている。
『なるほど、このメンバ関数の中でテストするんだ』
「惜しいけど、ちょっと違うんだよね」
『そなの?』
「 CTestApp01Dlg::OnButton1() の中とそのちょっと前、こんなふうにして」
////////////////////////////////////////////////////////////////
// 最初のテスト。
namespace B1
{
void Test()
{
// TODO
}
} //B1
void CTestApp01Dlg::OnButton1()
{
B1::Test();
}
『ななななな、なんかよく分かんないんですけど……』
「そうだね、 namespace とか初見だよね」
『うんうん』
「じゃ、順を追って見てみましょう。えっとまず、基本的には【1ボタン
1テスト】って形」
『ってことは、テストしたいことができるたびに、ボタン貼って、ハンドラ
作って、って感じにすんのね。でもなんでメンバ関数の中に書かないの?』
「テストするときには〈自分でクラスを作る〉とかすることもあるからね」
『ええっ、 MFC みたいなクラス、自分で作るの!?』
「将来はね。クラスは関数の中に作れないから、テストも含めて、メンバ関
数の外ですることにします」
『それってつまり、 Test() って関数の中でするってことだよね』
「そういうこと」
『じゃーそのまわりのはなに?』
「 namespace のことだね。 Test() 関数が { と } で囲まれてるでしょ」
『うん囲まれてる』
「【 namespace 苗字】ってしてから、 { と } で関数やクラスを囲むと、
囲んだクラスや関数に【苗字】を付けられます」
『関数に苗字!?』
「この例だと苗字はなんになる?」
『 namespace のあとのだから、 B1 ってのが苗字だよね。……あ!』
「そう、 CTestApp01Dlg::OnButton1() の中で B1::Test() ってしてるよね」
『これって、苗字付きで Test() 関数を呼んでるってこと?』
「そういうこと。この namespace を使った方法を〈名前空間〉って言いま
す」
『なまえくうかん?』
「そ。苗字で包まれた空間、ってとこかな」
『でもさ、これってどんな意味があんの?』
「というわけで、もうひとつボタン貼って、イベントハンドラ作ってみて」
『はーい。えっと、ダイアログエディタを表示して』
「さっき貼り付けたボタンを【 Ctrl 押しつつドラッグ】で複製作ると楽だ
よ」
『お、ホントだ。キャプションは【2番目のテスト】にして、メニューから
【イベント】っと、んでボタン2回押して』
CTestApp01Dlg::OnButton2() が作成される。
「そしたらこのメンバ関数のまわりをこんなふうにして」
////////////////////////////////////////////////////////////////
// 2番目のテスト。
namespace B2
{
void Test()
{
// TODO
}
} //B2
void CTestApp01Dlg::OnButton2()
{
B2::Test();
}
『さっきのとかなり似てるね。違うのは、メンバ関数が OnButton2() にな
って、あ、【苗字】が B2 になった。で……関数の名前は同じだね』
「そう、関数の名前は同じ。でも、苗字が違うでしょ」
『うん、 B1::Test() と B2::Test() って。あ、これって別々の関数?』
「そういうこと。普通、同じ引数と名前の関数ってひとつしか作れないんだ
けど、名前空間を使うと」
『苗字が違うから、別の関数になるんだ』
「こういうテストアプリだと、テスト用の関数にわざわざ違う名前付けるの
って面倒だからね」
『そう? たとえば B1Test() とか B2Test() とかでもいいんじゃない?』
「関数ひとつならいいけど、ひとつのテストでいっぱいクラスや関数を作る
となると大変だからね」
『そっか』
「それに、テストで作ったものをあとでフリーウェアに使う場合とか、テス
トをやり直しするためにコピーしたりするときとかには、名前空間使った方
が楽だと思うよ」
『なるほど』
「あとは、雑誌とかのプログラムをテストするんでコピーするときとか……」
『はいはい、使えるのは分かったから。で、実際どんなテストすんの?』
「じゃ、次回のテスト」
void Address()
{
char ch = 1;
TRACE( "%d, %X\n", ch, &ch );
}
『???』
「ま、中身の解説は来週にして、今回はこの関数そのものについて。次回か
ら、こういうふうに〈テストをする関数〉だけ載せます」
『それをどう使うの?』
「たとえばさっきの Test() の代わりに置き換えてください」
////////////////////////////////////////////////////////////////
// アドレスのテスト。
namespace B1
{
void Address()
{
char ch = 1;
TRACE( "%d, %X\n", ch, &ch );
}
} //B1
void CTestApp01Dlg::OnButton1()
{
B1::Address();
}
『ほー』
「 Test() の部分を残して、 Test() から Address() を呼んでもいいけどね」
『2度呼ぶのって無駄な気もするけど……』
「ま、好きな方を選んで。重要なのは、テスト用関数は名前空間の中に、っ
てことだね」
『はーい』
/*
Preview Next Story!
*/
『で、 Address() ってなにしてんの?』
「まずはコンピューターの中身を見てみようと思って」
『というわけで次回』
< Version 4.02 メモリを見よう! >
「につづく!!」
『でもメモリなら見られるよ?』
「ってなんか懐かしいネタ振りだなぁ」
『って懐かしがんないでボケてよ』