登録は簡単!. 無料です
または 登録 あなたのEメールアドレスで登録
Books により Mind Map: Books

1. リーダブルコード

1.1. 理解しやすいコード

1.1.1. コードは他人が最短時間で理解できる様に!

1.1.1.1. 「他人」とは数ヶ月後の自分も入っている

1.1.1.2. コードが短ければ良い。という訳ではない

1.1.1.3. 必要ならコメントをつけて理解しやすくする

1.1.1.4. 読みやすいコードか常に自問自答することが大事

1.2. 名前に情報をつめこむ

1.2.1. 変数・関数・クラスなどの名前を短いコメントと考える

1.2.1.1. 名前の付け方

1.2.1.1.1. 明確な単語を選ぶ

1.2.1.1.2. 汎用的な名前を避ける

1.2.1.1.3. 抽象的な名前よりも具体的な名前を使う

1.2.1.1.4. 重要な情報は名前に追加する

1.2.1.1.5. 名前の長さを決める

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

1.3. 誤解されない名前

1.3.1. 名前が他の意味と間違われる事はないだろうか?

1.3.1.1. 解決策

1.3.1.1.1. 限界値がある時

1.3.1.1.2. 範囲を指定する時

1.3.1.1.3. ブール値の名前

1.3.1.1.4. ユーザーの期待に合わせる

1.3.1.1.5. 複数の名前を検討する

1.3.2. 自問自答を繰り返して、変更が必要な曖昧な表現を見つける

1.4. コードの美しさ

1.4.1. 3つの原則

1.4.1.1. 一貫性のあるレイアウト

1.4.1.2. 似ているコードは、シルエットも似ているように見せる(ぱっと見てわかるように)

1.4.1.3. 関連するコードはまとめてブロックにする

1.4.2. 解決策

1.4.2.1. 一貫性のある簡潔な改行位置

1.4.2.2. 縦の先を真っ直ぐにする

1.4.2.3. 意味のある並び(アルファベット順、重要度など)にする

1.4.2.4. 宣言やコードを論理的なグループにまとめる

1.4.2.5. 個人的な好みよりもプロジェクトの規約に従う

1.5. コメント

1.5.1. コメントすべきことを知る

1.5.1.1. コメントの目的は書き手の意図を読み手に知らせること

1.5.1.2. コメントを書く時に注意する事

1.5.1.2.1. コメントすべきではないことを知る

1.5.1.2.2. コードを書いている時の自分の考えを記録する

1.5.1.2.3. 読み手の立場になって必要な情報を考える

1.5.2. コメントは正確で簡潔に

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

1.5.2.1.1. コメントを簡潔にする

1.5.2.1.2. あいまいな代名詞は避ける(主語を明確に)

1.5.2.1.3. 歯切れの悪い文章は書かない

1.5.2.1.4. 関数の動作を正確に記述する

1.5.2.1.5. 入出力のコーナーケースに実例を使う(正確なコメントが難しい場合)

1.5.2.1.6. コードの意図を書く

1.5.2.1.7. 情報密度の高い言葉を使う(知識・経験が必要)

1.6. 制御フローを読みやすくする

1.6.1. 条件やループなどの制御フローはできるだけ自然に

1.6.2. コードの読み手が立ち止まったり読み返したりしない様に

1.6.3. 方法

1.6.3.1. 条件式の引数の並び順

1.6.3.1.1. 左側:「調査対象」の式=>変化する

1.6.3.1.2. 右側:「比較対象」の式=>あまり変化しない

1.6.3.2. if/elseブロックの並び順

1.6.3.2.1. 条件は否定形よりも肯定形で書く

1.6.3.2.2. 単純な条件を先に書く

1.6.3.2.3. 関心を引く条件を先に書く

1.6.3.2.4. ※優先度を自分で判断する必要がある

1.6.3.3. 三項演算子、gotoなどの使い方

1.6.3.3.1. 使っても良いが、読みやすさ重視

1.6.3.4. ネストを浅くする

1.7. 巨大な式を分割する

1.7.1. 巨大な式は理解しやすい大きさに分割する

1.7.1.1. 説明変数

1.7.1.1.1. 読みにくいコードは変数を作って説明する

1.7.1.2. 要約変数

1.7.1.2.1. 式を説明する必要がない場合でも、式を変数に代入しておくと便利

1.7.1.2.2. 大きなコードの塊を小さな名前に置き換えて、管理や把握を簡単にする

1.7.1.3. 「頭の良い」コードに気を付ける

1.7.1.3.1. 1行にまとめて書くよりも、複数行に分割して書いたほうが何がしたいのかわかりやすい

1.7.1.4. より単純で優雅な手法を見つける

