リーダブルコード実践 Vol.4

コードの再編成

コードの構成を変えて読みやすくします。ポイントは以下のとおりです。
 1. コードをタスクに分けて重複箇所などをメソッド化します。
 2. 言葉で表せられないコードを書き直します。
 3. 不要なケースを削除します。

/*
* 入出荷管理クラス
* 注)入荷と出荷が同時に呼び出されることはない
*/
class RasManager {
    //入荷した商品を倉庫へ登録する
    function ReceiveGoods(goods_id, goods_num) {
        if (goods_num < 1) {
            return "1以上の数量を入力してください。";
        }
        else if (!CommonFunction.ExistGoods(goods_id)) {
            return "未登録の商品IDが入力されています。";
        }

        Warehouse.StoreOnGoods(goods_id, goods_num);

        return "商品を入荷しました。";
    }
    //指示された商品を倉庫から出荷する
    function ShippingGoods(goods_id, goods_num, delivery_id) {
        if (goods_num < 1) {
            return "1以上の数量を入力してください。";
        }
        else if (!CommonFunction.ExistGoods(goods_id)) {
            return "未登録の商品IDが入力されています。";
        }
        else if (!CommonFunction.ExistDeliveryOnAddress(delivery_id)) {
            return "未登録の出荷先IDが入力されています。";
        }
        else if (Warehouse.GoodsStockOfNum(goods_id) > goods_num) {
            return "入力した商品は在庫不足のため出荷できません。";
        }

        Warehouse.DeliveryOnGoods(goods_id, goods_num, delivery_id);

        return "商品を出荷しました。";
    }
}

/*
* 倉庫クラス
*/
class Warehouse {
    //商品を倉庫へ保管する
    function StoreOnGoods(goods_id, goods_num) {
        ...
    }
    //商品を倉庫から出荷する
    function DeliveryOnGoods(goods_id, goods_num, delivery_id) {
        ...
    }
    //商品の在庫数を返す
    function GoodsStockOfNum(goods_id) {
        ...
    }
}

/*
* 共通関数クラス
*/
class CommonFunction {
    //商品IDが存在するか確認する
    function ExistGoods(goods_id) {
        ...
    }
    //出荷先IDが存在するか確認する
    function ExistDeliveryOnAddress(delivery_id) {
        ...
    }
}

<改善したこと>
- CommonFunction.GoodsStockOfNumは在庫数を返すのでWarehouseクラスに関係するのに、共通関数クラスにあるので将来相互参照になる可能性を秘めていたため、Warehouseクラスに移設しました。

反省

前回・今回と、改善ポイントにマッチするコードが少なかったので改善された感が出ませんでした。次回でこのコードの改善は終了して、もっとよい例題を考えます。

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