当前位置:  开发笔记 > 编程语言 > 正文

流畅的界面和漏洞抽象

如何解决《流畅的界面和漏洞抽象》经验,为你挑选了4个好方法。

什么是流畅的界面?我找不到一个好的定义,但我得到的只是我不熟悉的语言中的长代码示例(例如C++).

另外,什么是漏洞抽象?

谢谢



1> Rasmus Faber..:

流畅的界面是一种API,允许您编写与普通英语一样或多或少的代码.例如:

Find.All.Questions(Where.IsAnswered == true);

方法链通常用作实现的一部分,但除此之外还有更多内容.引用福勒:

我也注意到了一个常见的误解 - 很多人似乎将流畅的界面与Method Chaining等同起来.当然链接是一种常用的技术,可以使用流畅的界面,但真正的流畅性远不止于此.

它通常也称为内部DSL,因为语法类似于DSL,但它是在宿主语言中实现的,而不是由解析器处理.



2> Rasmus Faber..:

漏洞抽象是一种抽象,其中潜在现实的细节经常"泄漏".

所有的抽象或多或少都存在,但有时抽象与潜在的现实非常不相符,它会带来更多的伤害而不是它的帮助.

抽象中"泄漏"的简单示例可能是通常的浮点类型.它似乎代表一般实数,您可以使用它来执行基本计算.但是在某些时候你会遇到一个场景,其中1/3*3!= 1或1 + 10 ^ -20 = 1.这就是实际的实现细节泄露并且抽象中断的情况.



3> Jasper Bekke..:

一个流畅的界面,埃里克埃文斯创造的术语,它只是方法链的另一个名称.Martin Fowler的写了一对夫妇的文章就这个问题,但它大致是这样的:

m_Window = window::with()
    .width(l_Width)
    .height(l_Height)
    .title("default window")
    .left(200)
    .top(200)
.create();

Fluent接口通常用于以不支持它们的语言(例如C++中的命名参数惯例)或域特定语言创建命名参数,以使代码读取更流畅.

我已经看到它们被用于从图像处理库到正则表达式库,3D库的所有东西.其他示例包括树结构,列表或其他数据结构的构造.需要构造复杂对象(参数加载)的所有内容都可以使用Fluent接口使其更具可读性.例如,将前面的示例与CreateWindow函数调用进行比较:

 ::CreateWindow(
      "Window class", 
      "Window title", 
      dwStyle, X, Y, 
      nWidth, nHeight, 
      hWndPant, hMenu, 
      hInstance, NULL
 );



4> 小智..:

这是一个常规的每日界面:

public interface NotFluent
{
  void DoA();
  void DoB();
  void DoC();
}

这里有一个流畅的界面:

public interface Fluent
{
  Fluent DoA();
  Fluent DoB();
  Fluent DoC();
}

最明显的区别是,当我们返回一个void时,我们返回一个接口类型的实例.可以理解的是,返回的接口是CURRENT INSTANCE,而不是相同类型的新实例.当然,这是不可执行的,并且在不可变对象(如字符串)的情况下,它是一个不同的实例,但可以被认为是仅更新的同一实例.

以下是它们的使用示例:

NotFluent foo = new NotFluentImpl();
foo.DoA();
foo.DoB();
foo.DoC();

Fluent bar = new FluentImpl();
bar.DoA().DoB().DoC();

请注意,链接不同的调用时,更容易使用流畅的界面.IRL,查看Linq扩展方法以及每个调用如何设计为流入另一个.即使它是有效的结果,这些方法都不会返回void.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有