新人教育用のメモ。
プログラム設計で大切なこと
おしごとでプログラミングをする場合、SEが書いた仕様書をもとにプログラムを組みます。
たいてい仕様書には実装方法ではなく実装させたい機能(表に見える結果)しか記述されていないので、プログラマ側がソースレベルのプログラム設計を行う必要があります。
プログラム設計を行うとき、個人的には以下の3点が重要だと思っています。
1. 処理フローのをパターン網羅する
2. 処理に使うデータの発生場所をつかむこと
2. データの変更箇所を把握すること
これについて少し語ります。
※GUIアプリ(Windowsアプリ)開発の話です。C#てきな言い回しをします。
※要は入力フォーム(テキストボックス)とかボタン等が配置された画面が出てくるプログラムです
1. 処理フローとパターンをつかむ
GUIアプリのフローは基本的には以下のようになっています。
(起動) → 初期処理 → 画面表示 → (イベント発生) → イベント処理 → メソッド(関数)を呼ぶ等... → 画面表示に戻るor終了
イベントとはユーザの操作にをきっかけに発生する処理です。
ボタンをクリックした時とか、入力フォームに文字を入力した時とかのことです。
あえて初期処理と書いていますがこれも起動時のイベント処理です。
つまりユーザの操作次第でプログラムの動きが変わります。これをイベントドリブンとか言います。
ということはイベント発生時の状態は何通りもありえるわけで、この辺を考慮して設計しないとバグが発生します。
例えば[単価]と[数量]の項目に入力があった時、自動で[金額]項目に単価×数量を計算するという仕様があるとしましょう。
この時に[単価]と[数量]の入力時に
「[単価]と[数量]に入力された値を数値に変換して、乗算した値を[金額]にセットする」
という機能を実装するだけじゃだめなんですね。
このままだと[単価]を入力したときに[数量]が入力されていなかった場合、どうしたらいいと思いますか?
[単価]と[数量]どちらかが入力されていない場合は金額は計算しないとか、
そもそも空欄の場合はエラーが出て入力させなおすとか、
空欄の場合は0にしてしまうとか、
そういった視点が必要になります。
仕様書に書いてない場合は、SEに相談する必要があります。
上の例のような簡単な内容だったら深く考えなくてもわかると思いますが、複雑な仕様になるとパターンが増えて、抜け漏れが発生しやすくなります。
なので、フローとパターンは意識しておいたほうがいいでしょう。
で、そのパターンを割り出すために、2. データの居場所、変更されるタイミングを把握するが必要になります。
2. データの居場所、変更されるタイミングを把握する
GUIなんでデータの居場所もいっぱいあるんです。
* コントロールの値(入力フォームとかテキストボックスに入力された値)
* メソッド(関数)の引数
* メソッド(関数)内で定義した一時変数
* メンバ変数(画面内のグローバル変数みたいなもの)
* DBに格納されている値
* (WEBだと隠し項目、セッション、クエリ文字列もあるね…)
データの居場所に応じて、発生・変更されるタイミングが異なります。
* コントロールの値:初期値、ユーザによる入力、イベント処理による変更
* メソッドの引数、一時変数:メソッドが呼び出された時、メソッド内の変更
* メンバ変数:初期値、イベント処理による変更
* DB:更新された時(ほかのプログラムから更新される可能性もあり)
という感じで、データによって変更されるタイミングがまちまちです。
つまり、イベント発生時のデータの状態は、様々なパターンがありうるのです。
1.の例でいうと、[単価][数量]のコントロールの値の組み合わせだけでも
[単価]、[数量]どちらも初期値
[単価]がユーザによって入力された値、[数量]が初期値
[単価]が初期値、[数量]がユーザによって入力された値
[単価]、[数量]どちらもユーザによって入力された値
の4パターンが存在することになります。
さらに[単価]や[数量]が数字以外の「a」などが入力された場合、マイナス値が入力された場合、などを考慮する必要がある場合、さらにパターンが増えたりします。
ここで金額を計算するロジックをメソッド化した場合、引数として入ってくる値のパターンを考慮する必要があります。
このパターンを減らすために、入力される値を制限するような仕組み(入力パターンを制限するためにドロップダウンリストにする、誤った値が入力された時にエラーを出す等)が採用されたりします。
この仕組み自体に欠陥があるとバグが発生するので、仕様によって生じるパターンを正確に把握できるようになりましょう。
まとめ
プログラム設計を行うとき、以下の3点を意識しましょう!
1. 処理フローのをパターン網羅する
2. 処理に使うデータの発生場所をつかむこと
3. データの変更箇所を把握すること