リーダブルコード実践 第二弾 ~Vol.1~

前回は見た目ベースのコードになっていたので、今回はロジックベースのコードになるよう例題を設定します。なお、言語はJavascriptを採用します。(Javascriptはあまり経験ないので勉強がてら)

<例題>
ECサイトにカート機能を作るので、以下の機能を実装する。
 1. 商品をカートに入れる
 2. カートの商品の数量を変更する
 3. カートから商品を削除する
 4. カートの合計金額を算出する

(注)
- 単価は0円より大きい金額が設定されているものとする。
- 在庫の数量を超える入力はできないものとする。

<1. 商品をカートに入れる>
- パラメータ: 商品ID、単価(税抜)、数量
- 以下の場合、エラーを表示して処理を中断する。
 * 商品IDが空
 * 数量が1未満
- 数量、単価から消費税・金額を算出する。
- 2019/10/01以降 かつ ID先頭3桁が"RTR"なら軽減税率で計算する。

<2. カートの商品の数量を変更する>
- パラメータ: 商品No.、変更後の数量
- 以下の場合、エラーを表示して処理を中断する。
 * 商品No.が空
 * 存在しない商品No.
 * 数量が1未満

<3. カートから商品を削除する>
- パラメータ: 商品No.
- 以下の場合、エラーを表示して処理を中断する。
 * 商品No.が空
 * 存在しない商品No.

<4. カートの合計金額を算出する>
- パラメータ: なし
- 商品なし: 「¥0」を返す
- 商品あり: 金額を合計して「¥X,XX9」形式で返す

まずはリーダブルコードを意識せずにコードを書きます。

//商品クラス
var Item = function(no, id, unit, num, rate, tax, price) {
    this.no = no;
    this.id = id;
    this.unit = unit;
    this.num = num;
    this.rate = rate;
    this.tax = tax;
    this.price = price;
}

//カートクラス
var Cart = function() {
    this.cart_no = 0;
    this.items = [];

    //商品追加
    this.Add = function(id, unit, num) {
        //チェック
        if (id === "") {
            this.ShowError("商品を指定してください。");
            return false;
        }
        if (num < 1) {
            this.ShowError("数量は1以上を入力してください。");
            return false;
        }

        //カートに追加
        this.cart_no++;
        var item = new Item();

        item.no = this.cart_no;
        item.id = id;
        item.unit = unit;
        item.num = num;

        if (Date.now() >= "2019/10/01") {
            if (!this.IsReducedTaxRate(id)) {
                item.rate = 0.1;
            }
            else {
                item.rate = 0.08;
            }
        }
        else {
            item.rate = 0.08;
        }

        item.tax = ((unit * num) * item.rate);
        item.price = ((unit * num) + item.tax);

        this.items[this.items.length] = item;
    }

    //数量変更
    this.ChangeNum = function(no, num) {
        //チェック
        if (no === "") {
            this.ShowError("商品が存在しません。");
            return false;
        }
        if (!this.ExistNo(no)) {
            this.ShowError("商品が存在しません。");
            return false;
        }
        if (num < 1) {
            this.ShowError("数量は1以上を入力してください。");
            return false;
        }

        //数量変更
        for (var i = 0; i < this.items.length; i++) {
            if (this.items[i].no === no) {
                this.items[i].num = num;
                this.items[i].tax = ((this.items[i].unit * num) * this.items[i].rate);
                this.items[i].price = ((this.items[i].unit * num) + this.items[i].tax);
                break;
            }
        }
    }

    //商品削除
    this.Delete = function(no) {
        //チェック
        if (no === "") {
            this.ShowError("商品が存在しません。");
            return false;
        }
        if (!this.ExistNo(no)) {
            this.ShowError("商品が存在しません。");
            return false;
        }

        //商品を探す
        for (var i = 0; i < this.items.length; i++) {
            if (this.items[i].no === no) {
                //削除
                this.items.splice(i, 1);
                break;
            }
        }
    }

    //合計金額取得
    this.GetTotalPrice = function() {
        if (this.items.length === 0) {
            return "¥0";
        }

        //合計金額算出
        var total_price = 0;

        for (var i = 0; i < this.items.length; i++) {
            total_price += this.items[i].price;
        }

        //3桁カンマ区切り
        return "¥" + String(total_price).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
    }

    //カートNo.存在チェック
    this.ExistNo = function(no) {
        for (var i = 0; i < this.items.length; i++) {
            if (this.items[i].no === no) {
                return true;
            }
        }
        return false;
    }

    //軽減税率チェック
    this.IsReducedTaxRate = function(id) {
        if (id.substr(0, 3) === "RTR") {
            return true;
        }
        else {
            return false;
        }
    }

    //エラー表示
    this.ShowError = function(msg) {
        console.log("Error: " + msg);
    }
}

・・・もうね、ゴチャゴチャしていてね、読みやすさの欠片もないですね。次回はこのコードを読みやすいコードに書き直していきます。


この記事が気に入ったらサポートをしてみませんか?