xml不利于调试

流畅的界面 (最初由Martin Fowler 创造)是一种与OOP中的对象进行通信的非常便捷的方式。 它使他们的外墙更易于使用和理解。 但是,它破坏了它们的内部设计,使它们更难以维护。 Marco Pivetta在他的博客文章Fluent Interfaces is Evil中说了几句话; 现在我加几分钱。

唐尼·布拉斯科(1997)

让我们看一下我自己的库jcabi-http ,它是几年前创建的,当时我认为流畅的接口是一件好事。 这是您使用库发出HTTP请求并验证其输出的方式:

String html = new JdkRequest("https://www.google.com").method("GET").fetch().as(RestResponse.class).assertStatus(200).body();

这种便捷的方法链接使代码简短明了,对吧? 是的,表面上确实如此。 但是,库类的内部设计(包括您看到的JdkRequest远远不够优雅。 最大的问题是它们很大,而且


无法扩展它们而不扩大它们。

例如,现在JdkRequest具有方法method()fetch()和其他一些方法。 需要新功能时会发生什么? 唯一的添加方法是通过添加新方法来扩大类的范围,这是我们危害其可维护性的方式。 例如, 在这里 ,我们添加了multipartBody() , 在这里我们添加了timeout() 。

在jcabi-http中收到新功能请求时,我总是感到害怕。 我知道这很可能意味着向RequestResponse和其他已经膨胀的接口和类添加新方法。

我实际上试图在库中做一些事情来解决这个问题,但这并不容易。 查看此.as(RestResponse.class)方法调用。 它所做的是用RestResponse装饰一个Response ,以使其方法更丰富。 我只是不想让Response包含50多种方法,就像许多其他库一样。 这是它的作用(这是伪代码):

class Response {RestResponse as() {return new RestResponse(this);}// Seven methods
}
class RestResponse implements Response {private final Response origin;// Original seven methods from Response// Additional 14 methods
}

如您所见,我没有将所有可能的方法添加到Response ,而是将它们放置在补充修饰符RestResponseJsonResponseXmlResponse 等中 。 它有帮助,但是要使用Response类型的中心对象编写这些装饰器,我们必须使用“ ugly”方法as() ,该方法as()很大程度上依赖于Reflection和类型转换 。

流利的接口意味着大型类或某些丑陋的解决方法。

换句话说,流畅的接口意味着大型类或某些丑陋的解决方法。 当我写有关Streams API和接口Stream的文章时 ,我曾提到过这个问题。 有43种方法!

这是流畅接口的最大问题-它们迫使对象很大。

流利的接口非常适合其用户,因为所有方法都在一个地方,并且类的数量非常少。 它们很容易使用,尤其是在大多数IDE中使用代码自动完成功能时。 它们也使客户端代码更具可读性,因为“流利的”结构看起来类似于纯英语(aka DSL )。

没错! 但是,它们对对象设计造成的损害是价格过高。

有什么选择?

我建议您改用装饰器和智能对象 。 如果现在可以做的话,这就是我设计jcabi-http的方法:

String html = new BodyOfResponse(new ResponseAssertStatus(new RequestWithMethod(new JdkRequest("https://www.google.com"),"GET"),200)
).toString();

这与上面的第一个代码段中的代码相同,但是它更加面向对象。 当然,此代码的明显问题是IDE无法自动完成几乎所有操作。 同样,我们将不得不记住许多类的名称。 对于那些习惯了流利界面的人来说,该结构看起来很难阅读。 此外,它与DSL的想法相距甚远。

流畅的界面对用户有利,但对开发人员不利。 小对象对开发人员有好处,但难以使用。

但是,这里是好处列表。 首先,每个对象都很小,非常有凝聚力,并且它们都是松散耦合的,这在OOP中是显而易见的优点。 其次,向库中添加新功能就像创建新类一样容易。 无需接触现有课程。 第三,由于类很小,因此简化了单元测试。 第四,所有类都是不可变的,这在OOP中也很明显 。

因此,有用性和可维护性之间似乎存在冲突。 流利的界面对用户有利,但对库开发人员则不利。 小对象对开发人员有好处,但难以理解和使用。

似乎是这样,但前提是您已习惯大型类和过程编程。 对我来说,大量的小班学习似乎是一种优势 ,而不是缺点。 即使我不知道确切的哪个类最适合我,内部清晰,简单且易读的库也更容易使用。 即使没有自动完成代码,我也可以自己解决,因为代码很干净。

另外,我经常发现自己对在代码库内部或通过对库的拉取请求扩展现有功能感兴趣。 如果我知道所引入的更改是孤立的并且易于测试,那么我对此更感兴趣 。

因此,我再也没有流畅的界面,只有对象和装饰器。

翻译自: https://www.javacodegeeks.com/2018/03/fluent-interfaces-are-bad-for-maintainability.html

xml不利于调试

xml不利于调试_流利的接口不利于维护相关推荐

  1. 流利的接口不利于维护

    流利的接口 (最初由Martin Fowler 创造)是一种非常方便的与OOP中的对象进行通信的方式. 它使他们的外墙更易于使用和理解. 但是,它破坏了它们的内部设计,使它们更难以维护. Marco ...

  2. 小程序真机调试访问不了接口_小程序入门

    之前写了一个去水印的小程序,详情可查看「短视频去水印工具小程序版-去水印Pro版」一文,我个人对小程序也是从完全陌生到入门阶段,这篇文章就把入门的过程和遇到的问题记录一下. 一.小程序注册 想要开发小 ...

  3. python 网页调试_使用Django 2.0构建Python Restful Web服务:七)在浏览器中浏览和调试restful接口...

    一.前言 在之前的文章中,我们创建好的web接口都通过Postman这个软件调用各种HTTP请求方法来进行调试和查看,这样返回的结果很容易被编程语言和应用程序所接收和识别,但是却并不便于我们直观的查看 ...

  4. 微信开发者工具-真机调试,可查看接口信息

    之前测试小程序查看接口信息,是需要打开调试模式,手机界面小,看着多多少少有点不方便. 现在发现了可以直接找前端要文件包,用[微信开发者工具]打开该文件包,然后选择[真机调试]-[二维码真机调试],生产 ...

  5. 百度AI学习第一天_调用API接口通用步骤

    百度AI学习第一天_调用API接口通用步骤 #第一步获取access_token # client_id 为官网获取的AK, client_secret 为官网获取的SK host = 'https: ...

  6. 抖音小店商品接口_抖音接口

    抖音小店商品接口_抖音接口 {"msg": "","code": 200,"data": {"toast&qu ...

  7. gdb_print调试_调试打印完整字符串内容

    gdb_print调试_调试打印完整字符串内容 问题描述 解决方案 测试代码 问题描述 GDB下用p看一个字符串的时候默认显示是截断的,如下所示 解决方案 在打印字符串前,输入set print el ...

  8. pom.xml中pom全称_摆脱pom XML…几乎

    pom.xml中pom全称 介绍 POM文件是XML格式的文件,声明性地描述了要使用Maven构建的Java项目的构建结构. 维护大型Java项目的POM XML文件通常很麻烦. XML是冗长的,PO ...

  9. mysql遍历 xml文件路径_解决Mapper接口和mapper.xml的文件位置问题

    今天遇到一个问题是mybatis中接口和对应的mapper文件位置不同,而引起的操作也会不同,在网上找了好久最终找到了方法,这里就简单的解析一下: 我们知道在典型的maven工程中,目录结构有:src ...

最新文章

  1. javap查看class文件
  2. XCTF-高手进阶区:i-got-id-200
  3. SAP Spartacus里如何查找所有可以focus的HTML元素
  4. uva 11105——Semi-prime H-numbers
  5. 基于python渗透测试_Python中基于属性的测试简介
  6. 同样学软件测试,为什么有些人一面试就拿一堆大厂offer?
  7. 设计模式学习-每日一记(16.模板方法模式)
  8. 如何听节拍器_学琴必备的节拍器,你用对了么?
  9. matlab里的dsolve,matlab_dsolve
  10. 如何激活优动漫PAINT,获取优动漫PAINT序列号
  11. 致远OA表单自定义函数(明细表去重拼接)
  12. mysql系统设计论文_毕业论文管理系统的设计与实现(MyEclipse,MySQL)
  13. quartz定时器时间设置规则
  14. Fluter 应用调试
  15. c语言空循环的作用是什么意思,C语言空循环和无穷循环有的区别
  16. 灰zhu姑xiao娘mei
  17. 第一章 空间解析几何与向量代数(3)
  18. tcpdf 打印PDF字体乱码,通过视图解决方法
  19. 计算机 办公软件应用包含哪些,计算机办公软件应用参考文献外国 计算机办公软件应用专著类参考文献有哪些...
  20. python - - 函数 - - 内置函数和匿名函数

热门文章

  1. [SCOI2003]字符串折叠
  2. [ZJOI2010] 基站选址(线段树优化dp)
  3. CodeForces 1491G Switch and Flip(结论)
  4. CF600F:Edge coloring of bipartite graph(二分图、构造)
  5. YbtOJ#943-平方约数【莫比乌斯反演,平衡规划】
  6. P3306-[SDOI2013]随机数生成器【BSGS】
  7. P3041-[USACO12JAN]Video Game G【AC自动机,dp】
  8. jzoj3920-噪音【贪心,dp】
  9. jzoj3302-[集训队互测2013]供电网络【上下界网络流,费用流,动态加边】
  10. 图书管理员【2017年普及组第二题】