企画物の最近のブログ記事

 アンケートシステムの番外編です。番外編を書く暇があったら、アンケーシステムを完成させろよと言われそうですが、気にせず書いていきます。

 以前の記事でアンケートシステムを簡略化すると書きましたが、どれくらい簡略化するかと言うと、一つしかアンケートを出来ないようにします。アンケートごとに関する表示を作成するのが面倒くさいので。メニューにするとこんな感じです。

1.アンケートの作成
2.アンケートの投稿
3.項目の一覧を表示
4.アンケートを削除

「1.アンケートの作成」で作成又は修正する感じです。作り的には、後々複数投稿するシステムに変更するのに、それほど難しくない作りだと思います。Rubyでプロトタイプをぼちぼちと作成しているのですが、作成して思った事を今回の記事では書きます。

 

 Javaで作成する事に慣れているので、やはりオブジェクト指向で考えてしまいます。Rubyもオブジェクト指向ですが、Javaとは違う箇所やJavaの作りでは出来ない処理も出来てしまいます(Rubyではそのような作りになっているので当然ですが)。

Javaでは、すべての作りがクラスで作成するようになっています。ちょっと待てよ、インタフェースは?と思う方もいるかと思いますが、インタフェースでは処理は作成できません。C言語でも、C言語はすべて関数で作成されているといった場合に、ヘッダファイルやマクロがあると反論しないと思います。実際マクロや構造体を処理するのは関数の中ですから、C言語はすべて関数で作成されているのだと言えます。マクロの定義は、オブジェクトファイルですべて置き換わっていますし、構造体はメモリ上に領域が確保されるだけです。

今、考えているのは、画面の情報を画面フォームオブジェクトに格納し、実際処理を行って、DBに格納するポーターオブジェクトに代入します。ポーターオブジェクトを使いDBで処理を行います。DBからデータを取ってくる場合は、この考え方の逆で行います。列挙すると以下の感じです。

1.画面から情報を受け取り、画面フォームオブジェクトに格納する。
2.画面フォームオブジェクトのデータを使い、処理を行う。
3.画面フォームオブジェクトをポーターオブジェクトに代入する。
4.ポーターオブジェクトのデータを使い、DAOでDBの処理をする。

上記の考えは、MVCの考え方や三層構造の考え方です。

画面フォームクラスは、画面の情報を基に作成されます。画面とプログラム(VIEW)のデータの橋渡しです。変数名や日本語名は画面名から導き出します。画面が変更されれば、画面フォームクラスも変更されます。又、DBのテーブルや項目の変更に影響されません。

ポータークラスは、DBの情報を基に作成されます。DBとプログラム(DAO)のデータの橋渡しです。変数名や日本語名はDBのテーブルや項目から導き出します。DBのテーブルや項目が変更されれば、ポータークラスも変更されます。又、画面の変更に影響されません。

作りとしては、オブジェクト指向の考え方に合致していますね。

 考え方として問題となっているのは、処理の部分です。オブジェクトで共通する処理がある場合を考えていきたいと思います。Javaでは、共通した処理を使いたい場合に、しばしば親クラスを作成し、継承させてクラスを作成します。それが、「is a」の関係になっていれば、良いのですが、必ずしもそうとは言えません。本来共通した処理がある場合は、処理だけを独立されてクラス等に使わせる必要があります。Javaなら処理するクラスを作成して、そのクラスを各クラスで使用しても良いと考えているのですが、親クラスで定義させることが多いですね。一般的に言われているユーティリティークラスはそのようになっているのですが...

 Rubyでは、Mix-inが利用できます。Mix-inとは、モジュールをクラス等に取り込むことで、クラスならクラスで定義したメソッド等と同じように操作できる事です。このため、クラス間で共通の処理がある場合は、モジュールで作成し、各クラスが共通のモジュールを取り組めば良いことになります。その事により(Javaとは違い)、無理やり継承(is aの関係)させる必要はなく、共通処理を行わせることができます。この考えは、オブジェクト指向の「has a又はpart of」の関係も実現する事が出来ます。Javaでは、「has a又はpart of」の関係を実現させるには、内部クラスで実現できますが、他のクラスで使用する場合は結局、継承させる必要があります。

 又、Javaのインタフェースを適切に利用しているシステムも少ないと思います。インタフェースの役目として、C言語のヘッダファイル(プロトタイプ宣言や定数の作成)、ポリモルフィズムの実現にも利用されなければなりません。


 好き勝手に書いてきましたが、理想と現実は違うという事ですね。と言っても、私に理想的な設計できる能力があるかと言われると、勉強中としか答えられませんが。Rubyのアンケートシステムは早ければ今月中に完成させる予定でいます。

 前回のRubyの記事(Rubyで作成するアンケートシステム MySQL編)では、RubyからDBの操作を紹介しました。今回は、アンケートシステムで使用するDBの設計書を紹介します。今回はRubyと関係がありませんが何かの題材にでも。


 勉強用なので、設計書と言ってもERDとSQL文です。テーブル設計は無く、あるのはMySQLとPostgresSQLで試したSQL文ぐらいです。SQL文は、主にMySQLに対応していますが、テーブル作成部分は、PostgresSQLでも動作を確認しています。

