[プログラム設計事始] メソッドの外部設計(1)
◆ シンプルなメソッド ~ 1入力 / 1出力 の場合
「プログラムの本質と、 インターフェース部分を分けるということ」 では、 ロジック ( プログラムの本質 ) として、 「文字列 {foo} から、 "Hello, {foo} !" という文字列を作リ出す」 というものを考えました。
※ この 1文は、 ロジックの概略設計にあたります。
このロジックは非常に簡単だったので、string BuildMessage(string targetName)
という 1つのメソッドとして実装できました。
このメソッドの外部設計を、 きちんと表現しようとするなら、 どんなふうになるでしょう?
外部設計 ( external design ) というのは、 外から見た設計です。
機械の設計では、 見た目 ( 外観 ) ・ 使い方 ( 外から見た機能 ) ・ 求められる強度などを定義します。 プログラムのロジックには見た目はありませんので、 主に外から見た機能を定義することになります。
では、 メソッドの外から見た機能は、 どのように定義すればよいでしょう?
単純なメソッドでは、 渡した引数を、 メソッド内部でなにやら加工してくれて、 返値として出力してくれます。 渡した引数というのは、 メソッドに対する入力と言いかえてもいいですね。
※ 単純なメソッドでは、 入力 ( 引数 ) を処理して、 結果を出力する ( 返値を返す )。
この入力と出力を、 すべて定義すれば、 外部設計の詳細設計をしたことになるわけです。
メソッド 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以上のときを加えて、 すべての整数に対するメソッドの挙動を定義します。
| 固定リンク
「プログラミング」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
この記事へのコメントは終了しました。
コメント