









先日、私が所属しているWEB-DBチームのリーダから私が作成したWebで、リンク切れしているWebがあると言われました。
他のメンバー、先輩は見れているようで私も常に確認していましたが、リンク切れしていることはありませんでした。
リンク切れはたまたまだろうと思いながらも、作成したローカル上で「IE」、「Firefox」、「Safari」を使い調べましたが、試したブラウザでは、リンク切れしていませんでした。
そこで今度は、ローカル上ではなくサーバ上のWebを迂回していると、「Firefox」だけがリンク切れしているのを発見しました。
そう言えばリーダは商品説明のときに、「Firefox」を利用してることを思い出し「これだ!」と思い、リンク切れのURLを見ました。URLには、「ncad.co.jp/~arai/pro3seminar%5Cpro3seminar.html」と表示されます。
URLに「%5C」という文字が含まれていますが、「%5C」にリンクするWebは作成していませんので「%5C」が原因だと分かりました。「%5C」を「/」に変えると問題なく適切なWebが表示されます。
勘が鋭い方はもうお分かりでしょうか?URLを指定するときに、「/」ではなく「\」を使っていたのです。
なぜか(といっても作成したのは私ですが)、ひとつ階層を下がるときにだけ「\」を使っていたようです。階層を戻るときには、すべて「../」などのように指定しているのですが、Windowsの操作に慣れてしまったせいかもしれません。
タイトルに「\」の親切、不親切と書きましたが、タイトルの意図が分かったでしょうか?「Firefox」が親切か?不親切か?を決めるのではなく、どう思っていただくかを述べたかったのです。
「\」で指定しても正しく表示される「IE」や「Safari」の方が親切かと思うかもしれませんが、「Firefox」も場合によっては親切とも言えます。
「なぜ?」と聞かれれば、「\」はHTMLを作成する上では標準ではないからです。本来階層を表すのは、「/」であり「\」は「IE」や「Safari」がきっと「\」は「/」と書きたかったのだろうと気を使ってくれて「/」と認識してくれたのだと思います。
ローカル上でも「Firefox」は「\」指定だとリンクできないようにして欲しかったのですが、Windowsのローカル上では、「\」は階層を表すのでしょうがないですね。
まだ技術者とは名乗れませんが、「\」を「/」と親切に対応してくれるよりもせめて警告を表示してくれると開発する上ではありがたいですね。
なにかアプリを開発するときにでもできるだけ標準で作成したほうが、流用性は高くなります。
今回の問題は、「IE」を中心に作成していたため気づかなかった問題ですが、もし「Firefox」を中心に作成していたら「\」の問題はなかったかもしれません。技術者の中には、「\」で表示されないほうが親切と感じませんか?
ただ、表示すらされないというのはWebの作成者としては他の人に見てもらえないのは残念ですが。
「\」に対応したブラウザ、「\」に対応してないブラウザどちらが親切、不親切だと思いますか?
前回はDJUnitを使った単体試験を紹介しましたが、今回はWEBアプリケーションでよく使われるStrutsのアクションクラスのテストを楽に行うライブラリを紹介いたします。
StrutsTestCaseを利用することによってアクション単位にテストすることが可能でブラウザを開かなくても試験ができます。今まではアクションの試験は実際にブラウザを動かす必要があったため面倒なものでした。さらに画面から入力される情報をプログラム上で作成するので未入力でボタンを押したなどのバリデートのテストも同時行えます。
StrutsTestCase for JUnit
http://sourceforge.net/project/showfiles.php?group_id=39190
cactus(今回はStrutsTestCaseの中にあるjarを使いますので落とさなくても良いです)
http://jakarta.apache.org/cactus/downloads.html
【環境・バージョン情報】
OS:WindowsXP SP3
Eclipse:3.3.2
JDK:JDK1.5.0
StrutsTestCase:strutstest214-1.2_2.4.zip
Tomcat:6.0.16
struts:1.2
すでにhttp://localhost:8080/sampleでログイン処理後(セッションにユーザID格納)、一覧ページを開くような処理が実装されているとします。
StrutsTestCase for JUnitのページからダウンロードしたstrutstest214-1.2_2.4.zipのexamples\test.warに入っているjarの中身を利用します。
【新たに追加したLIB】
aspectjrt-1.2.1.jar
cactus-13-1.7.jar
commons-collections.jar
commons-httpclient-2.0.jar
junit-4.0.jar
strutstest-2.1.4.jar
WEB.xmlに記述を追加します。
【WEB.xmlの追加】
<!-- Cactus Servlet Redirector configuration -->
<servlet>
<servlet-name>ServletRedirector</servlet-name>
<servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
</servlet>
<!-- Cactus Servlet Redirector URL mapping -->
<servlet-mapping>
<servlet-name>ServletRedirector</servlet-name>
<url-pattern>/ServletRedirector</url-pattern>
</servlet-mapping>
以下のように記述したcactus.propertiesをsrc直下に置きコンパイルすればclassesにコピーされます。
【cactus.propertiesの中身】
cactus.contextURL = http://localhost:8080/sample
cactus.servletRedirectorName = ServletRedirector
cactus.enableLogging=true
そこで以下のようなテストプログラムを作成して、Tomcatプラグインを起動しつつ、JUnitで実行してみると
と無事にJUnitが完了できました。
setUpメソッドにログイン処理を書くことができることによって、ログインした状態で各ページのテストを実行することが可能です。これはわざわざブラウザでログインしないでテストできるので、シナリオを作ってテストするようなツールで実行するより早くテストが実行できるかもしれません。
最終的にはJSPも含めたブラウザからのテストをしないといけないのですが、アクションのテスト結果も出せなどと言われた場合や、余裕があるプロジェクトでは利用する価値はあるのではないでしょうか。
前回、viに関する記事を書いたので、それに続けて、私がよく使う機能を紹介したいと思います。
コーディングを行っているとよくコピー&ペーストを行うと思います。
その際は、単純にマウスで範囲選択して、コピー&ペーストを行うと言うのが一般的ではないかと思いますが、viの機能でもそのような事が出来ます。
利点は、キーボードから手を離す必要がなく、複数のコピーを保持しておけると言う点です。
まずは、単純に複数行をコピー&ペーストする例です。
例として、次のような3行が記述されているファイルを想定します。
---------------
ABC
DEF
GHI
---------------
この3行をコピーして、最終行の後にペーストします。
[Esc]キーを押してコマンドモードになっていると言う状態から始めます。
1. [1G] キーを押す。
意味: ファイルの先頭にカーソルを移動する。
2. [3yy] キーを押す。
意味: カーソル位置から3行を記憶する。
3. [G] キーを押す。
意味: ファイルの最終行にカーソルを移動する。
4. [p] キーを押す。
意味: 先程記憶した3行をカーソル位置の次の行に貼り付ける。
結果:
---------------
ABC
DEF
GHI
ABC
DEF
GHI
---------------
この方法ですと、別の行を記憶した場合、前述の3行は上書きされてしまいます。
コピー内容を保持しておく為には、名前付きのバッファにコピーする必要があります。
バッファの名前としては、アルファベット1文字が割り当てられています。
次にバッファbに3行をコピーしてペーストする例を記述します。
(条件は最初の例と同様です。)
1. [1G] キーを押す。
意味: ファイルの先頭にカーソルを移動する。
2. ["b3yy] キーを押す。
意味: バッファbにカーソル位置から3行を記憶する。
3. [G] キーを押す。
意味: ファイルの最終行にカーソルを移動する。
4. ["bp] キーを押す。
意味: バッファbに記憶した3行をカーソル位置の次の行に貼り付ける。
これにより、別の行を名前なしのバッファにコピーしてもバッファbの内容は保持されます。
これを応用し、複数のコピー&ペーストを行う例を記述します。
1行目と3行目をそれぞれバッファbとバッファcにコピーしてペーストします。
(条件は最初の例と同様です。)
1. [1G] キーを押す。
意味: ファイルの先頭にカーソルを移動する。
2. ["byy] キーを押す。
意味: バッファbにカーソル位置の行を記憶する。
3. [2j] キーを押す。
意味: 現在行から2行下にカーソルを移動する。
4. ["cyy] キーを押す。
意味: バッファcにカーソル位置の行を記憶する。
5. ["bp] キーを押す。
意味: バッファbに記憶した行をカーソル位置の次の行に貼り付ける。
6. ["cp] キーを押す。
意味: バッファcに記憶した行をカーソル位置の次の行に貼り付ける。
結果:
---------------
ABC
DEF
GHI
ABC
GHI
---------------
最後に複数行をコピーする場合の別の方法を紹介します。
前述では、3行をコピーしましたが、行数が多くなると、何行コピーしたいと言うよりはここからここまでコピーしたいと考えると思います。
その例として、ABCの行からGHIの行までをバッファbにコピーしてペーストする方法を記述します。
(条件は最初の例と同様です。)
1. [1G] キーを押す。
意味: ファイルの先頭にカーソルを移動する。
2. [ma] キーを押す。
意味: マークaにカーソル行の位置を記憶する。
3. [2j] キーを押す。
意味: 現在行から2行下にカーソルを移動する。
(実際は、何行下にあるか解らないので、jキー等の移動キーで、GHIの行まで移動する。)
4. ["by'a] キーを押す。
意味: バッファbにマークaの行からカーソル行までを記憶する。
5. [G] キーを押す。
意味: 最終行にカーソルを移動する。
6. ["bp] キーを押す。
意味: バッファbに記憶した行をカーソル位置の次の行に貼り付ける。
結果:
---------------
ABC
DEF
GHI
ABC
DEF
GHI
---------------
上記2で、カーソル行の位置を記憶しましたが、これは、コピーの場合だけでなく、カーソルの移動にも使用出来ます。使用方法は、'+マーク名で、上記の例ですと['a]を入力する事で、ABCの行にカーソルを移動出来ます。
長くなりましたが、この機能を使う事で、複数個所のコードを一箇所にまとめたり、記憶した内容を繰り返し利用する場合などに便利だと思います。
プログラミングを知ろう、学ぼうと言う企画で全7回説明してきましたが、7回目は6回説明してきた事やこれからどう勉�%B
前回は、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 (例外クラス 変数) { 例外が発生した場合の処理 }
のように書くと「キャッチ」してくれプログラムが止まることなくそれ以降の処理が実行されます。
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回のまとめをして終わらせようと考えています。
5回目は、4回目で作成したクラスを操作するロジッククラスを作成します。
この企画の受講状況を各自で管理してもらおうと思い管理表をGW_firstJava.xlsからダウンロードできますので使ってもらえると各自の進行具合が分かります。学び終えた場所の「日付」に「Ctrl+;」を「時刻」に「Ctrl+:」を押せば終了した日付と時刻を記憶できます。PDF版はGW_firstJava.pdfからダウンロードできます。なお、ファイルはウィルスバスターでウィルスチェックしています。
5-1.ロジッククラス
5-1-1.長いソースを理解するには
ロジッククラスは、300行近くあるので
JavaBankLogic.javaからダウンロードしてタイピングしないでそのまま使ってもらってもかまいません。長いソースを理解するには、自分自身で「main()」メソッドを作成し実際に動きを確認する方法が効果的です。
下のソースに、サンプルとして載せて置いたのでサンプルソースを見ながら進めるのもいいでしょう。
また、いっぺんに見ようとはせずメソッド単位を見れば大した処理では無い事に気づき他のメソッドも似たような処理とも分かります。
ロジッククラスで新しく加わった処理を説明していきます。
5-1-2.リスト
リストは、その名の通り一覧と言う意味ですが、Javaではリストを管理できるクラス「ArrayList」があります。
「ArrayList」は、「List」インタフェースを実装して「<>」の中に、格納するクラスを記述します。
例えば、ユーザをリストで管理したい場合には、「List<UserModel>」のように宣言時には、「List」を使いインスタンス化するときには、「ArrayList<UserModel>」で行います。
リストに追加するには、「set(追加する値)」となり、値に「UserModel」オブジェクトを格納します。
リストから取り出すには、「get(位置)」となり、追加した何番目かを指定してあげます。
リストから登録数を取得するには、「size()」で取得できます。
5-1-3.if文
プログラムがただ一方的に流れていては柔軟なプログラムが出来ませんよね。ではどうすればいいと思いますか。
それは、処理の流れを状況に応じて変えることが一番大きく影響しますよね。
Javaでは、if文を使用し状況に応じて適切な処理に振る事ができます。
書き方は、以下のように記述します。
if (条件式) {
:
:
}「条件式」が真の時にだけ「{}」の中を処理し、偽は「}」以降から処理します。
条件の式は「==」「!=」「<」「<=」「>」「>=」を使い、それぞれ「等しい」「等しくない」
「小さい」「以下」「大きい」「以上」を意味しています。
条件が合えば「true」という真の意味に、合わなければ「false」という偽の意味になります。
5-1-4.for文
リストのように1つ1つデータをif文で調べていくのは大変ですね。それではコンピュータを使ってプログラミングする必要性がありません。
for文は、決められた回数繰り返すのに、変数をうまく使い処理を繰り返しています。
書き方は、以下のように記述します。
for (最初に一回; 条件; 文の後に) {
文
}
サンプルプログラムの一番多い書き方は、for (int i = 0; i < リスト.size(); i++) { : : }で「int i = 0」でiの宣言をして0で初期化してリスト.size()まで繰り返しています。「{」から始まり「}」を過ぎると「i++」が実行されてiに1を足して繰り返します。
5-2.サンプルプログラムで実行してみよう
5-2-1.サンプルソース
| Sample4_1 .java |
|---|
package jp.co.ncad.gw.erd.sample;
import jp.co.ncad.gw.erd.logic.JavaBankLogic;
import jp.co.ncad.gw.erd.model.UserModel;
public class Sample4_1 {
// ここからスタート
public static void main(final String[] args) {
// ユーザ「ジャバ太郎」を作成
UserModel javaTarou = new UserModel();
javaTarou.setUserID("java");
javaTarou.setName("ジャバ太郎");
javaTarou.setPassword("obj");
JavaBankLogic javaBankLogic = new JavaBankLogic();
javaBankLogic.addUser(javaTarou); // ユーザ登録
javaBankLogic.newAccount("pro", "普通預金"); // 存在しないユーザIDを選択すると・・・
javaBankLogic.newAccount(javaTarou.getUserID(), "特別預金"); // 存在しない口座の種類を選択すると・・・
javaBankLogic.newAccount(javaTarou.getUserID(), "普通預金");
int javaAccNum = javaBankLogic.getAccountNumber(javaTarou.getUserID());
javaBankLogic.addSaving(javaAccNum, 10000); // 預金を預ける
UserModel user = javaBankLogic.getUser(javaTarou.getUserID()); // 銀行にユーザIDから自分の情報を貰う
System.out.println(user.getUserID() + "の銀行情報");
System.out.println("銀行名:" + javaBankLogic.getJavaBankName());
System.out.println("銀行住所:" + javaBankLogic.getJavaBankAddress());
System.out.println("ユーザID:" + user.getUserID());
System.out.println("ユーザ名:" + user.getName());
System.out.println("パスワード:" + user.getPassword());
System.out.println("生年月日:" + user.getBirth());
int accNum = javaBankLogic.getAccountNumber(user.getUserID()); // 口座番号を取得
System.out.println("口座番号:" + accNum);
System.out.println("預金金額:" + javaBankLogic.getSaving(accNum));
System.out.println("口座種類名:" + javaBankLogic.getAccountTypeName(accNum));
}
}
|
proはユーザの登録が行われていません 特別預金が存在しません。存在する口座の種類名を指定下さい javaの銀行情報 銀行名:ジャバ銀行 銀行住所:東京 ユーザID:java ユーザ名:ジャバ太郎 パスワード:obj 生年月日:null 口座番号:1 預金金額:10000 口座種類名:普通預金 |
難しいと感じたらロジッククラスに例えば以下のように追加してみましょう。
/**
* コンストラクタ
* 初期化処理
*/
public JavaBankLogic() {
System.out.println("コンストラクタ通過1");
javaBank = new JavaBankModel();
:
以下省略
一通り3回目で登場した文章の動作に近づきましたね。でも、Javaはオブジェクト指向でありDB設計のERDとは相反します。ERDは正規化を求めたのに対して、オブジェクト指向は要素とメッセージを一つに併せた考えです。
次回は、オブジェクト指向により近づける為にソースプログラムを変えて説明します。
参考引用したWeb
・KMG プロ3ゼミ Java入門講座 単位3 判断が分かるときは
・KMG プロ3ゼミ Java入門講座 単位4 処理を繰り返すには
4回目は、3回目で作成したERDを元にクラスを作成します。
この企画の受講状況を各自で管理してもらおうと思い管理表をGW_firstJava.xlsからダウンロードできますので使ってもらえると各自の進行具合が分かります。学び終えた場所の「日付」に「Ctrl+;」を「時刻」に「Ctrl+:」を押せば終了した日付と時刻を記憶できます。PDF版はGW_firstJava.pdfからダウンロードできます。なお、ファイルはウィルスバスターでウィルスチェックしています。4-1.ERDからクラスへ
クラスを作成する前に、インタフェースと言う「2つ以上の手順、技術、規格や仕様」を作成します。
ERDで主キーを設定しましたが、主キーは他のテーブルにも使われることからインタフェースにメソッドを決めておく必要があります。
メソッドとは、オブジェクト指向で言うメッセージに該当し「手続き」と訳されてクラスの中に定義します。
それでは順次見ていく事にしましょう。
4-2.インタフェースの作成
インタフェースを作成するのは、ジャバ銀行、ユーザ、口座の種類と口座です。| 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);
}
|
アクセス修飾子 interface インタフェース名 {
メソッドを定義
}
アクセス修飾子 戻り値 メソッド名(引数) {
:
:
}
4-3.モデルの作成
| JavaBankModel.java |
|---|
package jp.co.ncad.gw.erd.model; // モデルに所属 import jp.co.ncad.gw.erd.common.BankCommon; /** * Java銀行 |
| UserModel.java |
|---|
package jp.co.ncad.gw.erd.model; // モデルに所属 import jp.co.ncad.gw.erd.common.UserCommon; /** * ユーザモデル |
| AccountTypeModel.java |
|---|
package jp.co.ncad.gw.erd.model; // モデルに所属 import jp.co.ncad.gw.erd.common.AccountTypeCommon; /** * 口座の種類モデル |
| 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; /** * 口座モデル |
| 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-4.サンプルの作成
| 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 口座種類名:普通
パッケージを導入すると実行するのに面倒ですが、大規模なプロジェクトではソースが
管理されパッケージを導入しない場合と比べて生産性が向上します。
ジャバ銀行という銀行がありユーザは登録する事によりユーザIDごとに口座を作ることが出来ます。 銀行にユーザが登録できる数は制限がありませんが、ユーザIDは他と重複する事ができません。 ユーザは、ユーザID・名前・パスワード・生年月日の要素を持っています。 口座は、口座番号・預金金額の要素を持っています。 ユーザは、指定した口座番号、ユーザID及びパスワードを入力し一致したら預金の表示、
積み立て又は積み下ろしが出来ます。
文章を把握しないといけませんが、ただ読むだけではなく自分自身で言葉を変えたり整理してみるのも理解する近道です。
●3-1-3.文章から情報を抽出
文章から情報を抽出すると以下の図が導き出されます。
次からは、第一正規形、第二正規形、第三正規形の順で進めていくのですが、次の図は、非正規形とも言います。
背景が黄色で塗られている箇所がありますが、これは「主キー」といい主キーを指定すれば集合の要素から一意な要素を識別出来ます
図の「主キー」を1つでも指定しないと一意な要素を導き出来ません。
●3-1-4.第一正規形
第一正規形は、非正規形から繰り返しグループを取り除く事により正規化します。
次の図が第一正規形です。

●3-1-5.第二正規形
第二正規形は、複合主キーの1つのキーから導き出せる属性を取り除いた状態を指します。
次の図が第二正規形です。

●3-1-6.第三正規形
第三正規化は、主キー以外の項目から導き出せる属性を取り除いた状態を指します。
次の図が第三正規形です。

●3-1-7.ERD
ERDは、正規化されたテーブル同士を関連付けを図で示します。
以下の図がERDです。

テーブルの主キーを参照する側の主キーに矢印を向けています。
ERDを見る事により、テーブルがどこから参照しているかが分かり文章で説明するよりも関係がはっきりしている事が分かると思います。
さて、次回は、「ERD」からプログラミング(Java)がどう関係するのかを中心に説明したいと思っています。
お楽しみに!!
GW企画の2回目は、クラスの作成を通してJavaを学びます。
この企画の受講状況を各自で管理してもらおうと思い、管理表をGW_firstJava.xlsからダウンロードできますので、使ってもらえると各自の進行具合が分かります。学び終えた場所の「日付」に「Ctrl+;」を「時刻」に「Ctrl+:」を押せば終了した日付と時刻を記憶できます。PDF版も用意してありGW_firstJava.pdfからダウンロードできます。なお、ファイルはウィルスバスターでウィルスチェックしています。
// 社員クラス
class Employee {
String name; // 氏名
String affiliationName; // 所属名
String address; // 住所
String tel; // 電話番号
String birth; // 生年月日
String joinCompanyDay; // 入社日
}
「class」というキーワードが出てきました(1回目にも出てきましたが覚えていますか、忘れていても気にする事はありませんよ)が、オブジェクトは出てきていないじゃないかと思われるかもしれませんね。
でも、オブジェクトとクラスは密接な関係があるのです。
クラスは、オブジェクト(例えば物)を抽象化して定義した事だと思ってください。
例えば、人間の太郎や次郎をオブジェクトと取られると太郎や次郎を抽象化して人間として定義したのがクラスです。太郎や次郎のどっちかがサルなら人間ではなく動物として抽象化できますね(名前がややこしかったですね)。
先程の文章は、社員と言うオブジェクトを定義していたのでクラスの説明をしていたわけです。
社員のクラスには、定義だけされて中身(例えば、氏名で言えばジャバ太郎のように)が記述されていませんでしたね。
それでは、「社員クラス」の説明に入ります。
プログラム上で「class」というキーワードを指定して「Employee」のように、クラス名を指定すると、クラスを定義できます。
要素は「String name;」のように定義します。
「String」は文字列を扱う場合に指定し「name」と要素名を記述すれば「name」に名前を代入する事が出来るのです。
「//」には、日本語が記述されていて分かりやすいなと思われたかと思います。
プログラム上の「//」以降は、コメントとして扱われプログラマ(プログラム作成者)にだけ効果がありプログラムには無関係に扱われます。
ちょっとずつでも、社員クラスを理解できましたか。
ここで、「要素の行にある「//」の前に「;」は何を意味しているか」を考える方がいるかもしれません。
私の感覚では「;」を日常的に使っている為、説明するのを忘れてしまいました。
というのも「;」は、日本語で言うと「。」であり英語で言うと「.」に相当するからです。
プログラムを解釈するのは、コンパイラと言うソフトウェアですが適切な箇所に「;」がないとコンパイルエラーというエラーで教えてくれますのでまずは見様見真似で覚えてください。
社員クラス最後の説明は、「{」、「}」の2つですね。
コンパイラ(プログラムを解釈するソフトウェア)にどこまでがクラスの定義か教えてあげないといけませんから「{」で始まり「}」で終わる事を教えてあげれば素直にそれに従います。
「}」には「;」が対応して終わりが分かるからというように覚えておきましょう。
| Employee.java |
|---|
// 社員クラス
public class Employee {
String name; // 氏名
String affiliationName; // 所属名
String address; // 住所
String tel; // 電話番号
}
|
| Sample2_1.java |
|---|
// GW企画 2回目 サンプル1
public class Sample2_1 {
// ここからスタート
public static void main(final String[] args) {
Employee employee = new Employee(); // クラスをインスタンス化
employee.name = "ジャバ太郎"; // 氏名を設定
employee.affiliationName = "GW"; // 所属名を設定
employee.address = "sun"; // 住所を設定
employee.tel = "123456789"; // 電話番号を設定
// 出力
System.out.println("社員情報");
System.out.println("氏名:" + employee.name);
System.out.println("所属名:" + employee.affiliationName);
System.out.println("住所:" + employee.address);
System.out.println("電話:" + employee.tel);
}
}
|
C:\>title Java C:\>D: D:\>cd GW_Java\2 D:\GW_Java\2>javac Sample2_1.java D:\GW_Java\2>java Sample2_1 社員情報 氏名:ジャバ太郎 所属名:GW 住所:sun 電話:123456789 D:\GW_Java\2>
正しく出力されましたか。この手順はJavaを扱う基本操作なので覚えておいて損はありません。
「Sample2_1」クラスの説明をします。
「 // ここからスタート」というコメントの下に、「public static void main(final String[] args)」が記述されていますよね。
ここから見ていくと、注目すべき場所は「main」というメソッドです。
メソッドとは、クラスの手続きを表したものでオブジェクト指向で言う「メッセージ」に当たります。
「Sample2_1」クラスの手続きである「main」からスタートして処理を実行します。
Employee employee = new Employee(); // クラスをインスタンス化 employee.name = "ジャバ太郎"; // 氏名を設定 employee.affiliationName = "GW"; // 所属名を設定 employee.address = "sun"; // 住所を設定 employee.tel = "123456789"; // 電話番号を設定
を見ると「クラスをインスタンス化」と書いてありますが、インスタンスとは「実体」と訳され「クラスを実体化しろ」という処理をしています。
実体とは「オブジェクト」の事です。
オブジェクトに、氏名、所属名、住所及び電話番号を設定するには、「employee.name」のように書き、社員の氏名を指して「=」で右側の「"ジャバ太郎"」が代入されます。
「"ジャバ太郎"」のように文字列を表すには、「""」で囲みます。
設定が済みましたので画面に出力してみましょう。
文字列を出力するには、「System.out.println()」を使います。
これは、「システムを使い出力する内容は()の中身を(1)行で書き出せ」と言う意味です。
「println」は、print lineの略でプリント行と訳し、文字列を出力後には改行せよという処理です。
Javaには、「System.out.print()」も用意されており、lineが無いので行ではなく「()」の中身が表示され改行されない事に注意しましょう。
後は、「"氏名:" + employee.name」のように、「"氏名:"」に「employee.name」の中身が合わさり画面に出力されます。
今回は、どうでしたか?大変でしたか?
プログラミング入門者向けに書いていますが、実を言うと全7回でJavaの全部を説明するのは紙面上の理由からできていません。その為に凄い速さで解説してます。
今回分からない事があっても気にすることなく一通り残り5回を学びましょう。
例えば、「オブジェクト指向」を知っただけでも進歩ではないですか。
この2回だけの説明でも他の知らない人に比べて優位に立っていると自信を持ってください。
それに無料ですしね。
さて、次回は、「ERD」というデータベースに欠かせない手法を説明します。プログラミングと関係が無いと思うかもしれませんが、Javaを扱うにはERDも立派な勉強範囲です。
お楽しみに!!
分からない点がありましたら、コメントを気軽にして下さい。
又、プログラマーの先輩方、ここをこうした方がいいよという事がありましたら、お手数ですがコメントをしていただくとありがたいです。
参考引用したWeb
・KMG プロ3ゼミ Java入門講座 単位6
・KMG プロ3ゼミ Java入門講座 単位7
参考Web
・オブジェクト指向
・クラス (コンピュータ)