将面向对象的后端与外部系统集成的传统方式是通过数据传输对象 ,这些对象在外出之前先序列化为JSON,然后在返回时反序列化。 这种方法很流行,而且是错误的。 序列化部分应该由打印机代替,我在前面已经解释过。 这是我对反序列化的看法,应该通过猜测对象来完成。

米歇尔·贡德里(Michel Gondry)的《科学》(La science desrêves)(2006年)

假设有一个后端入口点,应该在库中注册一本新书,并以JSON格式到达:

{"title": "Object Thinking","isbn: "0735619654","author: "David West"
}

此外,还有一个类Library的对象,它希望将Book类型的对象赋予其方法register()

class Library {public void register(Book book) {// Create a new record in the database}
}

还可以说,类型Book有一个简单的方法isbn()

interface Book {String isbn();
}

现在,这里是HTTP入口点(我正在使用Takes和Cactoos ),该入口点接受POST multipart/form-data请求并将书注册到库中:

public class TkUpload implements Take {private final Library library;@Overridepublic Response act(Request req) {String body = new RqPrint(new RqMtSmart(new RqMtBase(req)).single("book")).printBody();JsonObject json = Json.createReader(new InputStreamOf(body)).readObject();Book book = new BookDTO();book.setIsbn(json.getString("isbn"));library.register(book);}
}

这有什么问题? 好吧,几件事。

首先,它不可重用。 如果在其他地方需要类似的东西,则必须再次编写此HTTP处理和JSON解析。

其次,错误处理和验证也不可重复使用。 如果将其添加到上述方法中,则必须将其复制到各处。 当然,DTO可以封装它,但这不是DTO通常的用途。

第三,以上代码具有相当的程序性,并且具有大量的时间耦合 。

更好的设计是将此解析隐藏在新类JsonBook

class JsonBook implements Book {private final String json;JsonBook(String body) {this.json = body;}@Overridepublic String isbn() {return Json.createReader(new InputStreamOf(body)).readObject().getString("isbn");}
}

然后,RESTful入口点将如下所示:

public class TkUpload implements Take {private final Library library;@Overridepublic Response act(Request req) {library.register(new JsonBook(new RqPrint(new RqMtSmart(new RqMtBase(req)).single("book")).printBody()));}
}

那不是更优雅吗?

下面是一些例子,从我的项目: RqUser从zerocracy /农场和RqUser从yegor256 / jare 。

从上面的示例可以看到,有时我们不能使用implements因为Java中的某些原语不是接口而是final类: String是一个“完美”的示例。 这就是为什么我必须这样做:

class RqUser implements Scalar<String> {@Overridepublic String value() {// Parsing happens here and returns String}
}

但是除此之外,这些示例完美地说明了上面建议的“解析对象”的原理。

翻译自: https://www.javacodegeeks.com/2018/03/dont-parse-use-parsing-objects.html

不解析,使用解析对象相关推荐

  1. JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念...

    JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念 <html><body><script type="tex ...

  2. 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )

    文章目录 一.创建 Capstone 反汇编解析器实例对象 二.设置 Cs 汇编解析器显示细节 一.创建 Capstone 反汇编解析器实例对象 使用 Capstone 反汇编框架 , 首先创建 Ca ...

  3. Python3将xml文件解析为Python对象

    一.说明 从最开始写javascript开始,我就很烦感使用getElementById()等函数来获取节点的方法,获取了一个节点要访问其子孙节点要么child半天要么就再来一个getElementB ...

  4. 前端解析返回的对象时json显示$ref问题的解决

    在mapper中写的语句,结果集中association,采用的一个对象,整个list列表中每个元素有一个对象元素,如果第二个元素中有一个与第一个元素中对象同名的,就会去引用上一个元素的地址,在jso ...

  5. JavaScript重难点解析5(对象高级、浏览器内核与事件循环模型(js异步机制))

    JavaScript重难点解析5(对象高级.浏览器内核与事件循环模型(js异步机制) 对象高级 对象创建模式 Object构造函数模式 对象字面量模式 工厂模式 自定义构造函数模式 构造函数+原型的组 ...

  6. JavaScript学习(六十一)—json字符串的解析和JS 对象的序列化

    JavaScript学习(六十一)-json字符串的解析和JS 对象的序列化 一.json字符串的解析:parse方法 将json字符串转换为js对象,我们把这个过程称为json字符串的解析 格式:J ...

  7. XML解析为Document对象

    XML解析为Document对象 我们在上一篇Spring源码分析中有提到,Spring是将xml文件的InputStream转换为DOM树,然后在将DOM树解析转换为BeanDefinition从而 ...

  8. Java(24):GSON - JsonParser将 JSON 字符串解析为 Java 对象的树结构

    GSONJsonParser类可以将 JSON 字符串或流解析为 Java 对象的树结构. 解析过程中会用到:JsonParse,JsonElement,还有 JsonObject 和 JsonArr ...

  9. C#之XML解析为类对象

    XML解析为类对象 1.XML示例: <Request><MessageHeader><Sender></Sender><Receiver> ...

  10. Unity中的UGUI源码解析之图形对象(Graphic)(2)-ICanvasElement

    Unity中的UGUI源码解析之图形对象(Graphic)(2)-ICanvasElement 在上一篇文章中, 我们对整个Graphic部分做了概述, 这篇文章我们介绍ICanvasElement和 ...

最新文章

  1. dede 怎样调用其它栏目的文章或者缩略图列表且有分页效果?
  2. 索爱麦克风免驱动的语音录入测试
  3. CAS 之 集成RESTful API
  4. 为什么说数据中心是5G最大的受益者?
  5. pycharm 如何使用git链接到github实现代码提交
  6. 网页设计上机考试原题_Dreamweaver上机考试题目dreamweaver试题库网页制作试题.doc...
  7. 人工智能语言python实验报告_【报名】人工智能语言Python启蒙课程(五六年级)...
  8. CSS3 Version
  9. POJ 1003 Hangover
  10. C++ 的 RTTI
  11. leetcode第一刷_Word Search
  12. 用LinkedList方法模拟栈的数据结构
  13. eclipse上新建Maven项目报错及解决
  14. 《我是一只IT小小鸟》会员书评
  15. 硬件基础之TTL、CMOS区分比较
  16. 使用openssl 来生成rsa pkcs1 2048格式的公私钥
  17. XSS扫描器编写思路
  18. 远程桌面工具TeamViewer模块之顶部菜单
  19. iphone转android教程,王者荣耀ios转安卓教程攻略
  20. 一个域名显示多个服务器ip,一个域名指向多个ip的方法

热门文章

  1. 洛谷-P3396 哈希冲突 分块
  2. Scala与Java差异(一)之基础语法
  3. SpringBoot2.1.9 分布式锁ShedLock
  4. JSP的<c:foreach/>标签只输出一次标签体内容的坑
  5. java BigDecimal八种舍入模式
  6. 回忆四班的那些事儿~
  7. 《走遍中国》珍藏版(十一)
  8. 请求和响应向更多内容
  9. spark submit参数及调优
  10. 怎么把页面按比例缩小_meta viewport 是做什么用的,怎么写?