「C++のためのAPIデザイン」を読みました

4分の1ほど読んで1年半ほど積読してしまいましたが、重い腰をあげて読むことにしました。

本のタイトルでは「C++のための」となっていますが、C++だけに限定されない内容も多く含んでおり、APIやライブラリのデザインが学べます。C++を書く人なら読んでおいた方がいいと思いますし、そうでない人も具体的なコードはスキップしても読む価値があると思います。

大型本
Kindle版

概要

目次は次の通りです。

  • 第1章 はじめに
  • 第2章 優れたAPIの特徴
  • 第3章 パターン
  • 第4章 デザイン
  • 第5章 スタイル
  • 第6章 C++の使用法
  • 第7章 パフォーマンス
  • 第8章 バージョン管理
  • 第9章 ドキュメント
  • 第10章 テスティング
  • 第11章 スクリプト記述
  • 第12章 拡張性
  • 付録 ライブラリ

個人的には、「第2章 優れたAPIの特徴」、「第8章 バージョン管理」、「第9章 拡張性」が新しく知ることが多く、面白かったです。それぞれ、印象に残った点だけ紹介したいと思います。

「第2章 優れたAPIの特徴」

「第2章 優れたAPIの特徴」では、次の特徴を持つことが優れたAPIであると解説されています。

  • 問題領域のモデリングがされている
  • 実装の詳細が隠蔽されている
  • 最小限の完全性を持っている
  • 使いやすい
  • 疎結合である
  • 安定している
  • 文書がある
  • テストがある

どれも重要であると思いますが、一番印象に残ったのは次の一文でした。

優れたAPIは疎結合であり高凝集である。

また、「優れたソフトウェア設計は、さまざまなコンポーネント間の機能面での関係性や結びつきが最小限である。」とも言い換えられています。驚くことに、1974年、いまから40年以上前の構造化ソフトウェア設計の論文で、ソフトウェアの結合度と凝集度の概念が紹介されていたそうです。

第8章 バージョン管理

「第8章 バージョン管理」では、APIのバージョン番号、ライフサイクル、分岐戦略、互換性のレベルや後方互換性を確保する方法が解説されています。特に、後方互換性については次のようなレベルがあり、それぞれ詳しく説明されています。

  • 機能的互換性
  • バイナリ(ABI)互換性
  • ソース(API)互換性

重要な点としては、可能な限りバイナリ互換性を保ったままAPIの保守や機能追加を行なっていくことが望ましい、ということでしょう。バイナリ互換性が保たれていれば、APIを利用しているプログラムを再コンパイルせずにAPIをアップグレードできます。APIのユーザへの影響を少なくできるので、通常はバイナリ互換性は破壊しない方がいいでしょう。

また、バイナリ互換性のあるAPI変更と、バイナリ互換性のないAPI変更が列挙されています。例えば、クラス、メソッド、関数の削除はバイナリ互換性を破壊します。新しいクラスや非仮想メソッド、関数の追加はバイナリ互換性を破壊しません。そういった点を踏まえて、後方互換性を確保しながら機能追加や変更、削除を行なっていく方法について解説しています。

第12章 拡張性

APIの拡張性があるというのは、ユーザが開発者の手を借りずに、特定の用途向けにAPIの振る舞いをカスタマイズできることです。APIも、拡張には開放して修正には閉鎖すべきであるという「開放/閉鎖原則」(Open/Closed Principle: OCP)にしたがって拡張性をもつべきだと述べています。拡張性を持たせる方法については、次の3種類について解説しています。

  • プラグインによる拡張
  • 継承による拡張
  • テンプレートによる拡張

特にプラグインによる拡張には力を入れて説明していて、プラグインモデルの概要、設計上の注意点、プラグインシステムのコード例、プラグインのバージョン管理まで触れています。GIMPやNetscape Plugin APIの例なども出てきて参考になります。

流行のfluentdやembulkはプラグインアーキテクチャを採用しており、拡張性のあるソフトウェアとして良い例になっていると思います。fluentd/embulkは、拡張性のあるアーキテクチャ以外にも、活発なコミュニティ作りなども見習いところです。

まとめ

「C++のためのAPIデザイン」を紹介しました。一部だけ紹介しましたが、それ以外の部分も参考になる点が多く、C++を書く人なら必読書と言って良い内容だと思います。C++の必読書が何冊あるかはさておき。

大型本
Kindle版
スポンサーリンク
レスポンシブ広告




レスポンシブ広告




スポンサーリンク
レスポンシブ広告




コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です