GW企画 4回目 ERDからクラスを作成しよう

|

 4回目は、3回目で作成したERDを元にクラスを作成します。

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

4-1.ERDからクラスへ

 クラスを作成する前に、インタフェースと言う「2つ以上の手順、技術、規格や仕様」を作成します。

ERDで主キーを設定しましたが、主キーは他のテーブルにも使われることからインタフェースにメソッドを決めておく必要があります。
メソッドとは、オブジェクト指向で言うメッセージに該当し「手続き」と訳されてクラスの中に定義します。
それでは順次見ていく事にしましょう。

4-2.インタフェースの作成

 インタフェースを作成するのは、ジャバ銀行、ユーザ、口座の種類と口座です。
メソッドを定義するのは、主キーの箇所で定義だけ行い処理の内容は書きません。

4-2-1.インタフェースのソース 

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

/**
 * 銀行に関する共通インタフェース
 */
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();

    /**
     * ユーザIDを設定
     * 
     * @param userID ユーザID
     */
    public void setUserID(String userID);
}
  

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

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

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

    /**
     * 口座の種類番号を設定
     * 
     * @param accountType 口座の種類番号
     * @return 口座の種類番号
     */
    public void setAccountTypeNumber(int accountTypeNumber);
}
  

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

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

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

    /**
     * 口座番号を設定
     * 
     * @param accountNumber 口座番号
     */
    public void setAccountNumber(int accountNumber);
}
  

 ソースを見てみるといくつか新しいのが出てきているので説明します。

4-2-2.パッケージ

 行の先頭に「package」と書かれていますが、これはパッケージといいクラスやインタフェースをグループごとにまとめる役目をします。
まとめる方法としては、作成者名、作成者が所属する名前、クラスやインタフェースの種類によって作成しています。
例えば、「jp.co.ncad.gw.erd.common」は、共通のERDプログラムでGWプロジェクトの作成者(所属名)を「ncad.co.jp」のグループとすると解釈できます。
パッケージの解釈やルールはプロジェクトごとにルールを決めておくのが一般的です。

4-2-3.インタフェースの構文

 インタフェースは、「interface」キーワードで作成して構文で表すと以下のようになります(プログラム規則)。
アクセス修飾子 interface インタフェース名 {
	メソッドを定義
}
インタフェース名は、クラス名と同じで単語の1文字目はすべて大文字です(Java主義)。

4-2-4.メソッド

 構文中にメソッドの定義と書いていますが、インタフェースではメソッドを定義するだけで処理は書きません。
メソッドを構文で書くと以下のようになります。
アクセス修飾子 戻り値 メソッド名(引数) {
	:
	:
}
 戻り値はメソッドの呼び出し元に対して返す値で「void」は何も返さないことを意味しています。
引数は、「型名 変数名」の形で「,」を指定する事により複数定義する事が可能です。

4-2-5.JavaDocコメント

 「/** */」は、「//」と同じコメントですが「JavaDoc」という「仕様ドキュメント」を自動で作成するために用いられます。
仕様ドキュメントとは、クラスやメソッドを集めたものをHTMLとし各情報を参照できるように管理しています。
「<br />」とコメント中に書かれていますが、「<br />」はHTMLでの改行にあたり仕様ドキュメントを作成すると指定した行が改行されます。
「@」以降に、「@return」または「@param」などを指定します。
「@return」は戻り値が何かを示し、「@param」は引数(メソッドに渡す値)が何かを示しています。

4-3.モデルの作成

4-3-1.モデルソース

JavaBankModel.java
package jp.co.ncad.gw.erd.model; // モデルに所属

import jp.co.ncad.gw.erd.common.BankCommon;

/**
 * Java銀行
* 銀行に関する共通インタフェース及び顧客に関する共通インタフェースを実装 */ public class JavaBankModel implements BankCommon { /** 銀行名 */ private String backName; /** 銀行住所 */ private String address; /** * コンストラクタ
* 要素の初期化を行います */ public JavaBankModel() { backName = "ジャバ銀行"; address = "東京"; } /** * 銀行住所を返す * * @return 銀行住所 */ public String getAddress() { return address; } /** * 銀行住所を変更する * * @param address 銀行住所 */ public void changeAddress(String address) { this.address = address; } /** * 銀行名を返す * * @return 銀行名 */ public String getBackName() { return backName; } /** * 銀行名を変更 * * @return 銀行名 */ public void changeBackName(String backName) { this.backName = backName; } }
  

UserModel.java
package jp.co.ncad.gw.erd.model; // モデルに所属

import jp.co.ncad.gw.erd.common.UserCommon;