1.7.1.4.1. ロジックを正しく理解することが大切

1.7.1.5. 巨大な文を分割する

1.8. 変数と読みやすさ

1.8.1. 変数を適当に使うとプログラムが理解しにくくなる

1.8.2. 3つの問題

1.8.2.1. 変数が多いと変数を追うのが難しくなる

1.8.2.1.1. 変数を削除する

1.8.2.2. 変数のスコープが大きいとスコープを把握する時間が長くなる

1.8.2.2.1. 変数のスコープを縮める

1.8.2.3. 変数が頻繁に変更されると現在の値を把握するのが難しくなる

1.8.2.3.1. 変数は一度だけ書き込む

1.9. コードの再構成

1.9.1. 「無関係の下位問題」を積極的に抽出する

1.9.1.1. 関数は小さく・独立したものにする

1.9.1.2. プロジェクト固有のコードから汎用コードを分離する

1.9.2. コードを再構築して一度に1つの事をやる様にする

1.9.2.1. コードがやっているタスクを整理して、分割する

1.9.3. 最初にコードを言葉で説明する

1.9.3.1. コードの動作を簡単な言葉で同僚にもわかるように説明する

1.9.3.2. コードも簡単な言葉で書く

1.9.4. 短いコードを書く

1.9.4.1. 最も読みやすいコードは何も書かれていないコード

1.9.4.1.1. できるだけコードを書かない

2. オブジェクト指向設計実践ガイド

2.1. 単一責任クラス

2.1.1. 隠蔽されていた性質を明らかにする

2.1.2. コメントする必要がない

2.1.3. 再利用を促進する

2.1.4. ほかのクラスへの移動がかんたん

2.2. 依存関係の管理

2.2.1. 自身より変更されないものに依存する

2.2.1.1. 具象クラスは抽象クラスよりも変わる可能性が高い

2.2.1.2. 依存が増えると影響範囲が増える

2.3. 柔軟なインターフェースをつくる

2.3.1. 明示的なインターフェース

2.3.2. 「どのように」よりも「何を」

2.3.3. 名前は変わり得ないもの

2.4. ダックタイピング

2.4.1. 具象的なコードは理解は簡単だが、拡張しづらい

2.4.2. 抽象的なコードは最初分かりにくいが、一度理解してしまえば、変更や拡張がしやすい

2.4.3. 動的型付けでのみ可能な特有の手法

2.4.3.1. 型エラーを防ぐのはプログラマーの力

2.4.3.2. コードの良さはテストの良さ

2.4.4. オブジェクトが何であるかではなく、何をするか

2.5. 継承

2.5.1. 抽象クラスはサブクラスのために存在する(唯一の目的)

2.5.2. Rubyは他者信頼の性質をもつので、抽象クラスのインスタンスを作成することへの制約がない

2.5.2.1. ほかのプログラマがインスタンスを作ることを防げるのは、「良識」だけ

2.5.3. リスコフの置換原則

2.5.3.1. スーパークラスとサブクラスは入れ替え可能でなければならない

2.5.4. テンプレートメソッドパターン

2.5.4.1. 抽象クラスで振る舞いのデフォルトの挙動を定義

2.5.4.2. 具象クラスでそのメソッドに手を加えたりする

2.5.4.3. サブクラス特有の処理が区別できる

2.5.5. superはできるだけ使わない

2.5.5.1. 具象と抽象の依存を減らす

2.5.6. フックメソッド

2.5.6.1. 継承者がスーパークラスに特化を提供できるようにする

2.5.6.2. 抽象的なアルゴリズムを知らなくともサブクラスは専門性を加えられる

2.5.7. 継承の強みは、拡張の容易さ

2.6. モジュール化

2.6.1. 役割(ロール)で振る舞いを抽象

2.6.2. 抽象クラスを継承したらサブクラスでは必ずコードを利用する。モジュールも同様

2.7. コンポジション

2.7.1. =オブジェクトの組み合わせ

2.7.2. 複数のオブジェクトをhas-aの関係で組み合わせる

2.7.3. コンポジション > 継承

2.8. まとめ

2.8.1. 継承

2.8.1.1. 将来の要件変更が少ない場合

2.8.1.2. オブジェクト同士がis-aの関係を持つ場合

2.8.2. コンポジション

2.8.2.1. クラスが複数のパーツから構成される場合

2.8.2.2. オブジェクト同士がhas-aの関係の場合

2.8.3. ダックタイピング

2.8.3.1. 関連しないオブジェクト同士にも同じ振る舞いを持たせたい場合

2.8.3.2. behaves-like-aの関係

2.8.3.3. クラスの責務として適当ではない振る舞いの場合