川のブログ

川の適当気ままなブログです。 

リーダブルコードを読む part8

こんにちはかわです。

アドベントカレンダー23記事目です。

以下の続きです。

kawakawa.hatenablog.com

8章 巨大な式を分割

1 説明変数

if str.split('@')[0] == "kawa"

よりも

username = str.split('@')[0]
if username == "kawa"

のほうが何を書いているか分かりやすい

2 要約変数

user_owns_document = (request.user.id == document.owner.id)

if user_owns_document 
   #ユーザはこの文章を編集できる
end

if !user_owns_document 
    #文章は読み取り専用
end

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

適用できるか検討する

4 短絡評価の悪用

「頭がいい」コードに気をつける。
あとで他の人が読むときにわかりにくくなる。

ロジックを簡潔に落とし込むことがわかりにくさを生み出すことがある。

5 例:複雑なロジックと格闘する

ロジックが複雑になった場合は別の視点、逆の視点からも考える

単純なロジックにできないかを考える

6 巨大な分を分解する

DRY原則を意識しよう

qiita.com

7 式を簡潔にするもう一つの創造的な方法

メソッド名が似て同じことをしているような時はマクロを定義するのもよし

以上

kawakawa.hatenablog.com

リーダブルコードを読む part7

こんにちはかわです。

アドベントカレンダー22記事目

前回の続きです

kawakawa.hatenablog.com

7章 制御フローを読みやすくする

1 条件の引数の並び順

左側 右側
「調査対象の式」。変化する。 「比較対象の式」。あまり変化しない。

2 if/elseのブロックの並び順

  • 条件は否定型より肯定形を使う。
  • 単純な条件を先に書く。ifとelseが同じ画面に表示されるので見やすい。
  • 関心を引く条件や目立つ条件を先に書く。

この優劣は衝突することがあるため、臨機応変に対応する。

3 三項演算子

行数を短くするよりも、他の人が理解するのにかかる時間を短くする。
基本的にはif/elseを使う。三項演算子は簡潔になるときだけ使用する。

4 do/whileループを避ける

do/whileのループは書き直せることが多い

何のループかをわからせるためにも先に書いたほうがいいかも

5 関数から早く返す

関数から早く返すことはいいことらしい。

returnを1つにしたいということは、

何らかのクリーンアップコードを実行したいから?

関数終了後に呼び出されるコードは各言語あるので調べてみるといい。

6 悪名高きgoto

c言語以外ではgotoは必要ない。

ー>同じことをする方法が他に存在するから。

基本的には使うな

7 ネストを浅くする

ネストが増える仕組み

機能を追加する際、コードを最も挿入が容易な場所に挿入した結果、

ネストが増えることが多い。

早めに返してネストを削除する

ネスト内部のループを削除する

ループ内で早めに返す場合continueを使う。

ただしcontinueはループを行ったり来たりするためわかりにくい。

気をつけるべき。

8 実行の流れを追えるかい?

プログラムの高レベルの「流れ」についても考えなくてはいけない。

構成要素 高レベルの流れが不明瞭になる理由
スレッド どのコードがいつ実行されるかわからない
シグナル/割り込みハンドラ 他のコードが実行される可能性がある
例外 いろんな関数呼び出しが終了しようとする
関数ポインタと無名関数 コンパイル時に判別できないので、どのコードが実行されるのかわからない
仮想メソッド object.virtualMethod()は道のサブクラスのコードを呼び出す可能性がある

これらの構成要素を利用することで、コードが読みやすくなったり、

冗長性が低くなったりすることがある。

ただコード全体に占める割合を大きくしないことが大切。

以上

kawakawa.hatenablog.com

リーダブルコードを読む part6

こんにちはかわです。

アドベントカレンダー21記事目です。

前回の続きです。

kawakawa.hatenablog.com

6章 コメントは正確で簡潔に

コメントは領域に対する情報の比率が高くなければならない

1 コメントを簡潔にしておく

少ない領域ですむように推敲する

2 曖昧な代名詞を避ける

代名詞はなるべく避けるように努める。

代名詞が何を指すかを明確にすべし。

3 歯切れの悪い文章を磨く

語彙力を磨く

4 関数の動作を正確に伝える

なるべく詳細に伝える。

コメントを読む人の誤解を減らすため。

5 入出力のコーナーケースに実例を使う

コメントが長文になる際には実例を使うべし。

ただし、簡単な実例では役に立たないので、

想定される質問に応えられる実例を書く。

6 コードの意図を書く

コードの動作をそのまま書くのではなく、高レベルから説明するのもあり。

その結果、コードが作者の意図に反しているかどうか見つけやすくなる。

7 「名前付き引数」コメント

pythonRubyなどは名前付き引数がある。

これはコメントのような効果があるため使ったほうがいい。

C++Java等はできないためコメントで実現する。

Connect(/* timeout_ms */ 10);

8 情報密度が高い言葉を使う

説明が長くなった場合、専門用語等を使用して短くできないか検討する。

以上

kawakawa.hatenablog.com