/**
 * ユーザモデル
* ユーザに関する共通インタフェースを実装 */ public class UserModel implements UserCommon { /** ユーザID */ private String userID; /** ユーザ名 */ private String name; /** パスワード */ private String password; /** 生年月日 */ private String birth; /** * 生年月日を返す * * @return 生年月日 */ public String getBirth() { return birth; } /** * 生年月日を設定 * * @param birth 生年月日 */ public void setBirth(String birth) { this.birth = birth; } /** * ユーザ名を返す * * @return ユーザ名 */ public String getName() { return name; } /** * ユーザ名を設定 * * @param name ユーザ名 */ public void setName(String name) { this.name = name; } /** * パスワードを返す * * @return パスワード */ public String getPassword() { return password; } /** * パスワードを設定 * * @param password パスワード */ public void setPassword(String password) { this.password = password; } /** * ユーザIDを返す * * @return ユーザID */ public String getUserID() { return userID; } /** * ユーザIDを設定 * * @param userID ユーザID */ public void setUserID(String userID) { this.userID = userID; } }
  

AccountTypeModel.java
package jp.co.ncad.gw.erd.model; // モデルに所属

import jp.co.ncad.gw.erd.common.AccountTypeCommon;

/**
 * 口座の種類モデル
* 口座の種類に関する共通インタフェースを実装 */ public class AccountTypeModel implements AccountTypeCommon { /** 口座の種類番号 */ private int accountTypeNumber; /** 口座の種類名 */ private String accountTypeName; /** * 口座の種類名を返す * * @return 口座の種類名 */ public String getAccountTypeName() { return accountTypeName; } /** * 口座の種類名を設定 * * @param accountTypeName 口座の種類名 */ public void setAccountTypeName(String accountTypeName) { this.accountTypeName = accountTypeName; } /** * 口座の種類番号を返す * * @return 口座の種類番号 */ public int getAccountTypeNumber() { return accountTypeNumber; } /** * 口座の種類番号を設定 * * @param accountType 口座の種類番号 * @return 口座の種類番号 */ public void setAccountTypeNumber(int accountTypeNumber) { this.accountTypeNumber = accountTypeNumber; } }
  

AccountModel.java
package jp.co.ncad.gw.erd.model; // モデルに所属

import jp.co.ncad.gw.erd.common.AccountCommon;
import jp.co.ncad.gw.erd.common.AccountTypeCommon;

/**
 * 口座モデル
* 口座に関する共通インタフェース、口座の種類に関する共通インタフェースを実装 */ public class AccountModel implements AccountCommon, AccountTypeCommon { /** 口座番号 */ private int accountNumber; /** 預金金額 */ private long saving; /** 口座の種類番号 */ private int accountTypeNumber; /** * 口座番号を返す * * @return 口座番号 */ public int getAccountNumber() { return accountNumber; } /** * 口座番号を設定 * * @param accountNumber 口座番号 */ public void setAccountNumber(int accountNumber) { this.accountNumber = accountNumber; } /** * 口座の種類番号を返す * * @return 口座の種類番号 */ public int getAccountTypeNumber() { return accountTypeNumber; } /** * 口座の種類番号を設定 * * @param accountType 口座の種類番号 * @return 口座の種類番号 */ public void setAccountTypeNumber(int accountTypeNumber) { this.accountTypeNumber = accountTypeNumber; } /** * 預金金額を返す * * @return 預金金額 */ public long getSaving() { return saving; } /** * 預金金額を追加 * * @param saving 預金金額 */ public void addSaving(long saving) { this.saving += saving; } }
  

AccountManagementModel.java
package jp.co.ncad.gw.erd.model; // モデルに所属

import jp.co.ncad.gw.erd.common.AccountCommon;
import jp.co.ncad.gw.erd.common.BankCommon;
import jp.co.ncad.gw.erd.common.UserCommon;

public class AccountManagementModel implements BankCommon, AccountCommon,
        UserCommon {

    /** 銀行名 */
    private String  backName;
    /** ユーザID */
    private String  userID;
    /** 口座番号 */
    private int     accountNumber;

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

        return accountNumber;
    }

    public void setAccountNumber(int accountNumber) {

        this.accountNumber = accountNumber;
    }

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

        return backName;
    }

    /**
     * 銀行名を設定
     * 
     * @return 銀行名
     */
    public void setBackName(String backName) {

        this.backName = backName;
    }

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

        return userID;
    }

    /**
     * ユーザIDを設定
     * 
     * @param userID ユーザID
     */
    public void setUserID(String userID) {

        this.userID = userID;
    }
}
  

4-3-2.インポート

 インポートは、他のパッケージのクラスを利用するために「import パッケージ名.クラス名」で指定することにより、「パッケージ名.クラス名」を指定することなくクラスを識別してくれますが、同じクラス名が存在する場合には、導入していないクラスはパッケージからのフル指定で行わないといけません(プログラム規則)。