ファイルにまとめました。説明もファイル中にあります。
QNS_RD.xls
テーブル作成.sql

 先日、ICレコーダーを買ってきて、何か試せないかと思い以前書きました効率 その1 Java アクセサ の 作成を音声による説明をテスト代わりにしてみました。テストということもあり、言い間違えがありますが、そのまま投稿します。

ブログもそうなんですが、私自身完璧にやろうとはせず(例えば、ブログなら毎日投稿など)はじめは地道に進めます。これから私が作成したプログラムぐらいは音声付きの解説ができればよいと考えています。音声を投稿するのははじめてなので、初心ということで投稿して後々の変化がわかればと考えています。もちろん、解説がうまくなることを願ってです。

今回は、編集も何もしていないので、効率 その1 Java アクセサ の 作成に追加せず、ここに投稿しました。

音声ファイルです。

  080729_004.mp3

約7分間収録されています。記事なら3分ぐらいで読めてしまう内容なのでいかにコンパクトにまとめ、要点を押さえられるかが課題です。営業道のように、はじめはこんなものだと思ってがんばります。はじめの踏み出す一歩が大事ということで。

 ICレコーダーの事や今回使用したICレコーダーの説明は後々投稿します。

 資格は仕事に役立つのか その1 単体テスト編2では、ブラックボックスについて書きました。今回は、ホワイトボックスと網羅についてです。

 単体テストの一つである構造テストは、テストの範囲をプログラムコードから分析しコード全てが網羅しているかどうかを調べます。プログラムコードから分析することにより本来起こらない条件もテスト出来ることからホワイトボックスなテスト(中身が見える)と言えます。

試験では、「命令網羅」、「判定条件網羅」、「条件網羅」、「判定条件/条件網羅」や「複数条件網羅」が出題されますが、通常はカバレッジツールを利用して、テストを行うのでチェックリストの作成段階では意識する事はありません。

カバレッジツールを利用していれば、カバレッジモニタで網羅の基準となる「C0」、「C1」、「S0」、「S1」が表示されるので簡単に状況を知ることができます。通常は100%になるようにテストします。チェックリストですべて100%になるようなテストを作成できれば一番好ましいのですが、チェックリストをすべて行っても網羅が100%にならない場合は追加テストなので補完します。

通常起こらないテストとは、例外処理が中心となるでしょう。例えば、JavaならDBに障害が起きてアクセスできない事を想定して、例外をわざとスローさせます。例外がキャッチできて適切にプログラムコードが想定した動作をするのかなどをチェックします。私はまだ通常時にIOExceptionが発生した事はないのですが、当然ここもわざと例外をスローさせて対応をみます。

プログラム作成から当然例外処理を意識して作成しているので、特に大変なの事はないですが、構造テストでしっかりとログを見ることが大事です。ログも当然単体テストの為、エビデンスを残すのですが、それだけではなく構造テストはすべてのパターンのログが出力されることになります。出力されたログで本当に内容がわかるのもチェックすると後々のテスト時の後戻りがなくなります。

ログの出力はすでに設計時にばっちりと決められていることが多いですが、ログ時に出力するメッセージやバグ用に出力する内容は変更できることもあります。変更できる時には、自分の能力を発揮するチャンスでもあります。単体テスト以降に続くテストは当然ですが、運用時に問題が起こった時にもログが重要だからです。



 カバレッジ(coverage)とは、コードの網羅度のことでステップ法に続いてテストの品質を決める要素でもあります。テスト数はテストを行う目標値として扱われるので最初に作成したテスト数の数をこなせば単体テストが終了するというわけではなく、ガバレッジが100%にならないと単体テストが終了と認めらないことのほうが多いでしょう。

