リーダブルコード実践 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) {
...
}
}
・・・まぁ見にくいですよね。あからさまに読みにくさを出した箇所もありますが、名前だけで理解できないものや重複したコード、ムダなコメント、さらには考慮漏れもあります。
次回は、これをリーダブルコードの手法を適用して読みやすいコードへ書き換えていきます。
この記事が気に入ったらサポートをしてみませんか?