リーダブルコード実践 第二弾 ~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);
}
}
・・・もうね、ゴチャゴチャしていてね、読みやすさの欠片もないですね。次回はこのコードを読みやすいコードに書き直していきます。
この記事が気に入ったらサポートをしてみませんか?