写点什么

不同观点:DTO 与领域对象

  • 2011-06-27
  • 本文字数:858 字

    阅读完需:约 3 分钟

自从 NHibernate 与 WCF 出现以来,.NET 开发者们就开始向统一的实体模型概念上不断靠拢。最后的结果就是同一个类可以作为 ORM 实体、WCF DTO 以及 MVC、MVP 与 MVVM 框架的模型。.NET Dependency Injection 的作者 Mark Seemann 认为这不见得是件好事。

问题的关键在于“在边界处,应用并不是面向对象的”。如你所见,大多数序列化技术都要求 public、默认的构造方法以及可写的属性。本质上,在设计 DTO 时,这些要求会迫使你打破封装和数据隐藏的原则。甚至连基本的不变性,如要求字段不为 null/ 不为空都不可能实现,因为 DTO 会忽略掉一切。Mark Seemann 继续证明自己的论断:

  • 服务共享模式与契约,而非类。
  • DTO 并不会破坏封装,以为他们根本就不是对象。

根据这种情况,Mark 提出了 3 种观点:

第 1 种观点是坚持已有的观念。为了消除隔阂,我们必须得开发一个转换层,用于将 DTO 转换为封装良好的领域对象。这正是书中的示例所采取的方式。然而,我越发觉得这种解决方案并不是最佳的。这会导致可维护性的问题(这也是我写书时所遇到的问题:当你写完后,你所知道的要比刚开始动笔时多不少,我并不是说书不好,只是想说它并不完美而已)。 第 2 种观点是不再将数据当作对象,将其看作是它自身所表示的结构化数据。如果我们所用的编程语言有单独的结构化数据概念就太好了。有趣的是,虽然 C#并没有这个概念,但 F#却有多种方式来建模数据结构而不涉及行为。或许这是更好的数据处理方式,我还要多尝试几次才行。

第 3 种观点是使用动态类型。在文章 Cutting Edge: Expando Objects in C# 4.0 中,Dino Esposito 介绍了通过动态方法来使用结构化数据,这可以更快速地自动生成代码并向结构化数据提供轻量级的 API。这种方法更有前途,它并没有提供编译期的反馈,但这只不过是一种安全上的错觉而已。我们需要通过单元测试来快速获取反馈,但我们一直都在使用 TDD,不是么?

如果你对面向对象设计与封装感兴趣,那就一定不能错过名为 Poka-yoke Design: From Smell to Fragrance 的系列文章。

查看英文原文: Differing Opinions: DTOs vs Domain Objects

2011-06-27 07:463561
用户头像

发布了 88 篇内容, 共 270.9 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

从外卖员到程序员,自学3年终于转行成功,三面

Java 程序员 后端

从月薪10K不到,到面进阿里拿40K+offer,java类加载器原理

Java 程序员 后端

从源码的角度搞懂Java代理模式,那些面试中你最容易忽略的细节

Java 程序员 后端

优化Elasticsearch 每个索引应该有多少个分片?

Java 程序员 后端

你真的懂Unicode编码吗?,理解spring原理哪本书好

Java 程序员 后端

使用Docker安装GitLab,小马哥springcloud视频

Java 程序员 后端

使用MySQL的NoSQL的七大理由,java基础入门第二版第三章答案

Java 程序员 后端

从国企到互联网,程序员六年四段经历,一份被很多 HR 刷掉的简历

Java 程序员 后端

你看得起劲的斗鱼直播,已经在 GitHub 开源了自家项目!

Java 程序员 后端

你真的确定Spring AOP的执行顺序吗,爆赞

Java 程序员 后端

高并发场景下JVM调优实践之路

vivo互联网技术

性能优化 后端 JVM Java、

使用Git分布式控制系统,java岗位面试题总结

Java 程序员 后端

从一道 LRU 算法题说到缓存淘汰策略,Java常用面试集合

Java 程序员 后端

大数据集群被窃取数据怎么办?透明加密可以一试

华为云开发者联盟

大数据 安全 数据安全 FusionInsight MRS 透明加密

pygame 核心但简单的知识点,坐标系、Surface 对象、颜色与 Color 对象、Rect 对象

梦想橡皮擦

11月日更

DevOps进击之后,DevSecOps又在说些什么?

飞算JavaAI开发助手

DevOps

你知道面试必问的AOP吗?通过Spring又如何实现呢?

Java 程序员 后端

你说这是冷知识?Netty时间轮调度算法原理分析,再不了解你就out啦(1)

Java 程序员 后端

使用 Mybatis 真心不要偷懒!,kafka大数据架构

Java 程序员 后端

作为java程序员,在金三银四季你遇到过哪些质量很高的java面试?

Java 程序员 后端

从腾讯T3-3大佬手上获得的Java架构进阶PDF文档,图文并茂,真香

Java 程序员 后端

你不知道的Redis八-Redis底层数据结构解析,意外的惊喜

Java 程序员 后端

云小课 | 使用ROMA API,API管理从此不用愁!

华为云开发者联盟

API 华为云 ROMA API全生命周期管理 ROMA API

传授一套月薪20k程序员的高薪秘籍,java语言程序设计第十版答案百度云

Java 程序员 后端

你不知道的redis九-大厂面试必备redis面试题

Java 程序员 后端

你可以 CRUD,但你不是 CRUD 程序员!,java制作网站教程

Java 程序员 后端

代码简洁之道--笔记,netty架构原理图

Java 程序员 后端

以前不知道字节面试难在哪,现在体验到了,被虐的很惨

Java 程序员 后端

你可能该来学习Hystrix RPC保护的原理,RPC保护之熔断器模式了

Java 程序员 后端

从月薪 1000 到 2W+,文科生如何逆袭成为大厂程序员

Java 程序员 后端

你知道怎么在生产环境下部署tomcat吗?,五年java开发经验面试

Java 程序员 后端

不同观点:DTO与领域对象_SOA_Jonathan Allen_InfoQ精选文章