xml不利于调试_流利的接口不利于维护

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不利于调试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java输入月份求天数_java输入年份,月份,输出当月天数

package 第二次作业; public class 第二题 { //java文件名 public static void main(String[] args) { //相当于创建主函数 String 年份 = javax.swing.JOptionPane.showInputDialog("输入一个年份:"); //求出输…

java 换行 运算符格式_Java代码样式运算符换行格式

java 换行 运算符格式上周,我发现了什么决定了我在较长时间里一直在努力解决的问题的决定:是否放置&& , ||之类的运算符 或在同一行或下一行。 在构造布尔表达式或隐含字符串时,我们可能需要中断长行。 根据《 Google Ja…

pipeline java_架构模式:pipeline

知名的 Pipeline 模式unix 的 pipelinecat helloworld.txt | grep "hello world" | rev | > output.txt读取文本内容,并过滤 “hello world”,然后反转字符,将最终结果输出到 output.txtWeb 框架中间件Laravel 中的管道Laravel …

MacOS 系统使用命令安装软件包

文章目录 使用 Homebrew 安装软件包先安装 Homebrew使用命令 brew 安装软件包使用命令 installer 安装 pkg 软件包使用命令安装 dmg 格式的软件包包含普通的应用程序文件的 dmg 文件如何使用命令完成安装呢?包含 pkg 安装程序的 dmg 文件又该如何通过命令完成安装呢?Linux 操…

身份证验证 校验码_用户身份验证最佳做法清单

身份证验证 校验码用户身份验证是每个Web应用程序共享的功能。 我们已经实施了很多次了,所以早就应该完善它了。 然而,错误无时无刻不在。 造成这种情况的部分原因是,可能出错的事情列表很长。 您可能会错误地存储密码,可能会具有…

mysql查询不确定的信息_mysql 07.18

1.索引搜索引导,索引是一个特殊的数据结构,期存储的是数据的关键信息与详细详细的位置对应关系。目的:加速查询。索引的影响:不是说拥有索引就能加速,得看你的查询语句有没有正确使用索引,索引也需要占用额…

MacOS 常用命令汇总

文章目录设置环境变量列出所有可以更新的软件包直接更新所有可以更新的软件包打包压缩文件忽略 Mac OS 文件系统中的扩展属性忽略 Mac OS 专有的隐藏文件创建 DMG 格式的文件修改 DMG 文件的大小修改 DMG 格式中的加密口令挂载 DMG 格式的文件推出 DMG 文件将 ISO 格式的文件转…

java多功能钟_Java 11将包含更多功能

java多功能钟Java 11即将发布的功能是什么?它与Java 9和10有何不同? Java 10可能是新手,但现在该谈论Java 11了。Oracle迈向更快的发布周期意味着更多的特性和功能以比以往更快的速度出现。 尽管距离Java 11发行还有六个月的时间&#xff0…

MacOS 好用的插件和图形界面程序

文章目录文件预览插件OS X 图形界面程序文件预览插件 有些插件可以让 Mac 上的文件预览更有效,比如语法高亮、markdown 渲染、json 预览等。 $ brew cask install qlcolorcode $ brew cask install qlstephen $ brew cask install qlmarkdown $ brew cask install…

java 线程安全性_我如何测试Java类的线程安全性

java 线程安全性我在最近的一次网络研讨会中谈到了这个问题,现在是时候以书面形式进行解释了。 线程安全是Java等语言/平台中类的重要品质,在Java中我们经常在线程之间共享对象。 缺乏线程安全性导致的问题很难调试,因为它们是零星的&#xf…

java asin_Java asin()方法

Java asin()方法asin() 方法用于返回指定double类型参数的反正弦值。语法doubleasin(doubled)参数 d -- 任何原生数据类型。返回值返回指定double类型参数的反正弦值。实例public class Test{public static void main(String args[]){double degrees 45.0;double radians Mat…

MacOS 的软件包管理工具 HomeBrew 详解

文章目录一、软件介绍二、安装 Homebrew使用 Ruby 或者 Shell 脚本安装手动 clone 安装三、卸载 Homebrew四、Homebrew 安装目录五、安装包所在位置六、程序安装目录七、软件版本切换八、清除旧版本文件九、brew 命令汇总安装、升级和删除软件包查看和检验软件包参考示例服务相…

java中的深度克隆浅克隆_了解Java中的可克隆接口

java中的深度克隆浅克隆什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程。 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容。 这就是为什么在克隆后更改原始对象的内容时,所做的更改不会反映在克隆…

python env_#!/usr/bin/env python 有什么用?

我们经常会在别人的脚本或者项目的入口文件里看到第一行是下面这样#!/usr/bin/python或者这样#!/usr/bin/env python那么他们有什么用呢?要理解它,得把这一行语句拆成两部分。第一部分是 #!第二部分是 /usr/bin/python 或者 /usr/bin/env python关于 #! …

MacBook(macOS) 如何安装 Homebrew Cask(作废)

文章目录重要通知(不要再去安装 Homebrew Cask 了)Homebrew Cask 简介相关文件和目录Homebrew Cask 安装使用命令下载安装直接从官网下载安装包利用国内源手动 clone下载(推荐)Homebrew Cask 换源重要通知(不要再去安装…

java.io.file()_JAVA基础知识之IO-File类

File类介绍File是java.io包下面的一个类,代表与平台无关的文件或者目录。JAVA中,无论文件还是目录,都可以看作File类的一个对象。File类能对文件或目录新建,删除,获取属性等操作,但是不能直接操作文件内容(…

netflix 模式创新_创新设计模式:单例模式

netflix 模式创新单例设计模式是一种软件设计模式,用于将类的实例化限制为一个对象。 与其他创建设计模式(例如抽象工厂 , 工厂和构建器模式)相比,单例将创建一个对象,但也将负责,因此该对象只…

美式英语 [t] 的发音

爆破音 true [t],发真实的 t。 单词的开始处重读音节的开始处,且前面没有跟着清辅音 [s] held 住不发声 叫法很多,声门塞音、吞音、喉塞(s)音、stop [t],held [t],不爆破的 [t]。 发音的口…

设计模式 原型模式_创新设计模式:原型模式

设计模式 原型模式原型模式用于创建对象的副本。 这种模式非常有用,特别是当从头开始创建对象的成本很高时。 与builder , factory和abstract factory模式相比,它不会从头开始创建对象,而是会克隆/重新创建它。 与单例模式相比&a…

java file 对象_Java里File对象的问题。

Java里File对象的问题。关注:282 答案:2 mip版解决时间 2021-02-02 07:14提问者鉨瞞着所囿亾,爱着誰2021-02-01 08:59import java.io.*;在此基础上怎么修改呢? 谢谢啦最佳答案二级知识专家山河已春2021-02-01 10:06import java.io.*;class JavaFileLis…