ガバレッジと網羅の言い方は、私が経験した中では人それぞれなのでどちらでも言いように感じます。

 資格は仕事に役立つのか その1 単体テスト編1では、テスト数を決めるステップ法について書きましたが、今回の単体テスト編2は、ブラックボックスに付いてです。


 単体テストには、大きく分けて機能テストと構造テストに分ける事ができます。機能テストは、ブラックボックス技法を使い、構造テストは、ホワイトボックス技法を使います。

機能テストとは、テストの範囲を機能からテストすることにより仕様書通りに動作するかどうかを調べます。コードを意識しないことからブラックボックスなテスト(中が見えない)と言えます。ブラックボックスは、資格同様に「同値分割法」、「限界値分析法」がメインなのは、実際も同じと考えて良いでしょう。

私が苦労した点といえば、画面系のテストです。画面では、入力させない文字や最大入力桁のテストなどを行い項目が6以上になるとテスト数が増え大変でした。項目1つに大体15個で5項目なら組み合わせのテストで80ぐらいの数になっていました。プログラミングしながらテストをする為、15程度なら大したことはないのですが、単体テスト編1にも書きましたエビデンス(証拠)を残さないといけません。中には入力不可の文字テストなどのエビデンスが撮れない場合があり、その場合には「目視」と単体テスト書に記述する事もあります。

画面項目はテスト項目に応じてですが、DBがかかわってくると、テスト項目1個に対して3個ぐらい証拠の過程が必要でした。例えば、追加なら、登録する内容を示した画面、実際に処理が行われているコード(ビーンやポーターなどに適切に値が入っているか)、結果のメッセージ、DBのテーブルの中身、ログ(SQL文など)などです。画面で適切なテストが行われていれば、「同値分割法」、「限界値分析法」を行わなくても前提条件が終了している為、テスト数は低減できますが、当然追加の場合には主キーが既に行われているなどのテストがあります。1つテストを作成すれば(例えばDB関連のテスト)自ずとそれに従うテスト項目が浮かんでくるでしょう。

次回は、ホワイトボックスに付いてです。

 効率 その3では、私が実践している効率方法を紹介します。

 プログラミングだけに限りませんが、物事は細かく分け目標というよりかはTODOを利用することにより、確実に仕上げるのがベストだと考えています。TODOを利用するのに、色々なフリーソフトなどが利用できますが、一番は身近なアプリケーションを利用することだと思うので、私はExcelを使用しています。以前、GW企画で進行具合がわかる管理表を用意しましたが、見てもらうと分かると通り、非常に簡単なものです。

TODOを利用していると書きましたが、TODO以外にもアイデアマラソンで有名な樋口健夫さんの著書(図解 仕事ができる人のノート術)で紹介されている「マラソン日記」を利用しています。また、私は常に5冊ぐらい(ジャンルが違う本)を同時並行で読むため、どこまで読んだかわかるように本の管理にも使用しています。

実践している管理は、すべてExcelを利用しているのですが、毎回入力しなくてはいけない作業も多くいくら先行投資をしているとしても面倒なことには変わりありません。そこで、私は、VBAを利用して少しでも無駄な作業を減らしています。少し紹介をします。ここ( Management.bas)からダウンロードできます。ダウンロードできるように、プログラムを修正しましたが、汎用性はほとんどありませんので、自分で修正する必要がまだありますが、書き方を覚えれば、問題なく使用できます。 

 

参考URLです。

アイデアマラソンへようこそ

 効率 その2として、効率の面で見たJavaとRubyの違いを書きます。

 はじめに、その1でも紹介しましたアクセサの違いから紹介します。Javaでは、アクセサを作成するのに、メソッドのなどのコメントを省くにしてもEclipseなどのIDEを使用しないと効率的に作成できませんでした。Rubyでは、以下の記述だけでアクセサが可能です。

