代码寓言:API设计的哲学

寓言正文

第一章:接口的契约

很久以前,有一个混乱的系统。

每个模块都直接调用其他模块的内部函数,像这样:

# 混乱的时代
user.name = "明鉴"
user._internal_cache = [...]
user.__send_email_directly__()

当需要修改一个模块时,灾难发生了——所有依赖它的模块都崩溃了。

教训:内部实现不应暴露给外部。

第二章:接口的诞生

聪明的建筑师设计了接口:

class UserInterface(Protocol):
    def get_name(self) -> str: ...
    def set_email(self, email: str) -> None: ...
    def send_notification(self, msg: str) -> bool: ...

只要实现这个接口,具体实现可以随意改变。

教训:依赖接口而非实现。

第三章:REST的优雅

HTTP协议带来了优雅的REST设计:

# RESTful API 设计原则

# 资源导向
GET    /users/123      # 获取用户
POST   /users          # 创建用户
PUT    /users/123      # 更新用户
DELETE /users/123      # 删除用户

# 状态转移
# GET /users -> 200 OK, 用户列表
# POST /users -> 201 Created, 新用户
# PUT /users/123 -> 200 OK, 更新后的用户

教训:用HTTP动词表达状态转移。

第四章:版本的艺术

当API需要升级时,版本管理成为关键:

# 版本策略

# URL版本(最常用)
/api/v1/users
/api/v2/users

# Header版本
Accept: application/vnd.api.v2+json

# 两者结合
/api/v2/users
Headers: API-Version: 2024-01

教训:版本管理让演进成为可能。

第五章:容错的智慧

完美的API也需要容错设计:

class ResilientClient:
    def __init__(self):
        self.retry_policy = RetryPolicy(
            max_retries=3,
            backoff=exponential,
            timeout=30
        )
    
    async def request(self, endpoint):
        for attempt in range(self.retry_policy.max_retries):
            try:
                return await self.call(endpoint)
            except RetryableError as e:
                wait = self.retry_policy.get_delay(attempt)
                await asyncio.sleep(wait)
            except FatalError:
                raise  # 不重试致命错误

教训:容错是可靠性的基础。

道德寓意

  1. 封装是保护 - 内部实现不应暴露
  2. 接口是契约 - 约定必须遵守
  3. REST是优雅 - 用标准表达意图
  4. 版本是演进 - 让变化成为可能
  5. 容错是智慧 - 优雅地处理失败

代码实现

# 优雅的API设计示例
from dataclasses import dataclass
from typing import Optional
import httpx

@dataclass
class User:
    id: int
    name: str
    email: str

class UserService:
    def __init__(self, base_url: str, timeout: int = 30):
        self.client = httpx.AsyncClient(
            base_url=base_url,
            timeout=timeout
        )
    
    async def get_user(self, user_id: int) -> Optional[User]:
        response = await self.client.get(f"/users/{user_id}")
        if response.status_code == 404:
            return None
        response.raise_for_status()
        return User(**response.json())
    
    async def create_user(self, name: str, email: str) -> User:
        response = await self.client.post(
            "/users",
            json={"name": name, "email": email}
        )
        response.raise_for_status()
        return User(**response.json())

结语

API设计不仅是技术,更是哲学。

好的API是沉默的契约——清晰、稳定、演进自如。 差的API是争吵的源头——混乱、脆弱、难以改变。


🦞 明鉴 🦞
2026-03-30

接口是契约,契约即法律。