zakkyの雑記

エンジニアリング全般についての備忘録

読書メモ 『confident ruby』

どんな本か

Rubyのメソッドはいったいどのような要素で構成されているのかを解明し、より責務が明確で見通しを立てやすいコードを書く技を学ぶことを目的とした本

どんな内容か

1章

  • メソッドの中身は必ず以下の4要素に分類できる
    1. Collecting input :入力値の収集
    2. Performing work :中核となる働きを行う
    3. Delivering output :結果を出力する
    4. Handling failures :エラーハンドリングを行う
  • 4要素がごちゃごちゃっと混在しているメソッドは脆く、読みにくい
  • 読みやすいメソッドというのは、以下の順番で動作する
    1. 入力値を収集し、
    2. 中核となる動作を行い、
    3. 結果を出力し、
    4. 最後にエラーハンドリングをする

2章 Performing Work

  • work(働き)という要素の構造は、このメソッドがどんな責務を負っているかによって決定づけられる
  • OOPのコアとなる特徴は、「メッセージの送信」であり、プログラムの働きというのはつまるところ、オブジェクトにメッセージを送る一連の流れのことである
  • OOPを行うということは、どんなメッセージが送られ、どんな環境下で、どんなオブジェクトが各メッセージを受け取るかを意思決定していくことである
  • 保守性があるコードを書くとは、一度に一つのことに注意を向けるようにし、一度に一つのレベルの抽象度の物事について思考できるようにすることである
  • これらを実現するには以下の3つが必要であり、既存メソッドを分析する際もこの視点を持つとよい
    1. タスクを実現できるために送るメッセージの特定
    2. そのメッセージに対応するロール(役割)の特定
    3. そのロールを担えるオブジェクトを、メソッドがしっかりと受け取ることの保証
  • ロールとは、「責務の集合」である。クラスとは別の概念。
  • レシーバに送るメッセージと、レシーバの責務とがそれぞれ対応する形で分解できる。 -例: lagecy_data_parser(ロールをもつレシーバ)に対し、#parse_legacy_purchase_records(メッセージ)に応答するよう求める -例:customer_listに、#get_productに応答するよう求める
  • ロールとはダックタイピングにおけるダックのこと。ダックタイプには2つの落とし穴がある
    1. ダックの正体を見誤ること
    2. 型チェックを行うこと。nil?でNilClassのチェックをしているのも型チェックに他ならない
  • 多くのifやcaseが登場し出したら、そのオブジェクトは1種類以上の役割を果たそうとする複数責務を持つものだと疑うべき

3章 Collecting Input

  • 入力値を受け取らないメソッドというのは存在せず、もし完全に入力値を受け取らないならそれは定数で表現できるはずだ
  • 一番わかりやすい入力値の形式はメソッドの引数。他にも定数や他のメソッド、インスタンス変数なども入力値の一つ。
  • 普段はクラスのことをトップレベル定数とは捉えないし、入力値の一つとしても捉えないが、クラスも立派な入力値の一つである