attr_accessor:変数名

 Rubyを簡単に紹介すると、プログラミングにデフォルトを用意し、デフォルトと違う処理だけを独自に作成すると言えます。デフォルトとは、「attr_accessor:変数名」のように決まった処理の事で、アクセサ設定の場合に限れば、他にも「attr_reader:変数名」や「attr_writer:変数名」があります。それぞれ説明すると、最初がアクセサ、次にゲッタ、最後にセッタの設定です。これらの指定は、変数の値を取得・設定をする場合に使用し、デフォルト以外の処理をする場合(例えば、範囲チェック)は「attr_xxxx:変数名」を指定せずにJavaのようにメソッドを作成して、プログラミングを行います。

 デフォルトと説明しましたが、Rubyではデフォルトとは記述されていなくUnixやCなどを行った人であれば当然の事を暗黙的に決める事です。暗黙的な所がデフォルトと言えます。この事が詳しく書かれている記事に、ITproさんの記事がありましたので、URLを書いておきます。URLは、以下の通りです。



 続いて、「Ruby on Rails」(以下、RoRと記述する)での場合です。RoRは、ITproさんの記事にも書かれていますが、Rubyよりもよりデフォルトを多く設定したとも言えます。ここらへんの説明は、ITproさんの記事に譲るとして、効率の部分で話を続けます。

 RoRは、JavaのStrutsのようにWebを効率よく作成するためのフレームワークですが、デフォルトの場合では、ほとんど自動的に行ってくれます。何かWebを作成するのであれば、そのデフォルトを改造して作成する形で進めていきます。また、RoRを便利に使用するためのGUIツールも存在し、DBの設定までもGUIで行う事により、キーボードを数回たたくだけでWebを作成する事も可能です。

 では、RoRを使用する事によって、Webを簡単にできる手順を紹介します。今回は、GUIツールを使用しないで説明しますが、本来のRoRだけでも簡単に作成できる事が分かると思います。

(1)アプリケーションを作成
 アプリケーションを作成するには、コマンドプロンプトやシェル上で「rails -d DB名 アプリケーション名」と入力し実行する。実行すると、アプリケーションの枠組みが作成されます。アプリケーション作成時に、既にオプションとしてDBを選択する事により、DBの設定も行ってくれます。
(2)DBの基本的な設定
 続いて設定するのは、早くもDBの設定です。DBの設定は、例えば、データベースやユーザの作成であり、既に利用するデータベースとユーザが決まっていれば不要です。GUIツールを利用すれば、コマンドプロンプトやシェルからの記述は不要です。
(3)RoR上でのDBの設定
 RoRでのDBの設定は、自動作成したアプリケーションの枠組みである「config/database.yml」という所に、DB名、ユーザ名、パスワード、ホストを設定すれば、完了です。ちなみに、RoRでは、オプションの設定にもよりますが、一般的な設定でも開発用、テスト用、本番用のDB設定ができるように定義されています。
(4)モデルの作成
 続いては、モデル(MVCのモデルの事)の作成です。モデルの作成は、Rubyを使いコマンドは、「ruby script/generate model クラス名」だけです。自動作成されたところに、カラム名を記述すれば終わりです(アクセサの説明でしたように簡単に設定できます)。先度DBでテーブルを作成していませんでしたが、「rake db:migrate」を実行する事によりDB上に自動的にテーブルが作成されます。
(5)CRUDの作成
 次もRubyを使うのですが、次の処理に関しては、便利だと思うはずです。先程DBにテーブルを作成しましたが、アプリケーション側(当然プログラム上)から操作できないと話になりません。操作とは、データ作成、読み出し、更新、削除のことです。4つまとめて「CRUD操作」とも呼ぶ操作の事です。Rubyでは、Javaとは違いわざわざコードを記述する必要はありません。コマンド上で「ruby script/generate scaffold クラス名」のように、クラス名にモデル名を記述するだけで「CRUD操作」が自動作成されます。
 
 後は、サーバを立ち上げれば、作成したアプリケーションにアクセスする事ができます。画面は、自動生成で作成されているため、自分でHTMLなどを編集する必要がありますが、ゼロから作成するのが面倒な人や初心者にとっては大変ありがたい機能など思います。ちなみに、モデルでDB上に作成するテーブルの型を指定していましたが、文字列、テキスト、日付などに合わせて画面上に部品を自動生成してくれます。例えば、テキストならHTML上も当然textarea形式で大きさもある程度確保されています。また、日付なら、年、月、日などのようにプルダウンメニューから指定できるようになっています。日付も当然自動的計算されています(例えば、閏年とか)。

 RoRの初歩の説明でしたので、実際にアプリケーションを作成する時には、RoRの良さがより現れてきます。CoC(Convention over Configuration)が実際どうなのかというのもRoRを使用する事により感じ取れると思います。CoCとRoRの関係は、先程のITproさんの記事が参考になります。


 また、Rubyは、「プログラマーに優しい」と聞かれた事があると思いますが、この記事に関しては、以下のURL先が参考になります。この記事もまたITproさんの記事です。



