Java はじめて22 〜オブジェクト指向的分析、アプリ拡張の実装とテスト〜

イントロダクション

今回は、作成した仕様、設計した機能に関して実装していこうと思います。前回作成した仕様、機能に関しては以下にまとめておきます。

仕様と機能

仕様
1. 口座開設している人の情報を保存する
2. 口座を持っている人を特定する
3. 口座の預金額と口座を持っている人を一意にする

そして、上の仕様をいっぺんに実装するのは自分の頭では追いつかないので諦めて、1つずつ考えていこうと思います。
まずは、仕様1「口座を開設している人の情報を保存する」に関して、ますは「口座を開設する」機能が必要です。というかこれがないとこれ以降の機能が実装できません。
なぜか?口座が作成されないと口座を開設している人が追加できない、つまり口座を持っている人が0人のまま。。。
ということになるからです。

機能
1. 口座の情報をファイルに保存する
2. 口座の情報は「名前」と「パスワード」とする
3. ファイルには、カンマ区切りの「CSV」形式でデータを登録する

ファイル入出力の実装

実装イメージ動画
<ファイルにデータを読み込むサンプル>

やっと実装にたどり着きました。ここまで来た方おめでとうございます。
たまたま、このページに来た方、ブログなのでいつでもこれ以前の記事を参照できます。下のリンクで一覧が見れます。よかったらチャレンジしてみてください。
Java はじめて 学習フロー

java.io.Fileクラス

このクラスを使用してファイルの操作を行います。ここで注意して欲しいのは「Fileクラス」はファイル、ディレクトリ(フォルダ)を表現するクラスであり、「入出力」は別のクラスを使用する必要があるというところです。

java.io.BufferedWriterクラス

上のFileクラスと併用してこのクラスでファイルへの書き出しを行います。四の五の言っても意味がないので、コードから見ていきます。まずは、上の2クラスの作成(生成)を行います。口座を操作、管理するクラスは「KozaManager」と名付けました。

package jp.zenryoku.apps.atm.manage;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 口座の管理(登録、更新、削除)を行うクラス
 * @author takunoji
 *
 * 2019/09/21
 */
public class KozaManager {
    /** ファイルへの書き出しクラス */
    private BufferedWriter write;
    /** ファイルの読み込みクラス */
    private BufferedReader read;

    /** コンストラクタ */
    public KozaManager() {
        // 操作するファイルを指定する
        File file = new File("resources/koza.csv");
        try {
            write = new BufferedWriter(new FileWriter(file));
            if (file.exists()) {
                read = new BufferedReader(new FileReader(file));
            }
        } catch (IOException ie) {
            ie.printStackTrace();
            System.out.println("ファイルオープンに失敗しました。" + ie.getMessage());
            System.exit(-1);
        }
    }
}

コンストラクタで、ファイルの書き出し、読み込みクラスを作成(生成)しています。注意としては、ファイルの読み込み時にファイルが存在していない可能性があるので「ファイルが存在しているならばif (file.exists()) {...}」リーダー(BufferedReader)を作成しています。
そして、何かしらの例外(ファイル入出力関連の例外)があった場合に備えtry { ... } catch(IOException ie) { ... }で例外処理を作成しています。

テスト駆動開発

私事ではありますが、「テスト」に対しての認識を共有したく思い「テスト駆動開発」でやっていきたいと思っています。
このテスト駆動型開発は「仕様を明確にする」のが至上命令で、「どーゆー風に動けば良いか?」を一番に考えます。。。なんか当たり前な話に聞こえますが、「当たり前」はできていなくてはならない(実際難しい。。。)ことです。まぁ頑張りましょう(笑)
というわけで、テストケースから作成していきます。詳細に関してはこちらを参照してくださいwwww。

余談

テスト駆動型開発がオススメな理由、というか自分の考えですが、テストケースがちゃんとできていれば「テストが通れば、実装内容はほぼ自由」で良いことになります。そして、リファクタリングをするにも「テストが通ればデグレートの心配はない」ということになります。しかもテストは自動で実行できるツール(Mavenなど)があるので、テスト処理を流して帰宅するのもおっけーです(作業時間に余裕が必要ですが。。。)

テストケースの作成

今回のテストはファイルの読み込みと書き出しができることを確認するためのケースを作成します。そして、このテストケースを通る(エラーが出ない)のであれば実装は完了になります。
なので考えなくてはいけないのがいかになります。

テスト仕様

  1. 操作するファイルが存在しなければ、作成し、存在すればそのまま参照する
  2. 同様にファイルへ(口座の)ユーザー情報をファイル(CSV形式)への出力、保存ができること
  3. 同様にファイルの読み込みができること
  4. 読み込んだファイルのデータをユーザー情報クラスで取得できること(同様にファイルへ出力できること)

上の4項目を満たすようなクラスができれば、現状はおっけーです。今回は、ここまでにします。

次は、テスト駆動開発を進めていきます。しかし、「テスト駆動開発」ってなによ?という疑問を解決する必要があると思います。

テスト駆動開発とは?

「テスト駆動」というのはTest Firstを日本語に解釈したら、そうなったのであろうと思っていますが、まぁ言葉は解釈によって意味が変わるので深く考えません。
つまりは、「テストから始めましょう」ということです。そしてテストから始めるのは次の準備が必要です。

  1. 仕様を明確にする。でないと「どう動けば正しいかわからない」からです。
  2. テスト仕様も作成し、「どのようなテストをすればよいか?」を解決する。
     ※ここで、開発しはじめてから「やっぱできませんでした!」というのがなくなる

メリット

  • 先に仕様を明確にする、つまり設計をちゃんとやるので実装するときに「この部分が不明なんですが。。。」と設計者ともめることもなくなります。
  • 開発時の工程「実装とテスト」を同時にできるので作業工程が一つ減る

でわでわ。。。

<<< 前回 次回 >>>

<Java関連の動画リスト>



投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す