Rubyベストプラクティス

―プロフェッショナルによるコードとテクニック

[cover photo]
TOPICS
Programming , Ruby
発行年月日
PRINT LENGTH
364
ISBN
978-4-87311-445-3
原書
Ruby Best Practices
FORMAT
PDF

本書は、Rubyでのソフトウェア開発経験者を対象に、プログラミングの実践的なテクニックとアイデアを、実際に使われているライブラリやコードを題材に解説します。テキスト処理やファイル管理から、テスト駆動開発、API設計、関数型言語的機能の利用、多言語化やデバッグ、保守に到るまで幅広いトピックを網羅。付録ではRuby 1.8と1.9の両対応の手法やワーストプラクティスを取り上げるなど、より優れたコードを書くための力を身につけることができます。Ruby1.9に完全対応。 ケーススタディに基づいて学ぶ本書は、より良いコーディングについて学びたいRubyプログラマ必携の一冊です。

目次

まえがき
訳者まえがき
はじめに
1章 テストでコードを駆動する
    1.1 テスティングフレームワークについて
    1.2 テストできるように設計する
    1.3 テスティングの基礎
        1.3.1 焦点をしぼったテスト
        1.3.2 例外をテストする
        1.3.3 テストケース全体を同時に実行する
    1.4 高度なテストテクニック
        1.4.1 モックとスタブを使う
        1.4.2 複雑な出力をテストする
    1.5 整理しておく
        1.5.1 ライブラリファイルにテストを組み込む
        1.5.2 テストヘルパー
        1.5.3 カスタムアサーション
    1.6 まとめ
2章 美しいAPIを設計する
    2.1 便利になるよう設計する:RuportのTable()機能
    2.2 Rubyに秘められた力:柔軟な引数処理
        2.2.1 標準的な順序付き引数
        2.2.2 オプションパラメータのある順序付き引数
        2.2.3 疑似キーワード引数
        2.2.4 引数を配列として扱う
    2.3 Rubyに秘められたもう1つの力:コードブロック
        2.3.1 Enumerableを使う
        2.3.2 前処理と後処理を抽象化するためにブロックを使う
        2.3.3 動的コールバックとしてのブロック
        2.3.4 インターフェイスをシンプルにするためのブロック
    2.4 驚かせないこと
        2.4.1 attr_reader、attr_writer、attr_accessorを使おう
        2.4.2 method?とmethod!が何を意味しているか理解しよう
        2.4.3 カスタム演算子を使おう
    2.5 まとめ
3章 動的な機能を使いこなす
    3.1 BlankSlate:ステロイドで強化されたBasicObject
    3.2 柔軟なインターフェイスを作る
        3.2.1 instance_eval()をオプション化する
        3.2.2 method_missing()とsend()を使ってメッセージを扱う
        3.2.3 2つの目的を兼ねたアクセサ
    3.3 オブジェクトごとの振る舞いを実装する
    3.4 既存のコードを拡張、変更する
        3.4.1 新しい機能を追加する
        3.4.2 エイリアス経由で変更する
        3.4.3 オブジェクトごとの変更
    3.5 クラスとモジュールをプログラムで作る
    3.6 フックとコールバックを登録する
        3.6.1 新しく追加された機能を検出する
        3.6.2 継承を捕捉する
        3.6.3 Mix-inを捕捉する
    3.7 まとめ
4章 テキスト処理とファイル管理
    4.1 状態トラッキングによる行指向のファイル処理
    4.2 正規表現
        4.2.1 無理してはいけない
        4.2.2 アンカーは友達
        4.2.3 量指定子を使うときには注意しよう
    4.3 ファイルを扱う
        4.3.1 PathnameとFileUtilsを使う
    4.4 tempfile標準ライブラリ
        4.4.1 自動的にテンポラリディレクトリを処理する
        4.4.2 衝突回避
        4.4.3 既存のI/Oと同じ操作
        4.4.4 自動的にアンリンクする
    4.5 テキスト処理戦略
        4.5.1 高度な行処理
        4.5.2 アトミックな保存
    4.6 まとめ
