どうも。つじけ(tsujikenzo)です。このシリーズでは、2022年5月に発売されました書籍「良いコード/悪いコードで学ぶ設計入門」についてお送りします。今日は1回目です。
章立ては順不同になりますが、ご了承ください。
書籍について
著者のミノ駆動さんを知ったのは、2021年のconnpassの座談会で、なぜかすぐファンになりました。
その後も、怨念のこもった過去のスライドや、酔っ払いながらのSpace配信を通じて、氏が何を言わんとするのかを考えてきました。
ひとことで言うと 「設計はスキルであり、学べば高められる」 ということです。
われわれのようなノンプログラマーには、設計のスキルをまなぶ機会が、あまりありません。
むしろ、 設計(アーキテクチャ) や 設計者(アーキテクト) という概念すら、知られていないのが現状です。(この件についてブログを書きました)
わたしは、プロであれ、ノンプログラマーであれ、 「設計のスキルを高めれば、もっと早く社会の課題を解決できる」 と思っています。
なので、書籍出版のニュースを聞いてとても喜びました。さっそく読み解いていきたいと思います。
書籍の全体図
本書籍は、全17章で構成されています。大きく分けると3つに分かれます。
- 1~2章・・・入門編(悪しき構造を知り、何を設計するのかを学ぶ)
- 3~12章・・・実践編(クラスや条件分岐など、具体的な設計手法を学ぶ)
- 13~17章・・・発展編(モデリングや、開発プロセスなどを学ぶ)
他の言語で読み替えたり、考察すべきは、3~12章の各章です。
順不動になりますが、読み解いていきたいと思います。
今回は、6章「条件分岐」をお届けします。
6章「条件分岐」の構成
6章は、42ページあり、もっともボリュームがある章です。(平均は、19ページです。)
この章は、条件分岐がメインテーマで、 「迷宮化した分岐処理を解きほぐす技法」 というサブタイトルが付けられています。
著者による、章の解説はこちらです。
条件分岐は、条件に応じて処理を切り替える、プログラミングの基本制御です。 条件分岐の複雑さを低減し、コントロールできるようになるための設計方法を解説します。 特にロジック単純化の鍵を握る、interfaceの使いこなし方について重点的に解説します。
以下、6つの節でグループ分けされています。
- 条件分岐のネストは早期returnで解決しよう
- switch文の重複を解消しよう
- 条件分岐の重複とネストを解消しよう
- 型チェックで分岐しない
- interfaceを使いこなそう
- フラグ引数をリファクタリングしよう
条件分岐と早期return
3章の復習ですが、処理の対象外となる条件を、メソッドの先頭に定義する方法を 「ガード節」 と呼びます。
function myFunction6_1() {
/**
* 税込み金額を返す関数
* @param {number} price
* @return {number} 税込み金額
*/
const getIncludeTax = price => {
if (price < 0) throw new Error("priceが0以下です"); //ガード節
return price * 1.1;
}
console.log(getIncludeTax(-10)); //Error: priceが0以下です
}
ガード節の考えをもとに、 「もし条件式に当てはまらなければ、関数をreturnしてしまう」 というテクニックがあります。
これは、早期returnと呼ばれ、if文のスコープをできるだけ短くする効果があります。
function myFunction6_2() {
/**
* 税込み金額を返す関数
* @param {number} price
* @return {number} 税込み金額
*/
const getIncludeTax = price => {
//priceがマイナスであることはあり得ない
if (price < 0) return;
//priceが1000を超えることはあり得ない
if (1000 < price) return;
//priceを使った様々な処理
//中略
const result = price * 1.1;
return result;
}
console.log(getIncludeTax(100)); //110.0000
}
とくに、else if文で条件式がネストしてしまうときは、早期returnを使って、コードをすっきりさせましょう。
まとめ
以上で、「この書籍と6章について」をお送りしました。
6章前半に登場する、早期returnについてもかんたんに紹介しました。
次回は、「switch文の重複とクラスの肥大化」 をお届けします。