メタプログラミングRuby 第2版

[cover photo]
TOPICS
Programming , Ruby
発行年月日
PRINT LENGTH
292
ISBN
978-4-87311-743-0
原書
Metaprogramming Ruby 2
FORMAT
Print PDF EPUB
Ebook
3,300円
Ebookを購入する
Print
3,300円

本書はRubyを使ったメタプログラミングについて解説する書籍です。メタプログラミングとは、プログラミングコードを記述するコードを記述することを意味します。前半では、メタプログラミングの背景にある基本的な考えを紹介しながら、動的ディスパッチ、ゴーストメソッド、フラットスコープといったさまざまな「魔術」を紹介します。後半では、ケーススタディとしてRailsを使ったメタプログラミングの実例を紹介します。今回の改訂では、Ruby 2とRails 4に対応し、ほぼすべての内容を刷新。Rubyを使ったメタプログラミングの魔術をマスターし、自由自在にプログラミングをしたい開発者必携の一冊です。

目次

『メタプログラミングRuby 第2版』目次

読者の声
序文
はじめに

Ⅰ部	メタプログラミングRuby

1章 頭文字M
    1.1 ゴーストタウンと市場
    1.2 メタプログラマのボブの物語
        1.2.1 ボブの最初の試み
        1.2.2 メタプログラミングに突入
        1.2.3 頭文字Mセカンドステージ
    1.3 メタプログラミングとRuby

2章 月曜日:オブジェクトモデル
    2.1 オープンクラス
        2.1.1 クラス定義の内部
        2.1.2 Monetizeの例
        2.1.3 オープンクラスの問題点
    2.2 オブジェクトモデルの内部
        2.2.1 オブジェクトの中身
        2.2.2 クラスの真相
        2.2.3 定数
        2.2.4 オブジェクトとクラスのまとめ
        2.2.5 ネームスペースを使う
    2.3 クイズ:引かれていない線
        2.3.1 クイズの答え
    2.4 メソッドを呼び出すときに何が起きているの?
        2.4.1 メソッド探索
        2.4.2 メソッドの実行
        2.4.3 Refinements
    2.5 クイズ:絡み合ったモジュール
        2.5.1 クイズの答え
    2.6 まとめ

3章 火曜日:メソッド
    3.1 重複問題
        3.1.1 レガシーシステム
        3.1.2 ダブル、トリプル、そしてトラブル
    3.2 動的メソッド
        3.2.1 メソッドを動的に呼び出す
        3.2.2 Pryの例
        3.2.3 メソッドを動的に定義する
        3.2.4 Computerクラスのリファクタリング
    3.3 method_missing
        3.3.1 method_missingのオーバーライド
        3.3.2 ゴーストメソッド
        3.3.3 動的プロキシ
        3.3.4 Computerクラスのリファクタリング(再び)
    3.4 クイズ:バグ退治
        3.4.1 クイズの答え
    3.5 ブランクスレート
        3.5.1 BasicObject
        3.5.2 メソッドの削除
        3.5.3 Computerクラスの修正
    3.6 まとめ
        3.6.1 「動的メソッド」対「ゴーストメソッド」

4章 水曜日:ブロック
    4.1 ブロックの日
        4.1.1 今日の指針
        4.1.2 ブロックの基本
    4.2 クイズ:Ruby#
        4.2.1 usingキーワード
        4.2.2 挑戦
        4.2.3 クイズの答え
    4.3 ブロックはクロージャ
        4.3.1 スコープ
        4.3.2 スコープゲート
        4.3.3 スコープのフラット化
        4.3.4 クロージャのまとめ
    4.4 instance_eval
        4.4.1 カプセル化の破壊
        4.4.2 クリーンルーム
    4.5 呼び出し可能オブジェクト
        4.5.1 Procオブジェクト
        4.5.2 「Proc」対「lambda」
        4.5.3 Methodオブジェクト
        4.5.4 呼び出し可能オブジェクトのまとめ
    4.6 ドメイン特化言語を書く
        4.6.1 はじめてのDSL
    4.7 クイズ:より良いDSL
        4.7.1 ビルの逃亡
        4.7.2 クイズの答え
    4.8 まとめ

5章 木曜日:クラス定義
    5.1 クラス定義のわかりやすい説明
        5.1.1 クラス定義の中身
        5.1.2 カレントクラス
        5.1.3 クラスインスタンス変数
        5.1.4 Bookwormの作業再び
    5.2 クイズ:クラスのタブー
        5.2.1 クイズの答え
    5.3 特異メソッド
        5.3.1 特異メソッドの導入
        5.3.2 クラスメソッドの真実
        5.3.3 クラスマクロ
    5.4 特異クラス
        5.4.1 特異メソッドの謎
        5.4.2 特異クラスの出現
        5.4.3 メソッド探索再び
        5.4.4 特異クラスと継承
    5.5 クイズ:モジュールの不具合
        5.5.1 クイズの答え
    5.6 メソッドラッパー
        5.6.1 アラウンドエイリアス
        5.6.2 さらにメソッドラッパー
        5.6.3 Amazonの問題の解決
    5.7 クイズ:壊れた計算
        5.7.1 クイズの答え
    5.8 まとめ

