在Clojure中,我们一次又一次地使用相同的数据结构,并在其上运行许多函数。另一方面,Java程序员为每一组数据创建一个唯一的类,并使用自己的“API”(getter、setter、return type等)来访问和操作数据。由于被迫在两个这样的“类API”之间进行翻译,我想与大家分享我的经验,从而在实践中证明格言中的真理
请注意,本文谈论的是数据和数据承载类,而不是“业务逻辑”,它将由Java中所述对象上的方法和Clojure中命名空间中的函数(最好是纯函数)实现。
注意:本文会交替使用Java和Groovy,因为它们基本相同;本文所说的一个也适用于另一个。
问题所在
我一直在写一个代理,接收 javax.servlet.http.HttpServletRequest
并通过 Apache HttpClient 的 org.apache.http.client.methods.HttpUriRequest
,然后从 org.apache.http.HttpResponse
到 javax.servlet.http.HttpServletResponse
,尤其是关于(一个子集)头的响应。
这是一件痛苦的事,因为每个人都有自己的头表示和使用 headers 的API:
// javax.servlet.http.HttpServletRequest: Enumeration<String> getHeaderNames(); /** Returns all the values of the specified request header as an Enumeration of String objects. */ Enumeration<String> getHeaders(String name); // org.apache.http.client.methods.RequestBuilder: /** Add a header; repeat to add multiple values */ RequestBuilder addHeader(String name, String value); //------------- // javax.servlet.http.HttpServletResponse: /** Add a header; repeat to add multiple values */ void addHeader(String name, String value); // org.apache.http.HttpResponse: Header[] getAllHeaders(); // Header: String getName(); String getValue();
这里,枚举和数组是通用的数据结构,但头和请求对 getHeaderNames
和