| 以上がプログラムの制御構造と制御構文ですが、関連することを・・・
実は、スパゲッティにならなければ何でもよいのか?というわけではないのです。
もう一つ重要なポイントは、ブロック化です。
分かり易く言えば、ブロック玩具のレゴ(LEGO)みたいにプログラムを作るということです。 ・・・・・・・・・・・・・・・・・・・・・・・・
以下のイベント処理(.kex)は何度も見ていると思います。
1.[名札 メイン ... *] 2.[手続き定義開始 cmdテストClick( ) ... 手続き定義終了] 3.[手続き定義開始 prc加工日探索( ) ... 手続き定義終了]
↑この3つが機能のブロックですね。
しかし、単に範囲という意味ではなくて[機能]という視点からのブロックです。 ・・・・・・・・・・・・・・・・ つまり、このイベント処理(.kex)には、3個の機能(ブロック)があるということです。
そして、機能のブロックを[モジュール]と呼びますよ。
┌名札 メイン │ │ ** フォームが開かれる時に必ず実行される機能のブロック │ └*
┌手続き定義開始 cmdテストClick( ) │ 変数宣言 自動,文字列{ &title = "cmdテストClick( )", &msg } │ 変数宣言 自動,日時 { &加工日1, &加工日2 } │ 変数宣言 自動,整数 { &multiTblNum } │ 変数宣言 自動,長整数{ &recordNum } │ │ │ &msg = "Start" │ &msg = &msg + "\n\nこれはテスト用のメッセージボックスです" │ &msg = &msg + "\n\n不要になったらコメントアウトしてください" │ メッセージボックス &title, &msg, アイコン = i, ボタン指定 = 1, 制御文字展開 = する │ │ 多重化 │ &multiTblNum = #is表 /* 多重化した表の表番号を取得 */ │ │ 解除 * │ 絞り込み [休日]{ [休日] = #u } │ ジャンプ 行番号 = 先頭 │┌繰り返し ( .not #eof ) ││ ││ &recordNum = #行番号 ││ 手続き実行 prc加工日探索( &加工日1, &加工日2 ) ││ ジャンプ 行番号 = &recordNum ││ ││ トレース出力 _[日付], " ", _&加工日1, " ", _&加工日2 ││ 行訂正 [加工日1] = &加工日1, [加工日2] = &加工日2 ││ ││ ジャンプ 行番号 = 次行 /* これを忘れると無限ループになります */ │└繰り返し終了 │ │ 終了 表 &multiTblNum /* 多重化した表を閉じる */ │ 編集表 &hwindow │ │ &msg = "Finish" │ &msg = &msg + "\n\nこれはテスト用のメッセージボックスです" │ &msg = &msg + "\n\n不要になったらコメントアウトしてください" │ メッセージボックス &title, &msg, アイコン = i, ボタン指定 = 1, 制御文字展開 = する │ │ *手続き定義終了 │ └end
┌手続き定義開始 prc加工日探索( 参照 日時 &加工日1, 参照 日時 &加工日2 ) │ 変数宣言 自動,文字列{ &title = "prc加工日探索( )", &msg } │ 変数宣言 自動,長整数{ &recordNum } │ │ &加工日1 = #u /* 参照引数を初期化 */ │ &加工日2 = #u /* 参照引数を初期化 */ │ │ &recordNum = #行番号 │ ジャンプ 行番号 = &recordNum │┌if ( &recordNum > 5 ) ││ ジャンプ 行番号 = -5 ││ &加工日1 = [日付] │└end │ │ ジャンプ 行番号 = &recordNum │┌if ( &recordNum > 7 ) ││ ジャンプ 行番号 = -7 ││ &加工日2 = [日付] │└end │ └手続き定義終了
もうひとつ大事なことは、3個の機能(ブロック)のうち2つの機能
cmdテストClick ← 上位の機能(モジュール) │ └ prc加工日探索 ← 下位の機能(モジュール)
は、実行するタイミングで、上位の機能(モジュール)と下位の機能(モジュール)と呼びます。
これは、呼び方が違うだけでメインルーチンとサブルーチンと全く同じものですよ。
上位モジュール:cmdテストClickの機能
・多重化した表の先頭から最後までジャンプすること
下位モジュール:prc加工日探索の機能
・加工日を探索して、変数に格納して、呼び出し元へ値を返すこと。
ということです。
このように、各モジュールで仕事分担をしています。
そして、ひとつのモジュールはひとつの機能を分担しています。 ・・・・・・・・・・・・・・・・・・・・・・・・
実は、初級者の場合このような機能の分割・分担の切り分けが上手に出来ません。
だって、慣れていないのですから当たり前です。
繰り返しになりますが、ひとつのモジュールはひとつの機能を分担するという事を常に念頭にしていれば、
上位の機能(モジュール)と下位の機能(モジュール)の関係で手続きが作れるようになりますよ。
そして、機能(モジュール)は一般手続きですから、同じイベント処理の別の機能(一般手続き・イベントハンドラ)からも呼び出せます。
また、一度作った一般手続きは、別のイベント処理でも再利用しやすくなります。
cmdテストClickの機能とprc加工日探索の機能を合体させた、ひとつの一般手続きを例示しようと思っていましたが、説明が長くなったので割愛します。
でも、合体させた場合には、プログラムが複雑にってしまって分かりにくくなるということはイメージできると思います。
<参考> 8.4 一般プロシージャをサブルーチンとして呼び出す|桐の釣魚大全のトップ > フォームアプリケーション教書 第1部 http://silicon7565.html.xdomain.jp/guide/guide_Part1.htm#section8-4
p.s.
今回話題にした[プログラムの制御構造]や[モジュラー設計]というのは、いわゆる[構造化プログラミング]と呼ばれるものです。
[構造化プログラミング]は、はるか昔から提唱されてきた考え方ですので、現代では特に[構造化プログラミング]が雑誌やネットで騒がれることはありません
また、[構造化プログラミング]とされる範囲は非常に広いので、今さら[構造化プログラミング]をお勉強される必要はないと思います。
非常に文章が長くなって恐縮ですが。アハハha (@^^)/~~~
|