(概要)
Rubyを題材に,APIデザインの各種事例を取り上げた技術解説書。実用のための言語のAPIデザインには,使いやすさ,一貫性,速度,互換性など,さまざまな点でバランスの良さが求められます。それらの点で,長きにわたり定評がある言語の一つは「Ruby」ではないでしょうか。本書ではRubyの事例をベースに,APIデザインの過程と考え方を丁寧に解説。言語の中核機能を担う「I/O」「ソケット」「プロセス」「時刻」「数,文字列」をカバーし,APIデザインの核心に迫ります。熟達のRubyコミッタによる全面書き下ろし。
(目次)
第1章 I/O
1.01 RubyのIOクラスとC言語のstdioライブラリ ――プログラマが知っている名前を利用する1.02 feof関数とIO#eof?メソッド ――過去にEOFに出会ったのか,それとも今現在EOFなのか1.03 IOバッファが空でなければsysreadは例外 ――明らかに危険で役に立たない動作は禁止する1.04 EOFフラグの除去 ――モードで挙動が変化するのは良くない1.05 0バイト読んだときに何を返す? ――用例を探して良い挙動を判断する1.06 selectとstdioのバッファ ――無理をしても使いやすくする1.07 readpartial ――I/Oを多重化したときに適切なメソッド1.08 ノンブロッキングI/O ――モードで挙動が変化するのは良くない1.09 ノンブロッキングI/Oメソッドの導入 ――read_nonblockやwrite_nonblock1.10 PTY.open ――ptyを利用するためのプリミティブ1.11 IOによるエンコーディング変換 ――正しく処理すべだが,速度も重要第2章 ソケット
2.01 Addrinfoクラスの導入 ――関連して扱う情報をまとめてオブジェクトにする2.02 Socketクラスの勧め ――使いやすく,かつ,低レベルな操作も可能2.03 Socket.ip_address_list ――自ホストのIPアドレスを正しく簡単に得る2.04 ソケットオプション ――関連して扱う情報をまとめてオブジェクトにする2.05 send_ioとrecv_ioによるfd passing ――ポータブルで引数の少ないAPI2.06 recvmsgとsendmsg ――多機能なシステムコールを工夫して提供2.07 getpeereid ――簡単確実なユーザ認証第3章 プロセス
3.01 プロセス起動プリミティブspawnメソッド ――ポータブルで高機能で簡単なプロセス起動3.02 close-on-execフラグ ――意図しないfdの継承を防止する3.03 Open3.popen3の修正 ――互換性を保って問題を解決する3.04 open3における標準エラー出力の扱いと3.05 open3のパイプラインサポート ――パイプで接続したプロセス起動3.06 双方向popenのソケットによる実現 ――ソケットペアによる実装の失敗3.07 forkは他のスレッドを子プロセスに残さない ――用途に適した挙動が重要第4章 時刻
4.01 POSIXの時刻機能とRubyのTimeクラス ――プログラマが知っているPOSIXの機能を提供する4.02 Time.utcと閏秒 ――POSIXが提供していなくても必要なら提供する4.03 Time#monとTime#ydayの範囲 ――実際の用法を検討してAPIをデザインする4.04 時刻に関するOSの制限 ――本質的でない制限を取り除く4.05 localtimeの逆関数 ――mktimeに依存しない4.06 localtimeの外挿 ――2038年問題への対応4.07 UTCからの時差と夏時間 ――対象を確実に表現するデータ構造4.08 UTCからの時差を指定 ――メンテナンスを増やさない範囲で表現を広げる4.09 秒未満の表現 ――有理数による表現4.10 タイムゾーンの略称 ――問題が多過ぎるので避ける4.11 time.rbが提供するメソッドの意図 ――正しい方が簡単になるようにしておく4.12 Time.localとTime.utcの引数順 ――あからさまに奇妙だが互換性のために残っている第5章 数,文字列
5.01 Math.gammaのメソッド名 ――慣習は無視することもある5.02 Integer#nonzero?の返り値 ――意外な動作だけど役に立つ5.03 有理数のビット演算 ――一貫性を拡張するのは無理かもしれない5.04 Integer#bit_lengthメソッド ――用途と前例を調べる5.05 文字列中の式展開構文の一貫性 ――一貫性を優先5.06 URI.encode_www_formとURI.decode_www_form ――間違いにくいAPI