# 5.7 例子：HTTP响应中的默认值

HTTP项目还必须提供对生成HTTP响应的支持。学生们在这方面最常犯的错误是默认值不足。每个HTTP响应必须指定一个HTTP协议版本；一个小组要求调用者在创建响应对象时明确指定这个版本。然而，响应的版本必须与请求对象中的版本相对应，而且在发送响应时，请求必须已经作为一个参数被传递（它指出了发送响应的位置）。因此，HTTP类自动提供响应版本更有意义。调用者不太可能知道要指定什么版本，而且如果调用者确实指定了一个值，很可能导致HTTP库和调用者之间的信息泄露。HTTP响应还包括一个`Date`头，指定响应发送的时间；HTTP库也应该为这个提供一个合理的默认值。

默认值说明了这样一个原则：接口的设计应该尽可能地使普通情况简单。它们也是部分信息隐藏的一个例子：在正常情况下，调用者不需要知道默认项的存在。在极少数情况下，如果调用者需要覆盖一个默认值，它必须知道该值，并且可以调用特殊方法来修改它。

只要有可能，类应该在没有明确要求的情况下“做正确的事情”。默认值就是这方面的一个例子。[第4.7节](https://placeboy.gitbook.io/a-philosophy-of-software-design/ch4-modules-should-be-deep/4.7-li-zi-java-he-unix-io)的Java I/O例子从反面说明了这一点。文件I/O中的缓冲是非常普遍的，任何人都不应该明确要求它，甚至不应该知道它的存在；I/O类应该做正确的事情，自动提供它。最好的功能是那些你甚至不知道它们存在的功能。

{% hint style="danger" %}

#### 危险信号：过曝

如果一个常用的功能的API迫使用户去了解其他很少使用的功能，这就增加了那些不需要很少使用的功能的用户的认知负荷。
{% endhint %}
