将面向对象的后端与外部系统集成的传统方式是通过数据传输对象 ,这些对象在外出之前先序列化为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. IOS个人开发者账号注册
  2. System.Transactions事务超时设置
  3. superset可视化-world map
  4. dockerclient 查看端口占用_docker 端口被占用问题解决
  5. Vue多字段下的非空判断(new Promise)
  6. 简述select语句的完整语法_SQL里的各种语句的完整语法
  7. 【数据库实验】《小型MIS的开发》— JavaFx 开发 民航票务管理系统
  8. 背水一战 Windows 10 (60) - 控件(媒体类): Pointer 涂鸦板, InkCanvas 涂鸦板
  9. C语言必背100代码,C语言必会100代码大全
  10. 【项目管理一点通】(13) 如何写周报和日报
  11. 维纳滤波 c语言,C版:自适应维纳滤波方法的语音增强(C2-1)
  12. 非平稳序列的随机性分析(SAS)
  13. IDEA格式化代码的快捷键是什么
  14. 从Oracle迁移到MySQL的各种坑及自救方案
  15. 计算机科学与技术[计算机及应用](本科)自考
  16. Use HAProxy to load balance 300k concurrent tcp socket connections: Port Exhaustion, Keep-alive and
  17. Google 常用镜像收集
  18. 正弦交流电信号机数学描述
  19. 新code为aadb010476_【AACA建筑师评估】职业评估说明
  20. Windows XP Professional With SP3 VOL[MSDN原版]+正版密钥

热门文章

  1. 又发生频繁FGC,这次是谁的锅
  2. JavaFX UI控件教程(二十七)之File Chooser
  3. JavaFX UI控件教程(十二)之List View
  4. 关于Java你不知道的10件事
  5. Linux入门(一)之权限指令系统管理
  6. ssh(Spring+Spring mvc+hibernate)——EmpController
  7. String中的compareTo()方法
  8. java实现验证码3秒刷新一次
  9. RPC远程过程调用之 RMI实现
  10. Android如何实现NoActionBar以及Theme.NoTitleBar.Fullscreen效果