4-3-3.インタフェースの実装

 クラスでインタフェースを実装するには、「implements」を指定し実装したいインタフェース名を「,」で区切り指定します。
インタフェースを実装するとインタフェースで定義したメソッドを必ず実装(処理を記述)する必要がある為、同じインタフェースを実装したクラスはメソッドの定義を共通化できます。

4-3-4.メソッドの実装

 「this」はクラスを定義した要素を指定する事により引数からの変数名と区別しています。
「return」に戻り値の返す値を指定します。

4-4.サンプルの作成

4-4-1.サンプルソース

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

import jp.co.ncad.gw.erd.model.AccountManagementModel;
import jp.co.ncad.gw.erd.model.AccountModel;
import jp.co.ncad.gw.erd.model.AccountTypeModel;
import jp.co.ncad.gw.erd.model.JavaBankModel;
import jp.co.ncad.gw.erd.model.UserModel;

public class Sample4_1 {

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

        // Java銀行を作成
        JavaBankModel javaBank = new JavaBankModel();

        // ユーザを作成
        UserModel user = new UserModel();
        user.setUserID("java");
        user.setName("ジャバ太郎");
        user.setPassword("obj");
        user.setBirth("1980/1/1");

        // 口座の種類を作成
        AccountTypeModel accountType = new AccountTypeModel();
        accountType.setAccountTypeNumber(1);
        accountType.setAccountTypeName("普通");

        // 口座を作成
        AccountModel account = new AccountModel();
        account.setAccountNumber(1);
        account.addSaving(1000);
        account.setAccountTypeNumber(1);

        // 口座管理を作成
        AccountManagementModel accountMgt = new AccountManagementModel();
        accountMgt.setBackName(javaBank.getBackName());
        accountMgt.setAccountNumber(account.getAccountNumber());
        accountMgt.setUserID(user.getUserID());

        System.out.println("ジャバ太郎の銀行情報");
        System.out.println("銀行名:" + javaBank.getBackName());
        System.out.println("銀行住所:" + javaBank.getAddress());
        System.out.println("ユーザID:" + user.getUserID());
        System.out.println("ユーザ名:" + user.getName());
        System.out.println("パスワード:" + user.getPassword());
        System.out.println("生年月日:" + user.getBirth());
        System.out.println("口座番号:" + accountType.getAccountTypeName());
        System.out.println("預金金額:" + account.getSaving());
        System.out.println("口座種類名:" + accountType.getAccountTypeName());
    }
}
  
 
4-4-2.サンプルプログラムの実行
 パッケージを導入した場合は、今までの実行方法とは異なりますので説明通りに進めましょう。
・ディレクトリ構成を知る
現在「D:\GW_Java」の場合は以下のようにフォルダを配置する必要があるので確かめてみましょう。
\---jp
    \---co
        \---ncad
            \---gw
                \---erd
                    +---common
                    |       AccountCommon.java
                    |       AccountTypeCommon.java
                    |       BankCommon.java
                    |       UserCommon.java
                    |
                    +---model
                    |       AccountManagementModel.java
                    |       AccountModel.java
                    |       AccountTypeModel.java
                    |       JavaBankModel.java
                    |       UserModel.java
                    |
                    \---sample
                            Sample4_1.java
「コマンド プロンプト」の画面では以下のように指定します。

D:\GW_Java>javac jp\co\ncad\gw\erd\sample\Sample4_1.java
入力し終えたら「Enter」キーを押下する事によりコンパイルが始まりエラーが出力されなければ成功です。
それでは、実行をしてみましょう。
 
D:\GW_Java>java jp.co.ncad.gw.erd.sample.Sample4_1
ジャバ太郎の銀行情報
銀行名:ジャバ銀行
銀行住所:東京
ユーザID:java
ユーザ名:ジャバ太郎
パスワード:obj
生年月日:1980/1/1
口座番号:普通
預金金額:1000
口座種類名:普通

パッケージを導入すると実行するのに面倒ですが、大規模なプロジェクトではソースが
管理されパッケージを導入しない場合と比べて生産性が向上します。

4-4-3.サンプルソース何か変?

 サンプルソースは今回内容を確認する為に作成したもので実を言うとおかしいプログラムなのです。
どこがおかしいかと言うと画面に出力する時に、情報がリンクしていなくただ作成したオブジェクトをうまいように(サンプルではジャバ太郎の銀行情報)プログラム上で加工して出力しているだけです。
「口座管理」を無視して情報が管理できていません。

 次回は、ロジッククラスというクラスを作成しモデルクラスを有効に活用するプログラムを作成するので、お楽しみに!!

参考引用したWeb