yuyanegishi / issue_check

0 stars 0 forks source link

★リーダブルコード_最終盤 #10

Open yuyanegishi opened 5 years ago

yuyanegishi commented 5 years ago

名前の付け方

変数や関数、クラス定義等、様々な場面で名前を付けるシーンがあり、その名前は短いコメントでより他者に伝わりやすい文言でなければならない。

明確な単語を選ぶ

"get"という単語のように用途や情報が不明確な単語は避ける。具体的には、インターネットから情報を取ってくるのであれば、fetchpage()という関数名にする等、より具体的な情報を端的に伝える名前であることが好ましい。

汎用的な名前を避ける

tmpやretval、fooなどの汎用的な名前を付ける際は何かしらの目的がない場合は避けた方が好ましい。また、ループ構文のイテレーターに関しても、汎用的な名前(i、j、k等)は「イテレーターである」という意味しか持たないので、繰り返しが行われる変数が教師のidであればteacher_idのような名前の方が、コードの目的やバグの対応の際に意味が理解しやすく好ましいとされる。

具体的な名前を付ける

変数や関数等の構成要素の名前は、抽象的ではなく具体的なものにする方が好ましい。具体的にどういった動作が行われるのかが明確になっている名前である方が、他者が見た際にどういった変数や関数なのかが理解しやすい。

名前に情報を追加する

単位や属性を名前に組み込むことで、変数等の形式がわかりやすくなる。具体的には遅延時間を表す変数名をつける際には、delayのみでなくdelay_secsのように単位がわかるように設定した方が好ましい。

名前の長さを決める

原則長すぎる名前は覚えにくい、かつコードの量が増えてしまうため好ましくない。省略しても良い情報と重要な情報を分けたり、単語を省略したりして、より端的にわかりやすい名前を付ける必要がある。ただ単語の省略に関してはstringをstrにするなど、汎用的な単語の省略は周囲に理解されるものの、プロジェクト固有の省略方法については他者から理解されない場合も多いので、避ける方が好ましい。

名前のフォーマットで情報を伝える

クラス名は大文字始まる等、大文字小文字での判別やアンダースコアを使った判別も活用することで、表す情報を明確にすることも実践できる。

誤解される名前を避ける

いくつかの具体例のみ下記に記載。

見た目の美しさ

一貫性と意味のある形式でコードの見た目をまとめることで、読みやすいコードにする。

改行の位置

コードが長くなってしまったことのみで改行を行なってしまうことで、一貫性がなくなってしまうことを避ける。

重複部分をメソッドを用いてまとめる

同様な処理を複数回行う際は、ヘルパーメソッドを使用することで、コードを簡略化する。

縦の線を合わせる

関数の引数やリスト等、縦の線を統一することでどこに何の要素が入っているかを明確にする。

一貫性を意味のある並び

変数の定義など、複数の要素やコードを羅列する際は、重要度順やアルファベット順など、意味のある順番で並びべ方を統一することで、一貫性を保つ。

コードをブロック毎に分割する

コードを意味ある塊として分割することで、それぞれのコードの意味や処理内容を明確にすることで、読みやすいコードにする。

コメントの活用

目の前のコードからしか情報を読み取ることができないので、必要な情報があればコメントを残して意図や内容を伝える。

自らの考えを記録する

コメントすべきでないこと

コメントの正確さ、簡潔さ

制御フローの読みやすさ

条件やループなどの制御フローは他の場所に飛んだり、枝分かれすることがあるので、コードを上から下に読むだけでは理解できない部分があるので、よりわかりやすいような記載が必要になる。

条件式の引数の並び順

調査対象を左にして、比較対象を右にする方が好ましい。

if/elseブロックの並び順

関数から早く返す

エラー時の処理等については、コードの頭に集約し「ガード節」を使うことで、読み手側の負担が減り、読みやすいコードとなる。

ネストを浅くする

ネストが深くなると条件が複数組み合わさり、コードを読む際は前の条件を覚えていなければならないので、なるべくネストを浅くする。

大きな式を分割する

一つの式に含まれているコードの塊が大きいと、それだけ意味や処理内容を理解するのに時間がかかってしまう。

説明変数、要約変数

式の分割させる、または式の重複を減らすためには、式を表す変数を使用することで、式の意味を明確にする、または、無駄なコードを減らすことができる。

巨大な文の分割

上記の説明変数、要約変数による式の分割を用いて、文を丸ごと説明変数の定義とその他の部分に分割することで、一つの大きな文を分割することができ、理解がしやすくなる。

変数の扱い方

変数の削除

説明変数や要約変数のように式を分割するような目的ではない変数については削除する。

コードで行うことを簡潔にする

複数の処理(オブジェクトを作成したり、データを整えたり)を、一つのコードで行うとコードが理解しにくくなる。

タスクを小さくする

行うことをより細かいタスクにする(「投票結果を受けて、スコアを更新する」を「投票の結果を数値変換」と「スコアに更新する」に分ける等)し、それぞれのタスクを一つのコードで表現することで、一つのコードが行なっている処理が明確になる。

オブジェクトから値を抽出する

クラス定義によってデータが構造化されているので、オブジェクトから値を抽出することで、一定のルールのもと値を抽出できる。

良いテストの設計

エラーメッセージをわかりやすくする

表示されるエラーメッセージを理解できるものにすることで、どういった不備があるのかを明確にする。

入力値を簡潔にする

テストの際に設定する入力値を複雑なものにするのではなく、簡潔なものにすることで、どういった目的での入力値なのかを明確にする。