API 設計の基本
ソフトウェア同士をつなぐ「使い方の約束(インターフェース)」を、使いやすく壊れにくく設計する考え方です。命名・一貫性・後方互換・エラー設計が品質を左右します。
- 1.API は機能を利用するための「約束(契約)」であり、内部実装を隠して必要な操作だけを公開します。
- 2.良い API は直感的な命名・全体を貫く一貫性・予測しやすさを備え、利用者が学習しやすくなります。
- 3.一度公開した API は壊さない後方互換が重要で、避けられない変更はバージョニングで段階移行します。
API とは「使い方の約束」
API(Application Programming Interface)は、あるソフトウェアの機能を外から呼び出すための約束ごとです。利用者は内部の作りを知らなくても、決められた入口(関数・エンドポイント)を通じて機能を使えます。家電のリモコンに例えるなら、ボタンの配置と役割が API、内部の電子回路が実装にあたります。
- 隠蔽 — 内部の複雑さを隠し、利用者には必要な操作だけを見せます。
- 契約 — 「この入力を渡せば、この出力が返る」という取り決めです。
- 境界 — ライブラリ・サービス・モジュールの間の接点として機能します。
ライブラリの公開関数、Web の REST/GraphQL エンドポイント、OS のシステムコールなど、形はさまざまですが「実装を隠し、約束された操作だけを公開する」という本質は共通です。設計の良し悪しは、利用者がどれだけ迷わず・安全に使えるかで決まります。
使いやすい API の原則
優れた API には共通する性質があります。中でも重要なのは、学ばなくても推測できること、そして全体が一貫していることです。
- 直感的な命名 —
getUserByIdのように、名前から動作が読み取れること。 - 一貫性 — 似た操作は似た形にする。
getUserがあるならgetOrderも同じ流儀で。 - 最小限の公開 — 公開する面を小さく保つ。一度出すと撤回が難しいためです。
- 予測可能性 — 同じ入力には同じ結果。隠れた副作用で利用者を驚かせないこと。
// 一貫性のない例:命名も引数順もバラバラで覚えられない
fetchUser(id);
order_get(orderId);
deleteItemById(id, true);
// 一貫した例:動詞+対象、引数の並びも揃っている
getUser(userId);
getOrder(orderId);
deleteItem(itemId, { force: true });
良い API は、利用者が「たぶんこう動くだろう」と思った通りに動きます(最小驚きの原則)。命名・引数の順序・戻り値の形を、既存の慣習や API 内の他の関数とそろえることが、ドキュメントを読まずに使える体験につながります。迷ったら「自分がこの名前を見たら何を期待するか」を基準にしましょう。
エラー設計
正常系だけでなく、失敗をどう伝えるかが API の使い勝手を大きく左右します。エラーは「利用者が次に何をすべきか」を判断できる形で返すのが理想です。
- 何が起きたかを区別できる — 「不正な入力」と「権限がない」と「サーバー障害」は別物として伝えます。
- 一貫した形 — エラーの構造(コード・メッセージ・詳細)を全体でそろえます。
- 行動可能な情報 — 「失敗しました」ではなく、原因と対処の手がかりを含めます。
Web API では、HTTP ステータスコードで大分類を表すのが定石です。
| 種類 | 例 | 意味 |
|---|---|---|
| 2xx | 200, 201 | 成功 |
| 4xx | 400, 401, 404 | 利用者側の誤り(入力・認証・不在) |
| 5xx | 500, 503 | サーバー側の障害 |
{
"error": {
"code": "INVALID_EMAIL",
"message": "メールアドレスの形式が正しくありません",
"field": "email"
}
}
このように機械が判別できるコードと人が読めるメッセージを分けて返すと、呼び出し側が分岐処理も表示もしやすくなります。
後方互換とバージョニング
API がいったん公開されると、その先には自分が把握しきれない利用者がいます。安易に仕様を変えれば、彼らのコードが一斉に壊れます。だからこそ**後方互換性(backward compatibility)**の維持が最優先になります。
| 変更の種類 | 例 | 互換性 |
|---|---|---|
| 安全な変更 | 任意フィールドの追加、新エンドポイント | 壊れない |
| 破壊的変更 | フィールド削除、引数の意味変更、必須化 | 壊れる |
避けられない破壊的変更が必要になったら、古い版を残したまま新しい版を並走させるバージョニングで段階的に移行します。URL に含める方式(/v1/users、/v2/users)が広く使われます。
公開 API のフィールド削除や挙動変更は、利用者のコードを予告なく壊す行為です。追加は自由・変更と削除は慎重にが原則。やむを得ず廃止する場合は、いきなり消さず「非推奨(deprecated)」として一定期間アナウンスし、移行先を案内してから撤去します。新版を出しても旧版をしばらく維持する余裕を、最初から設計に織り込んでおきましょう。
まとめ
API は、実装を隠して必要な操作だけを公開する「使い方の約束」です。使いやすさの核心は、推測できる命名と全体を貫く一貫性、そして利用者を驚かせない予測可能性にあります。失敗の伝え方を整えるエラー設計も体験を大きく左右します。さらに、一度公開した契約を壊さない後方互換を最優先とし、避けられない変更はバージョニングで段階移行する——これらを守ることで、長く信頼される API になります。
プログラミング Article
API 設計の基本を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
API
比較で見る軸
難易度: intermediate / カテゴリ: プログラミング / タグ数: 3
導入後に効く点
良い API は直感的な命名・全体を貫く一貫性・予測しやすさを備え、利用者が学習しやすくなります。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- プログラミング
- タグ数
- 3
判断チェックリスト
- 自社の用途が「API / 設計」に近いか確認する。
- 強みである「API は機能を利用するための「約束(契約)」であり、内部実装を隠して必要な操作だけを公開します。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。