偏見メモ リーダブルコード②〜処理を見直す〜
前回の続きです。
今回は実際の処理について、リーダブルにするための工夫について述べられた章の個人的に気になった部分を取り上げます。
制御フローを見直す
if文の条件式について、下記は同じになるがどちらがみやすいか。
if (count > 10) // ①
// or
if (10 < count) // ②
参考書籍で述べられていたのは、
「調査対象」が左側で、変化する値を使う。
「比較対象」が右側で、あまり変化しない値を使う。
つまりコードの①の形式を守った方が見やすいことにつながる。
まぁ、これは自然とできていたかな。
if文のブロックの並び順についても似たような事例で述べられていた。
// ①(肯定系が先)
if (a == b) {
// 処理
} else {
// 処理
}
// ②(否定系が先)
if (a != b) {
// 処理
} else {
// 処理
}
参考書籍では
・基本的には肯定系を先にする
・単純な条件を先にする
・重要な条件や目立つ条件を先にする
これらの優劣は時と場合によって変わるので状況を判断する必要がありそう。
早めにreturnを返すことは良いこととされている。
Swiftを書いている僕にとってguard文を用いて早期リターンをすることがよくあったりするので良いことができているなと。。笑
これができているとforやwhileループでのネストが深くなりすぎなかったりすることにもつながりそうなので引き続き意識しておきたい。
巨大な式を分割する
変数を定義して、処理の意味をわかるようにする方法が説明変数・要約変数と呼ばれている。
// 説明変数
userName = line.split(':')[0].strip()
if userName == "root" {
...
}
// 要約変数
boolean isDocumentOwner = (request.user.id == document.owner_id)
if isDocumentOwner {
...
}
前者は、式を簡単に説明してくれる。
後者は、説明の必要がない式をあえて変数に代入しておくことでコードの読みやすさを向上してくれる。
こんなの応用できるんだと思ったのは、ド・モルガンの法則を使うというもの。
数Aぶりに聞いたあの法則が使えるのかと。まぁ論理式の扱いだから確かに使えるか。
if !(fileExists && !isProtected) {
...
}
// ↓ ド・モルガンの法則を適用
if !fileExists || isProtected {
...
}
「!」の付く位置がどこにかかるのかが見やすくなったのでパッと条件の把握をしやすくなった。
これ地味に使えそうだなと思ったからちゃんとインプットしておこっと✏️
それ以外は、関数内の共通するような部分を説明変数にしたりすると把握しやすくなるみたいなことが述べられていて、これは割とできているかなと思った。
変数の読みやすさ
説明変数の紹介があったが、何でもかんでもこれを使うと、変数の中には「これ本当に変数にする意味あるか?」みたいなものも出てくるのでちゃんと見直した方が良い。
・複雑な式を分割していない
・変数にすることでより明確になっていない
これらを特に意識すれば冗長なところは消せるかも🤔
変数のスコープを縮小する。
ざっと、グローバル > クラス > 関数内 といった範囲で変数は使用できるようになると思う。
意図していない箇所で値が変わったりするし、原因を突き止めにくくなるからまずグローバル変数にしないのは当然。
でもクラス内で定義するのも最小限に抑えたい。
1クラスのコードが数千行とか仮にあって変数を「ミニグローバル変数」的な使い方で使用していた時に、どこで使ってどこで使っていないかが把握しづらく、読み手が気にしなければいけない箇所が増えてしまうから。
*
*
*
今回は個人的に普段から割と意識できてそうだなと思うことが多かった。
それだけリーダブルなコーディングができているのかなと思うと、なんか嬉しい😎
コードを見直して、ここはもしかしてこうすれば綺麗になるんじゃねとか考えるのも嫌いじゃ無いし、こういうのは向いているのかも??😁
引き続き読み進めていく。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?