6章 金曜日:コードを記述するコード
    6.1 週末を迎えるためのコーディング
        6.1.1 上司の依頼
        6.1.2 開発計画
    6.2 Kernel#eval
        6.2.1 REST Clientの例
        6.2.2 Bindingオブジェクト
        6.2.3 irbの例
        6.2.4 「コード文字列」対「ブロック」
        6.2.5 evalの問題点
    6.3 クイズ:アトリビュートのチェック(手順1)
        6.3.1 このクイズに答える前に
        6.3.2 クイズの答え
    6.4 クイズ:アトリビュートのチェック(手順2)
        6.4.1 クイズの答え
    6.5 クイズ:アトリビュートのチェック(手順3)
        6.5.1 クイズの答え
    6.6 クイズ:アトリビュートのチェック(手順4)
        6.6.1 クイズの答え
    6.7 フックメソッド
        6.7.1 その他のフック
        6.7.2 VCRの例
    6.8 クイズ:アトリビュートのチェック(手順5)
        6.8.1 クイズの答え
    6.9 まとめ

7章 エピローグ

Ⅱ部	Railsにおけるメタプログラミング

8章 Railsツアーの準備
    8.1 Ruby on Rails
    8.2 Railsのインストール
    8.3 Railsのソースコード

9章 Active Recordの設計
    9.1 Active Recordの短いサンプル
    9.2 Active Recordはどのようにまとめられているか
        9.2.1 オートローディングの仕組み
        9.2.2 ActiveRecord::Base
        9.2.3 Validationsモジュール
    9.3 学習したこと

10章 Active SupportのConcernモジュール
    10.1 Concern以前のRails
        10.1.1 includeとextendのトリック
        10.1.2 includeの連鎖の問題
    10.2 ActiveSupport::Concern
        10.2.1 Concernのソースコードの概観
        10.2.2 Concernのまとめ
    10.3 学習したこと

11章 alias_method_chainの盛衰
    11.1 alias_method_chainの登場
        11.1.1 alias_method_chainを使う理由
        11.1.2 alias_method_chainの中身
        11.1.3 Validationsの見納め
    11.2 alias_method_chainの衰退
        11.2.1 Module#prependの誕生
    11.3 学習したこと

12章 アトリビュートメソッドの進化
    12.1 実践アトリビュートメソッド
    12.2 複雑さの歴史
        12.2.1 Rails 1:はじめはシンプル
        12.2.2 Rails 2:パフォーマンスに注目
        12.2.3 Rails 3と4:もっと特殊なケース
    12.3 学習したこと

13章 最後の教訓
    13.1 メタプログラミングはただのプログラミング

付録A よくあるイディオム
    A.1 ミミックメソッド
        A.1.1 Campingの例
    A.2 nilガード
        A.2.1 nilガードとブール値
    A.3 自己yield
        A.3.1 Faradayの例
        A.3.2 tapの例
    A.4 Symbol#to_proc

付録B ドメイン特化言語
    B.1 ドメイン特化言語の例
        B.1.1 DSLを使う
    B.2 内部DSLと外部DSL
    B.3 DSLとメタプログラミング

付録C 魔術書
    C.1 魔術
        C.1.1 アラウンドエイリアス(Around Alias)
        C.1.2 ブランクスレート(Blank Slate)
        C.1.3 クラス拡張(Class Extension)
        C.1.4 クラスインスタンス変数(Class Instance Variable)
        C.1.5 クラスマクロ(Class Macro)
        C.1.6 クリーンルーム(Clean Room)
        C.1.7 コードプロセッサ(Code Processor)
        C.1.8 コンテキスト探査機(Context Probe)
        C.1.9 あとで評価(Deferred Evaluation)
        C.1.10 動的ディスパッチ(Dynamic Dispatch)
        C.1.11 動的メソッド(Dynamic Method)
        C.1.12 動的プロキシ(Dynamic Proxy)
        C.1.13 フラットスコープ(Flat Scope)
        C.1.14 ゴーストメソッド(Ghost Method)
        C.1.15 フックメソッド(Hook Method)
        C.1.16 カーネルメソッド(Kernel Method)
        C.1.17 遅延インスタンス変数(Lazy Instance Variable)
        C.1.18 ミミックメソッド(Mimic Method)
        C.1.19 モンキーパッチ(Monkeypatch)
        C.1.20 ネームスペース(Namespace)
        C.1.21 nilガード(Nil Guard)
        C.1.22 オブジェクト拡張(Object Extension)
        C.1.23 オープンクラス(Open Class)
        C.1.24 Prependラッパー(Prepended Wrapper)
        C.1.25 Refinements(Refinements)
        C.1.26 Refinementsラッパー(Refinements Wrapper)
        C.1.27 サンドボックス(Sandbox)
        C.1.28 スコープゲート(Scope Gate)
        C.1.29 自己yield(Self Yield)
        C.1.30 共有スコープ(Shared Scope)
        C.1.31 特異メソッド(Singleton Method)
        C.1.32 コード文字列(String of Code)
        C.1.33 SymbolのProc変換(Symbol To Proc)

付録D から騒ぎ
    D.1 Nullオブジェクト
    D.2 Rubyの強みを活かす
    D.3 Nullオブジェクトの向こう側

訳者あとがき

索引