GW企画 6回目 ERDからオブジェクト指向に対応

|

 前回は、ERDからJavaクラスを作成しロジッククラスで処理していましたが、ERDはデータベースに基づいた設計でありオブジェクト指向に反していると指摘しました。
今回は、オブジェクト指向を意識してソースを書き換えました。

 この企画の受講状況を各自で管理してもらおうと思い管理表をGW_firstJava.xlsからダウンロードできますので使ってもらえると各自の進行具合が分かります。学び終えた場所の「日付」に「Ctrl+;」を「時刻」に「Ctrl+:」を押せば終了した日付と時刻を記憶できます。PDF版はGW_firstJava.pdfからダウンロードできます。なお、ファイルはウィルスバスターでウィルスチェックしています。


6-1.インタフェースソース

BankCommon.java
package jp.co.ncad.gw.erd.common; // 共通に所属

/**
 * 銀行に関する共通インタフェース
 * 
 * @author arai
 */
public interface BankCommon {

    /**
     * 銀行名を返す
     * 
     * @return 銀行名
     */
    public String getBackName();

}

UserCommon.java
package jp.co.ncad.gw.erd.common; // 共通に所属

/**
 * ユーザに関する共通インタフェース
 * 
 * @author arai
 */
public interface UserCommon {

    /**
     * ユーザIDを返す
     * 
     * @return ユーザID
     */
    public String getUserID();
}

AccountTypeCommon.java
package jp.co.ncad.gw.erd.common; // 共通に所属

/**
 * 口座の種類に関する共通インタフェース
 * 
 * @author arai
 */
public interface AccountTypeCommon {

    /**
     * 口座の種類番号を返す
     * 
     * @return 口座の種類番号
     */
    public int getAccountTypeNumber();
}

AccountCommon.java
package jp.co.ncad.gw.erd.common; // 共通に所属

/**
 * 口座に関する共通インタフェース
 * 
 * @author arai
 */
public interface AccountCommon {

    /**
     * 口座番号を返す
     * 
     * @return 口座番号
     */
    public int getAccountNumber();
}

6-2.モデルソース

JavaBankModel.java

UserModel.java

AccountTypeModel.java

AccountModel.java

AccountManagementModel.java


6-3.ソースの解説

 今回は、新たに「例外処理」を導入しています。
例外処理とは、予測されるエラーが発生した場合の処理を決めておくことです。
書き方は、


try { 例外が起こると予想される処理 } catch (例外クラス 変数) { 例外が発生した場合の処理 }
のように書きます。
例えば、クラスはまだインスタンス化(オブジェクトが生成できていない)されていない時に「null」(空)を返します。
「null」の場合に、メソッドにアクセスすると「NullPointerException」が発生します。
対処するには、以下の

try { 例外が起こると予想される処理 } catch (NullPointerException e) { }
のように書くと「キャッチ」してくれプログラムが止まることなくそれ以降の処理が実行されます。

6-4.サンプルソース

Sample5_1.java
package jp.co.ncad.gw.erd.sample;

import jp.co.ncad.gw.erd.model.JavaBankModel;
import jp.co.ncad.gw.erd.model.UserModel;

public class Sample5_1 {

    // ここからスタート
    public static void main(final String[] args) {

        // ユーザ「ジャバ太郎」を作成
        UserModel javaTarou = new UserModel();
        javaTarou.create("java", "ジャバ太郎", "obj", "1980/1/1");

        JavaBankModel javaBank = new JavaBankModel();
        javaBank.addUser(javaTarou); // ユーザ登録

        javaBank.newAccount("pro", "普通預金"); // 存在しないユーザIDを選択すると・・・
        javaBank.newAccount(javaTarou.getUserID(), "特別預金"); // 存在しない口座の種類を選択すると・・・
        javaBank.newAccount(javaTarou.getUserID(), "普通預金");

        // 画面に情報を表示
        javaBank.viewScreen(javaTarou.getUserID());

        int javaAccNum = javaBank.getAccountNumber(javaTarou.getUserID());
        javaBank.addSaving(javaAccNum, 10000); // 預金を預ける

        System.out.println(); // 空行を表示

        // 口座情報だけ表示
        javaBank.viewAccount(javaTarou.getUserID());

    }
}
proはユーザの登録が行われていません
特別預金が存在しません。存在する口座の種類名を指定下さい
銀行名:ジャバ銀行
銀行住所:東京
ユーザID:java
ユーザ名:ジャバ太郎
パスワード:obj
生年月日:1980/1/1
口座番号:1
預金金額:0
口座の種類名:普通預金

口座番号:1
預金金額:10000
口座の種類名:普通預金
            

6-5.オブジェクト指向に対応して

 オブジェクト指向は、メッセージ(メソッド)と要素(フィールド)をクラスの中に1つとして定義する事から正規化されたERDに比べ冗長になってしまいます。
ですが、オブジェクト指向にする事によりクラス自体に意味を持ちクラスの存在がより明確に定義できます。
あまりオブジェクト指向を忠実に宣言しすぎるとより冗長になり重複部分が増えて処理速度、メモリに負担が掛かります。
他の言語に比べオブジェクト指向言語は特に設計の問題が重要で設計者やプログラマの力量にも大きく関わってくる事が分かったと思います。

次回は、6回のまとめをして終わらせようと考えています。