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

ロジックの単純化

複雑なコードを簡単なコードにして読みやすくします。ポイントは以下のとおりです。
 1. 条件式の引数を自然な順番に書き直します。
 2. 深いネストを浅くするよう書き直します。
 3. 複雑な条件を説明変数・要約変数で書き直します。
 4. 不要な変数を削除します。

/*
* 入出荷管理クラス
* 注)入荷と出荷が同時に呼び出されることはない
*/
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 (CommonFunction.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) {
        ...
    }
}

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

<改善したこと>
- RasManager.ShippingGoodsの「if (1 > goods_num) {」は引数が不自然な順番なので「if (goods_num < 1) {」に書き直しました。
(補足: 条件を文章にすると自然かどうかわかる。「数量が1未満」=自然。「1未満の数量」=不自然。)

今回はポイント「1」のみ適用しました。「2・3・4」は適用する必要性がなかったので、書き直す必要はありません。(=必要ないことはしない!)

条件式の順番を修正しただけなのでコード量が変わったりはしていませんが、こういう小さな修正を一つ一つ積み重ねていくことが重要だと思います。

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