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

以下の例題でコードを書き、リーダブルコードで学んだ読みやすいコードに書き直していきます。

<例題>
商品の在庫を管理するシステムで、商品の入出荷受付機能を実装する。入出荷受付が同時に呼び出されることはない。

<入荷受付仕様>
- 入荷した商品を倉庫へ登録する。
- 倉庫への入荷メソッド: ArrivalGoods(商品ID,数量)

<出荷受付仕様>
- 指示された商品を倉庫から出荷する。
- 倉庫からの出荷メソッド: DeliveryGoods(商品ID,数量,出荷先ID)
- 在庫不足の場合、エラーメッセージ「在庫がありません。」を返す。

まずは仕様をよく読む

コードを書き始める前に、仕様に不備がないかチェックします。すると、さっそく不明な点を見つけました。
 Q1. 存在しない商品IDや出荷先IDが渡されたらどうするか?
 Q2. 数量に0や負の値が渡されたらどうするか?
 Q3. 在庫不足をどうやって確認できるか?
上記不明点を明確にした仕様に書き直します。

<例題>
商品の在庫を管理するシステムで、商品の入出荷受付機能を実装する。入出荷受付が同時に呼び出されることはない。

<共通仕様>
- 商品の存在確認メソッド: ExistGoods(商品ID)
- 出荷先の存在確認メソッド: ExistDeliveryAddress(出荷先ID)
- 商品の在庫数取得メソッド: GetStockQuantity(商品ID)

<入荷受付仕様>
- 入荷した商品を倉庫へ登録する。
- 倉庫への登録メソッド: ArrivalGoods(商品ID,数量)
- 以下のケースはエラーメッセージを返す。
 * 数量が1未満: 「1以上の数量を入力してください。」
 * 商品が存在しない: 「未登録の商品IDが入力されています。」

<出荷受付仕様>
- 指示された商品を倉庫から出荷する。
- 倉庫からの出荷メソッド: DeliveryGoods(商品ID,数量,出荷先ID)
- 以下のケースはエラーメッセージを返す。
 * 数量が1未満: 「1以上の数量を入力してください。」
 * 商品が存在しない: 「未登録の商品IDが入力されています。」
 * 出荷先が存在しない: 「未登録の出荷先IDが入力されています。」
 * 在庫不足: 「入力した商品は在庫不足のため出荷できません。」

コードを書いてみる

まずはリーダブルコードを意識しない書き方で書きます。

/*
 * 入出荷受付クラス
 */
class Reception {
    //入荷受付
    //@param id 商品ID
    //@param num 数量
    //@return 結果
    function ReceiveGoods(id, num) {
        //入力パラメータチェック
        if (num < 1) {
            return "1以上の数量を入力してください。";
        }
        else if (!Common.ExistGoods(id)) {
            return "未登録の商品IDが入力されています。";
        }
        
        //登録
        Warehouse.RegistGoods(id, num);

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

    //出荷受付
    //@param goods_id 商品ID
    //@param num 数量
    //@param delivery_id 出荷先ID
    //@return 結果
    function ShippingGoods(goods_id, num, delivery_id) {
        //入力パラメータチェック
        if (1 > num) {
            return "1以上の数量を入力してください。";
        }
        else if (!Common.ExistGoods(goods_id)) {
            return "未登録の商品IDが入力されています。";
        }
        else if (!Common.ExistDeliveryAddress(delivery_id)) {
            return "未登録の出荷先IDが入力されています。";
        }
        else if (Common.GetStockQuantity(goods_id) > num) {
            return "入力した商品は在庫不足のため出荷できません。";
        }
        
        //出荷
        Warehouse.DeliveryGoods(goods_id, num, delivery_id);

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

/*
 * 倉庫クラス
 */
class Warehouse {
    //入荷
    //@param id 商品ID
    //@param num 数量
    function ArrivalGoods(id, num) {
        ...
    }

    //出荷
    //@param goods_id 商品ID
    //@param num 数量
    //@param delivery_id 出荷先ID
    function DeliveryGoods(goods_id, num, delivery_id) {
        ...
    }
}

/*
 * 共通クラス
 */
class Common {
    //商品存在確認
    //@param id 商品ID
    //@return true:存在する false:存在しない
    function ExistGoods(id) {
        ...
    }

    //出荷先存在確認
    //@param id 出荷先ID
    //@return true:存在する false:存在しない
    function ExistDeliveryAddress(id) {
        ...
    }

    //在庫数取得
    //@param id 商品ID
    //@return 在庫数
    function GetStockQuantity(id) {
        ...
    }
}

・・・まぁ見にくいですよね。あからさまに読みにくさを出した箇所もありますが、名前だけで理解できないものや重複したコード、ムダなコメント、さらには考慮漏れもあります。

次回は、これをリーダブルコードの手法を適用して読みやすいコードへ書き換えていきます。

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