Atitit 提升可读性 流畅接口
1.1. 大接口vs 小接口 小接口可用流畅api串接起来 1
2.3.1. 每个函数都必须返回“this” 每个函数应该返回什么以确保可以调用下一个函数? 3
1.1. 大接口vs 小接口 小接口可用流畅api串接起来
1.2. 部分comm fun可用大接口固化
很多人将链式调用等同于流畅接口。然而链式调用是流畅接口的一种常用方法,真实的流畅接口不止这么一点点
2. 流畅接口 方法连 “Fluent接口 链接机制
(List) strService .newx(). findV2(strService.mybatisParamTmplt, sql).mybatsiParamsNoWarp().getRztLi();
jQuery的一个吸引人的功能就是你可以建立一系列命令的方式,看起来就像你使用语言的方式。这通常被称为“Fluent接口”,并且在JavaScript中实现并不困难。
Eric Evans 和Martin Fowler 首先提出了流畅界面的概念,以表达面向对象API的概念。该技术使用方法链,但如果您想将其称为流畅接口,则它还必须具有特定于域的语言的特征。简而言之,这些方法链接在一起必须表达自然的操作集合。理想情况下,方法链应该看起来像你正在写一个带有动词和修饰符的小程序。
2.1. 链接机制
链接的原则是每个函数都必须返回一个对象,该对象支持链中的下一个函数作为方法。
这就是所有功能链
2.2. 单身链
在讨论更复杂的例子之前,让我们来看看另一个简单的例子 - 单例链接。
单例是一个不是由构造函数创建的JavaScript对象 - 它是一个对象文字。
在这种情况下,我们想要做的是允许将每个函数定义为同一对象的一个方法 - obj说。为了允许链接,我们必须安排每个方法返回一个对象,每个后续函数都定义在这个对象上,在这种情况下,它只是obj。这真的很简单
2.3. 实例链接
单例可能非常有用,但我们通常希望能够根据需要创建一个对象的多个实例,在这种情况下,我们必须继续查看实例链接
2.3.1. 每个函数都必须返回“this” 每个函数应该返回什么以确保可以调用下一个函数?
在这种情况下,每个函数都必须返回“this”,因为当函数被调用时,“this”引用该函数是其方法的实例。
我们必须解决的第一个问题是,与不流畅的计算方法不同,我们的函数不能返回计算结果。实际上,结果必须存储为calc对象的状态。这是使用函数链接的另一种常见模式 - 过去常常必须将内容结构化到对象的状态中。
c.setValue(100).sqrt().display().square().display().times(3).display();
你可以看到它开始看起来像一种特殊语言的程序。
3. 流畅接口的其他市县
3.1. 基本语义抽象
重要的是应该体会到它们从一定程度上跳出了语言基本抽象机制的束缚,我们不应该再用类职责划分、迪米特法则(Law of Demeter)等OO设计原则来看待它们。
3.2. 管道抽象 方法连
jQuery的链式调用设计也具有管道的风格,方法链上流动的是同一类型的jQuery对象,每一步方法调用是对对象的一次作用,整个方法链将各个方法的作用叠加起来。
3.3. 层次结构抽象
除了管道这种“线性”结构外,流畅接口还可用于构造层次结构抽象。比如,用Javascript动态创建创建下面的HTML片段:
HTML片段:
<div id="’product_123’" class="’product’"><img src="’preview_123.jpg’" alt="" /><ul>
<li>Name: iPad2 32G</li>
<li>Price: 3600</li></ul></div>
若采用Javascript的DOM API:
//Javascriptvar div = document.createElement('div');
div.setAttribute(‘id’, ‘product_123’);
div.setAttribute(‘class’, ‘product’);
var img = document.createElement('img');
img.setAttribute(‘src’, ‘preview_123.jpg’);
div.appendChild(img);
var ul = document.createElement('ul');var li1 = document.createElement('li');var txt1 = document.createTextNode("Name: iPad2 32G");
li1.appendChild(txt1);
…
div.appendChild(ul);
而下面流畅接口API则要有表现力得多:
//Javascript
var obj =
$.div()
.img()
.ul()
.li().text(‘Name: iPad2 32G’)._li()
.li().text(‘Price: 3600’)._li()
._ul()
._div();
3.4. 4. 异步抽象
流畅接口不仅可以构造复杂的层次抽象,还可以用于构造异步抽象。在基于回调机制的异步模式中,多个异步调用的同步和嵌套问题是使用异步的难点所在。有时一个稍复杂的调用和同步关系会导致代码充满了复杂的同步检查和层层回调,难以理解和维护。这个问题从本质上讲和上面HTML的例子一样,是由于多数通用语言并未把异步作为基本元素/语义,许多异步实现模式是向语言的妥协。针对这个问题,我用Javascript编写了一个基于流畅接口的异步DSL,示例代码如下
3.5. Dsl
4. Q其他实现模式
4.1. Builder patter
4.2. 内部嵌套 Builder
4.3. Guava 流畅接口
4.4. Functin 接口
4.5. Jdk8 stream api
4.6. Linq接口 Sql接口
5. 参考资料
链接 - JavaScript中流畅的接口.html
API设计:用流畅接口构造内部DSL - SegmentFault 思否.html
如何设计一个好的接口 - 简书.html
如何设计一个好的接口 - 简书.html
如何设计一个好的接口1
前言2
避免过度封装2
见名知意3
仅把必要的工作交给客户程序员3
充分保证程序的可扩展性4
简洁4
百分比原则4
文档表述要清晰4
总结4
这5个事项让你设计出良好开发接口-电子发烧友网.html todo