BETA

リーダブルコードの勉強会へ向けた資料作りとアウトプット Part8

投稿日:2019-08-09
最終更新:2019-08-09

##8章 巨大な式を分割する
コードの「塊」が大きくなればそれだけ理解が難しくなる。
巨大な式は飲み込みやすい大きさに分割してみよう!

まとめ

巨大な式を分割し、パッと見でやりたいことが分かるようにする。
その最も簡単な方法は「説明変数」を導入すること。
以下三つの利点がある。

  • 巨大な式を分割できる。
  • 簡単な名前で式を説明することで、コードを文書化できる。
  • コードの主要な「概念」を読み手が認識しやすくなる。

複雑な論理条件は小さな分に分割し、if分の中身が2行以上含まれていないのが理想的である。
分割するうえで同じことができるとは限らない。
そんな時は「否定」したり、反対のことを考えてみたりすることが必要だ。
以上を踏まえ、複雑なロジックを見たら積極的に分割してみよう。

巨大な式を分割する

同じ式を要約変数として関数の最上部に抽出する。
一つ一つの式が簡単なものでも、一か所に集まると分かりづらくなる。

複雑なロジックと格闘し、より優雅な手法を見つけるには

最初は簡単な問題が次第に複雑になってしまったら、一度落ち着いて「反対」の
から考えてみるのが良い。
配列を逆順にイテレートしてみる、データを後ろから挿入してみる
などなど。

短絡評価の悪用

※短絡評価とは片方が既にtrueならば、もう片方はスルーされる、評価されない論理のこと。
一行にまとめるにはもってこいの論理だけれど、後で見返して果たしてわかりやすいだろうか。
例えば著者が書いた以下のようなコードは、一行だけれど解析に時間がかかる。

assert((!(bucket = FindBucket(key))) || !bucket -> IsOcupied());  

長くなるが以下のコードの方が分かりやすい。

bucket = FindBucket(key);  
if (bucket != NULL) assert(!bucket->IsOccupied));  

短絡評価の悪用はやめて、簡潔に使えるやり方でコードを書くべきだ。

ド・モルガンの法則を使う

if(!(file_exists && !is_protected)) Error("Sorry, could not read file.");  

//ド・モルガンの法則(notを分割してand/orを反転する)で以下に書き直せる  

if(!file_exists || is_protected) Error("Sorry,could not read file.");  

要約変数

式を説明する必要がない場合も、式を変数に代入しておくと便利。
大きなコードの塊を小さな名前に置き換える。
これを要約変数と呼ぶ。

説明変数

説明変数とは式を表す変数のこと。

例えば

if line.split(hogehoge)[0].strip() == "root";  

これを説明変数にすると以下になる。

username = line.split(hogehoge)[0].strip()  
if username == "root";  

【蛇足】ド・モルガンの法則とはなんですか?

申し訳ございません。わたくしは論理学も電気回路も避けて生きてきました。ジメジメした図書館の片隅で、恥の多い独り言をつぶやく日々。しかも口にはだせず心で反芻する始末。
そうわたくしは、意図が伝わりやすい美しい文章を書く文系にもなれず、論理的な思考を持ち情報の合わせ技が得意な理系にもなれません。ただの、しぬまでなんとか生にしがみつく肉の塊。そう考えると少しは気が楽になるものです。

前書きが長くなりました。
ド・モルガンが理解できなかったので調べた結果をこちらに残します。

ド・モルガンの法則とは

ド・モルガンの法則とは、論理学や集合論で使われる定理の一種で、論理積、論理和の否定に関する関係を示す定理のことである。
IT用語辞典バイナリ

式と具体例

NOT (A AND B) = NOT(A) OR NOT(B)、NOT (A OR B) = NOT(A) AND NOT(B)
これを具体例に当てはめてみると、「成人の男性」の否定は「成人でないか男性でない」すなち「未成年か女性」と同じことであり、「成人か男性」の否定は「成人でなく男性でない」すなち「未成年の女性」と同じことである、と表現することができる。
IT用語辞典バイナリ

ドモルガン所感

べんり!!!こりゃ確かに使えそうです。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@NowBridgeがひたすらアウトプットします。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!