5章 関数型プログラミングのテクニック
    5.1 怠惰は美徳(lazy.rbの調査)
    5.2 可変状態を最小限にして、副作用を減らす
    5.3 モジュールによるコード整理
    5.4 メモ化
    5.5 無限リスト
    5.6 高階手続き
    5.7 まとめ
6章 うまくいかないとき
    6.1 Rubyコードのデバッギングプロセス
    6.2 欠陥の本質をとらえる
    6.3 コードを精査する
        6.3.1 リフレクションを利用する
        6.3.2 inspectの出力を改良する
        6.3.3 干し草の中から針を見つける
    6.4 Loggerを使う
    6.5 まとめ
7章 文化の壁を取り払う
    7.1 M17Nの実際の例:RubyのCSV標準ライブラリを見る
    7.2 UTF-8変換による移植可能なM17N
        7.2.1 ソースエンコーディング
        7.2.2 ファイルを扱う
        7.2.3 ユーザ入力を系統立てて変換する
    7.3 スタンドアローンスクリプトにおけるM17N
        7.3.1 ロケールからエンコーディングを推測する
        7.3.2 エンコーディングのデフォルトをカスタマイズする
    7.4 M17Nセーフな低レベルテキスト処理
    7.5 コードをローカライズする
    7.6 まとめ
8章 上手なプロジェクトメンテナンス
    8.1 うまく整理されたRubyプロジェクトを調査する(Haml)
    8.2 知っておくべき慣習
        8.2.1 READMEに入れるもの
        8.2.2 ライブラリのレイアウト
        8.2.3 実行ファイル
        8.2.4 テスト
        8.2.5 サンプル
    8.3 RDocによるAPIドキュメンテーション
        8.3.1 基本的なドキュメンテーションテクニックとガイドライン
        8.3.2 RDocディレクティブを使って出力をコントロールする
    8.4 RubyGemsパッケージマネージャ
        8.4.1 Gem::Specificationを書く
        8.4.2 依存関係を扱う
    8.5 Rake:Rubyの組み込みビルドユーティリティ
    8.6 まとめ
付録A 後方互換性のあるコードを書く
    A.1 混乱を避ける
        A.1.1 バックポートするものを選ぶ
        A.1.2 バージョン指定のコードブロック
        A.1.3 よくある操作のための互換用ライブラリ
    A.2 Ruby 1.9における互換性のない機能
        A.2.1 ハッシュによる疑似キーワード
        A.2.2 複数のsplat演算子のある引数
        A.2.3 ブロックローカル変数
        A.2.4 ブロック引数
        A.2.5 新しいProc構文
        A.2.6 鬼車(Oniguruma)
        A.2.7 ほとんどのm17n機能
    A.3 よく見かける問題の回避策
        A.3.1 Enumeratorを使う
        A.3.2 Stringイテレータ
        A.3.3 文字操作
        A.3.4 エンコーディング変換
    A.4 まとめ
付録B Rubyの標準ライブラリを活用する
    B.1 なぜ標準ライブラリが必要なのか?
    B.2 RubyオブジェクトのためのPretty-Printer(pp)
    B.3 HTTPとFTPを扱う(open-uri)
    B.4 日付と時刻を扱う(date)
    B.5 正規表現を使って単語をパースする(strscan)
    B.6 暗号学的ハッシュ関数(digest)
    B.7 数学的なRubyスクリプト(mathn)
    B.8 表形式データを扱う(csv)
    B.9 トランザクション付きのファイルシステムに基づくデータストレージ(pstore)
    B.10 人間が読めるデータシリアライゼーション(json)
    B.11 コード生成のための埋め込みRuby(erb)
    B.12 まとめ
付録C Rubyワーストプラクティス
    C.1 あまり賢く設計しすぎない
        C.1.1 有害なクラス変数
        C.1.2 ハードコードすると苦しくなる
        C.1.3 継承が制限されるとき
    C.2 賢さの暗黒面
        C.2.1 eval()の弊害
        C.2.2 見えない救助活動
        C.2.3 method_missingの間違った使い方
    C.3 まとめ
索 引