Java はじめて16 〜クラス設計から実装〜

今回は、クラスの設計〜実装までの簡単な流れを記載したいと思います。いよいよオブジェクト指向プログラミングの始まりです。

オブジェクト指向

よく世間巷では「オブジェクト指向言語」などという言葉が使われていますが、これは「オブジェクト指向で作りやすい」という意味です。オブジェクト指向言語(今回はJava)で非オブジェクト指向プログラミングをすると下のようになります。

public class Sample_Array {
    public static void main(String[] args) {
        // 1次元配列
        String[] lv1Array = new String[] {"a", "b", "c"};
        // 2次元配列
        String[][] lv2Array = new String[][] {{"a", "b", "c"}, {"d", "e", "f"}};
        // 3次元配列
        String[][][] lv3Array = new String[][][] {
            {{"a", "b", "c"}, {"d", "e", "f"}}
            ,{{"g", "h", "i"}, {"j", "k", "l"}}
            ,{{"m", "n", "o"}, {"p", "q", "r"}}
            };
        // 1次元配列を表示する
        System.out.println("*** 1次元配列を表示 ***");
        for (String nakami : lv1Array) {
            printf("", nakami);
        }
        // 2次元配列
        System.out.println("\n*** 2次元配列を表示 ***");
        for (String[] nakamiLv2 : lv2Array) {
            for (String nakami : nakamiLv2) {
                printf("", nakami);
            }
        }
        // 3次元配列
        System.out.println("\n*** 3次元配列を表示 ***");
        for (String[][] nakamiLv3 :lv3Array) {
            for (String[] nakamiLv2 : nakamiLv3) {
                for (String nakami : nakamiLv2) {
                    printf("", nakami);
                }
            }
        }
    }

    private static void printf(String label, String value) {
        System.out.print(label + "" + value);
    }
}

ポイントとしては、以下の部分がオブジェクト指向プログラミングではありません。

  1. プログラムのほとんどを1つのメソッドに書いているので、変更を加えようとすると必ずこのファイルを修正しないといけません。
  2. 処理の内容が少ないので問題ありませんが、処理が分割されておらず「〜の処理はXXXにまとめる」というように処理が分割されていない。

結局は小さなプログラムではあまり効果がないのですが、何かのアプリケーションを作成しようとした時に威力を発揮します。

簡単なアプリを作る

コンソールアプリになりますが、簡単に作成して行こう思います。まずは設計です。

UMLで設計関連のページ

詳細部分に関しては上記のリンク先を参照していただきたく思います。が簡単に「ATMのようなアプリケーション」を作成してみようと思います。

全体の流れ(ユースケース)

「全体の流れ」と記載しましたが、「人が使うときの流れ=ユースケース」になります。
実際のATMとはかけ離れてしまいますが。。。

<ユースケース>
【前提】

  1. コンソール画面のATMとします。
  2. ユーザー認証は行いません。
  3. 単純に金額を入金、引き出しができるものを作ります。

【仕様】

  1. アプリを起動してコンソールから「引き出す」「入金」を選択する
  2. それぞれの処理に対して「預金額」から足し算、引き算を行いその結果を表示する

仕様としては単純なものです。これをサンプルとして作成することを考えます。

必要な機能を考える

はっきり言ってこの部分には「正解」というものがありません。
ある意味「なんでも良い」のかもしれませんが、なるべく効率の良いものを作りたいと思うのが人情です。
そのために必要なことは以下のようになります。

無駄な処理を行わない

ということです。そのためにクラスを作成し役割分担を行います。
上のケースで行くと、以下の要件が出てきます。

  1. 「引き出し」と「入金」の2つをハンドルする処理が必要
  2. 「引き出し時の処理」と「入金時の処理」が必要
  3. 最終的にコンソールへ出力する処理が必要

大雑把に3つの要件が出てきます。

要件を満たす部品を考える

【前提】
コンソールアプリなのでメインメソッドを動かす中で全ての作業(入金、引き出しなど)を表現します。
<部品候補>

  1. メインメソッドを持ち、入力の受付も行うクラス
  2. 入金、引き出しを行う計算処理クラス

大雑把に2つの部品を作る事で、役割を分担し、要件を満たすことができそうです。

今回はここまでにします。でわでわ。。。