次回は、プログラミングだけではなく、私が実践している効率の事を書きます。

 仕事などで大事な要素に、スピードや効率があげられると思いますが、私なりの効率的な作業を三回に分けて紹介します。

 その1として、Javaなどのオブジェクト指向で利用するアクセサの作成方法(デモでは、Javaを使用します)を紹介します。
 その2として、私なりのJava(又はStrutsなどフレームワークを使用)とRuby(又は、RoR)とを比べた結果を紹介します。
 その3として、その1やその2よりももうちょっと抽象的な話で私のやり方・考え方を紹介します。


では、効率その1 Java アクセサの作成をご覧ください。

 Javaに限りませんが、オブジェクト指向を利用するプログラミング言語で作業をしようとすると必ずと言ってもいいほど、アクセサの作業に追われると思います。オブジェクト指向言語では、アクセサの作成は、「やる作業は同じだが物が微妙に違う面倒くさい作業」の代表ともいえるでしょう。人それぞれやり方は決めていると思いますが、毎回試行錯誤で試しているかには、参考になると考えています。

 デモの環境は、以下の通りですが、バージョンなどは気にしなくても大して変わらないと思います。
OS:Mac OS X Leopard 10.5.3
使用言語:Java SDK 1.5.0_13
IDE:Eclipse Europa 3.3.2

 アクセサには、クラス変数をまず作成する必要があります。クラス変数を作成する前に、以下のように、入力してみてください。

accessor_1.png
コメントや変数名に「XXXXXXXXXX」と書きます。英字であれば、何でもかまいません。英字である理由は後ほど分かると思います。戻り値の型は、一番使用すると思われるのを指定すると後々楽です。定型をコピーしてそれぞれ加工するのですが、コピーするのは、以下の範囲でコピーします。

accessor_2.png

 ペーストは、範囲から場所を移動する必要はありません。ただ適当な回数回ペーストします。続いては、コメントから記述します。この時にすでに設計書があると思いますので、それを利用してコメントの「XXXXXXXXXX」をダブルクリックしてペースしてコメントを作成します。

accessor_4.png
変数のコメントが作成できたら、不要な変数を削除します。

 続いて、変数名です。これもまた、設計書を利用すると楽でしょう。変数名も「XXXXXXXXXX」をダブルクリックして選択できます。

accessor_5.png
戻り値型もここで設定します。

 続いて、Eclipseの機能からgetterとsetterを自動的に作成するのですが、作成する前にgetterとsetterのコメントを設定します。コメントのテンプレートは、自分が使う環境に合わせてください。

 設定画面を開き、下のようにgetterのコメントを設定します。


accessor_6.png
表示をクリックすると、拡大画面が表示されます。

setterも次の画面のように設定します。

accessor_7.png
表示をクリックすると、拡大画面が表示されます。

「ソース」メニューから「Getter および Setter の生成」を選らび、getterとsetterを自動生成すると、以下の画面が表示されます。

accessor_8.png
また、変数名のコメントから「XXXXXXXXXX」を設定します。

accessor_9.png
 getter、setterが多くなると変数名に戻るのに、いちいち「home」から次に設定する変数名を選ぶのは非効率なので、クラス変数名を指定して、コンテキストメニューから宣言を開くを選択すれば、クラス変数名に戻れます。続いてアクセサの設定していないコメントを作成するのに、いちいち探すのが面倒くさいなら、コメント・テンプレートで「TODO」などを設定しておくのもいいかもしれませんね。

 その1のまとめとして、以下の方法を使用してみました。
 「XXXXXXXXXX」をうまく使う。「XXXXXXXXXX」をうまく使う事がアクセサを効率的に作成できます。アクセサに限らず他にも利用できると思います。
 大量のペースをする時には、改行もコピーする。例えば、テンプレートから何かをコピーする時には、改行も含める事によって、無駄を省く。さらに、コピーしてからペースと位置を位置を選択するよりもコピーした時点からペーストする。

 その1は、以上です。その2では、アクセサを含めたJavaとRubyの違いを説明します。

 前回は、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回のまとめをして終わらせようと考えています。

 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 処理を繰り返すには