作成日 2009/1/18 最終更新日 2010/8/6
オブジェクト指向関連以外の設計について
オブジェクト指向ばかり勉強していると、オブジェクト指向をマスターすればプログラムの設計が出来てしまうような錯覚に陥ってしまうような気がします(※1)。しかし、それでは足りないんです(足りる場合もありますが)。
このページではプログラムというかシステムの設計において、他にどのような設計が必要かを紹介しようと思います(※2)。
あ、もしかしたら抽象的な話になってつまらないかもしれない。すまん。
-----
※1:少なくともだるまはそうでした。
※2:詳しいことは、さすがに紹介し切れません。申し訳ないです。
オブジェクト指向設計は、まあ、クラス図にメソッドを定義するし、シーケンス図を使えば、処理の細かいところまで設計することは出来る。
しかしどうしても出来ないこともある。
たとえば、金融関連のプログラムだと利息計算をしたり現在価値
を計算することがあるのではないかと思います。他にも技術的な数式を扱う場合に、あらかじめ与えられた数式を解いておかないといけない場合もある。
この数式を解くと言うのは、オブジェクト指向設計の範囲外だと思います…。数式を解いた後で、プログラムで使用するデータのデータ設計などはオブジェクト指向設計に含まれるとは思いますが。
■例1:
だるまがM 円のお金を銀行から借りたとする。利息はp (/月)(0≦p (※1))で返済方式は元利均等方式 とする。毎月R 円返済していくとき、元金の推移を出すプログラムを作成するときに使用する数式(漸化式
)を求めよ。なお、利息を計算する際は、小数点以下は切り捨てるものとする。
元利均等方式なので、まず返済のR 円でその月に発生した利息([pM] (※2)円とする)をすべて払う。そして余ったお金(R-[pM] )円を元金の返済に充てる。)
返済開始からの月数をi とすると
M0 =M
M1 =M0 -(R-[pM0 ])
M2 =M1 -(R-[pM1 ])
:
と考えていくと、
Mi+1 =Mi -(R-[pMi ])
という式がでる。
ただし、最後の場合は返済金額がR 円にならない(利息+元金がR 円に満たない)場合もあり、このままだといつかMi+1 がマイナスの値になってしまうので、
Mi+1 =Mi -(R-[pMi ]) …Mi + [pMi ] ≧Rの場合
=0 …それ以外の場合
とするのが良いと思う(※3)。
この例はまだ簡単な方なので、実感がわかないかもしれないけど、他にボーナス払いや繰上げ返済などを考えたり、支払い月数から返済金額を求めたいときなどを考えるとややこしくなってくると思います。
うまく説明できないのですが、この場合はメソッド内の設計(※4)をするために必要な設計ですね。
-----
※1:実際には
利息制限法 によりpの上限がある。利息制限法がどうなっているかを調べる(調査する)のもプログラムを作るうえでは重要です。
※2:[x]はxを超えない最大の整数とする。とにかく、利息を計算するときは小数点以下を切り捨てるということを数式で表現したかったのでこの記号を使用しました。詳細は「
床関数と天井関数 - Wikipedia
」を参照してください。
※3:この
漸化式
を解くのは(
Mi = f(i)
の形にするのは)無理です。小数点以下を切り捨てるのを考えなければ、解けると思いますが。
※4:この後、この数式をもとに、
フローチャート を作成することになると思います。
何が言いたいのかと言うと、メソッド内の設計と言うのはオブジェクト指向設計というよりは
構造化プログラミング (順次、反復、分岐や処理の分割(サブルーチンの定義))に対する設計です。
オブジェクト指向を勉強すれば、構造化プログラミングは勉強しなくて良いと思っている人はいないでしょうか?それは間違いです。
画面クラスの設計はオブジェクト指向設計の範囲だと思いますが、画面のレイアウトの設計や入力項目の定義などは別だと個人的には思っています。
■例:
図1は「ワードドキュメントを検索して一覧表示
」の[検索]画面の画面設計です。
※0.1.0を作成している段階のもので、現在の0.1.0の仕様とは異なっている部分があります。
画面のレイアウトは極力Wordの[検索と置換]ダイアログに似せる形とするように考えていたため、[検索と置換]ダイアログから変更されるがわかるような形で書きました([検索と置換]ダイアログを元にして設計しました)(※1)。
図1 画面設計の例(クリックすると拡大して表示します)(※1)
図1では書かれていませんが、入力文字列の文字数、入力チェックはきちんと定義する(設計する)必要があります。
チェックボックスのON、OFF制御を行うタイミング、リストボックスに表示される文字列一覧の定義なども定義する(設計する)必要があります。
当然のことですが、画面を設計をする際は使いやすいようにした方がいいです。
具体的には下記の原則にそくした形が良いと思います。
・ノーマン原則
・シュナイダーマンの8原則
上記の原則について知りたい場合は、科学技術振興機構 が行っている以下のeラーニング をやってみてください(無料です)。
・ヒューマンインターフェースコースの「1.ヒューマンインターフェースとは
」
それから、ユーザビリティ ももちろん重要です。
-----
※1:設計書が汚い…。図1については設計書というより検討資料といった方がわかりやすいかもしれない。
会社では、最終的にはお客さんに納品する場合があったり、設計者と実装者が異なる場合があるので、もっとわかりやすくする(画面設計書の画面イメージはかなり完成後のものに近いものでないと駄目かもしれない)必要があると思う。
設定ファイルや他のシステムとの連携で使用されるファイルの設計、ログファイルの設計などです。
ファイルを読み込んだ後のデータの関連の設計やファイルに定義する項目の設計はオブジェクト指向設計の範囲だと思いますが、ファイルそのものの設計(ファイルの場所はどこか?名前はどうするか?文字コード は何か?CSV 形式か?XML
か?WindowsのINIファイル形式化?データ型はどうするか?)は別だと思います。
■例:
図2は「ヘッダコメントの挿入 」アドインのファイル設計です。ファイルの定義場所、ファイルに記載するデータについての設計がされています。
図2 ファイルの設計の例(クリックすると拡大して表示します)
趣味でプログラムを作る際はまずデータベース なんて使わないと思うけど…。
ER図の作成、インデックスの設計(※1)、データ量見積もり(ちゃんと余裕を見てね)、データベースの領域、バックアップ
の種類(※2)や頻度などは考えた方が良いと思う。
-----
※1:インデックスを作成すると、検索スピードは上がるが、データの更新や追加、削除に時間がかかるようになる。
※2:フルバックアップ、差分バックアップなど。それぞれ、バックアップにかかる時間、バックアップデータの量、リストアにかかる時間が異なる。
趣味で作るプログラムは、多くの場合、インストールされたPC上でのみ動作する(他のPCと連携しない)ので関係ないはずだけど。
ネットワークの構成(ネットワーク構成、データ量の見積もり(トラフィックの見積もり(※1))、使用するプロトコルの調査、DMZ
、セキュリティ…)を考える…かもしれない。
…すまん。ネットワークは得意ではないのでこれくらいしかわからない。
-----
他の要素(ファイル設計、画面設計…)と一緒に考えるべき内容と言う気もします。
これ単体で考えてもうまくいかないのですが、大事なので、項目としてあげました。
例えば、画面設計時にはユーザが入力ミス
しにくい設計にしたり、プログラムを作るときに、SQLインジェクション
が起こらないようにするとか。
設計ではないかもしれませんが、設計する上で非常に重要となるのであえて挙げました。
趣味で作るプログラムは一から作るか、過去に自分が作ったものの改良が多いので、あまり関係ないかも。
ただ、だるまもあったんだけど、大学などで過去に先輩が作ったプログラムを直したり機能を追加していくことはあるかもね。
その他、よーく考えないとバグにつながりやすいところ、その他リスクのあるところは別途設計するときが多いです。
書籍やHPをみると、「基本設計では業務フロー、システム構成図、ER図 …を作成する」、「詳細設計書はフローチャート
…を作成する」と書いてるかもしれません。
これはこれで、非常に大事です。
だけど、個人的には、まず、「なぜ、「基本設計では業務フロー、システム構成図、ER図…を作成する」となっているのか?、なぜ「詳細設計書はフローチャート…を作成する」となっているのかを考え、リスクのある箇所はそれをなくすためにも書籍に書かれていない設計も行うことがが重要だと思います(※1、※2)。
例えば、スレッド はUMLのシーケンス図
でも表現できますが、スレッド周りのバグが怖い(テストで発見されず、しかも原因究明が難しい)ので、他にも考えをまとめられるような資料を作成するようなこともあると思います。
-----
※1:わざわざ、これを書いたのは、書籍やHPに書いてあることをやれば十分だと思っている人が多いためです。そういう人が作成した設計書は中身が薄い…。
どうしたらリスクを回避できるかを考えて、本当に必要な設計は何かを考えないとダメです。
もう少し具体的に言うと、ある設計をやることによって、プログラミング工数やテスト工数、運用担当者への引継ぎ時の工数が減らせたり、仕様バグなどの発生による手戻りが少なくなると考えられるのであれば、その設計は行った方がいいです。逆に設計をしてもメリットで何も無いと考えられるような設計は、本当に必要かもう一度考えた方がいいかもしれません。
例えば、「自分が疑問に思ったところ、わからかったところを設計書に書け。そういう箇所は他の人も疑問に思うし、わからないと思うから。」と言う人がいますよね。これは正しいと思います。疑問に思うような箇所は仕様バグにつながりやすいですから。
※2:しかし、実際にはリスク以外にも考慮する必要があります。例えば、納品物かどうか。納品物に指定されている設計書は、もちろん、作成する必要があります。
このページを作成する際に参考にしたページや書籍などです。
このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方は
メール をお願いします。
Microsoft 、Windows 、Visual Basic 、 Word および Excel は米国Microsoft
Corporationの米国およびその他の国における登録商標または商標です。
ここではWord® をワード
、Excel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。 Mac
、Mac OS 、Mac OS X は米国Apple Computer,Inc.の登録商標または商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。
このホームページの作成者はこれらの会社とはいっさい関係がありません。