« [プログラム設計事始] 外部設計と概略設計 | トップページ | [プログラム設計事始] 外部設計と内部設計の狭間 »

2009年5月19日 (火)

[プログラム設計事始] メソッドの外部設計(1)

◆ シンプルなメソッド ~ 1入力 / 1出力 の場合

プログラムの本質と、 インターフェース部分を分けるということ」 では、 ロジック ( プログラムの本質 ) として、 「文字列 {foo} から、 "Hello, {foo} !" という文字列を作リ出す」 というものを考えました。
※ この 1文は、 ロジックの概略設計にあたります。

このロジックは非常に簡単だったので、
string BuildMessage(string targetName)
という 1つのメソッドとして実装できました。

このメソッドの外部設計を、 きちんと表現しようとするなら、 どんなふうになるでしょう?

外部設計 ( external design ) というのは、 外から見た設計です。
機械の設計では、 見た目 ( 外観 ) ・ 使い方 ( 外から見た機能 ) ・ 求められる強度などを定義します。 プログラムのロジックには見た目はありませんので、 主に外から見た機能を定義することになります。

では、 メソッドの外から見た機能は、 どのように定義すればよいでしょう?
単純なメソッドでは、 渡した引数を、 メソッド内部でなにやら加工してくれて、 返値として出力してくれます。 渡した引数というのは、 メソッドに対する入力と言いかえてもいいですね。

Program_design03_01
※ 単純なメソッドでは、 入力 ( 引数 ) を処理して、 結果を出力する ( 返値を返す )。

この入力と出力を、 すべて定義すれば、 外部設計の詳細設計をしたことになるわけです。
メソッド string BuildMessage(string targetName) の外部設計を、 表のカタチで書くと次のようになります。
※ 外部設計 ( に限らず、 ソフトウェアの設計 ) の成果物を、 例えば文章だけで書いても構わないのですが、 日本のソフトウェア業界では、 詳細設計を表形式で書くのが一般的であるようなので、 それに倣うこととします。

入力 出力
string targetName return
null (NullReferenceException)
"" (空文字) "Hello,  !"
"{foo}" (1文字以上) "Hello, {foo} !"

入力の文字列が null のときと、 空文字と、 それ以外の場合で、 出力が変わります。
入力が null の場合は、 出力が返らずに、 例外が出ちゃいます。 ( 例外オブジェクトを括弧で括って表記することとします。 )
空文字のときは、 "Hello,  !" となります。 ( これでは文章になっていませんが、 それで良い、 とします。 )
1文字以上の場合は、 ぜんぶまとめて一括りにして出力を定義できますよね。
これで、 ありえる入力のすべてに対して、 出力を定義したことになっています。

この設計の別案として、 空文字のときも例外にする、 ということも考えられます。 次のように書けますね。

入力 出力
string targetName return
null (NullReferenceException)
"" (空文字) (ArgumentOutOfRangeException)
"{foo}" (1文字以上) "Hello, {foo} !"

また別の設計として、 null と空文字のときは null を返す、 という考えもあるでしょう。

入力 出力
string targetName return
null null
"" (空文字) null
"{foo}" (1文字以上) "Hello, {foo} !"

これは、 次のように、 入力が null と空文字のときのケースをまとめて書いてもいいですね。

入力 出力
string targetName return
null または "" (空文字) null
"{foo}" (1文字以上) "Hello, {foo} !"


さて、 BuildMessage(string targetName) の入力 ( 引数 ) は文字列でした。
入力の型が違っても、 考え方は変わりません。 ありえるすべての入力に対して、 出力を定義してあげます。

例として、 整数の引数に対して、 次のような文字列を返すメソッドを考えてみます。
「0 から 5 までのときは "Good night" を返し、
  5 から 10 までは "Good morning" を、
  10 から 18 までは "Hello" を、
  18 から 20 までは "Good evening" を、
  20 から 24 までは再び "Good night" を返す。」
ここで、 「から」 はその数値を含み、 「まで」 はその数値を含まないものとします。
※ これは、 「整数で表した時刻に応じて、 挨拶の言葉を返す」 というメソッドです。

入力 出力
int hour return
負の値 (ArgumentOutOfRangeException)
0 <= hour < 5 "Good night"
5 <= hour < 10 "Good morning"
10 <= hour < 18 "Hello"
18 <= hour < 20 "Good evening"
20 <= hour < 24 "Good night"
24 <= hour (ArgumentOutOfRangeException)

このように、 文章で表現された概略には含まれていなかった、 負の値のときと 24以上のときを加えて、 すべての整数に対するメソッドの挙動を定義します。

|

« [プログラム設計事始] 外部設計と概略設計 | トップページ | [プログラム設計事始] 外部設計と内部設計の狭間 »

プログラミング」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/209349/45063479

この記事へのトラックバック一覧です: [プログラム設計事始] メソッドの外部設計(1):

« [プログラム設計事始] 外部設計と概略設計 | トップページ | [プログラム設計事始] 外部設計と内部設計の狭間 »