不,这样的DTO!

 

本文翻译自 Oh No! DTO! by Robert C. Martin,这篇文章很短,强调的内容简单得不能再简单,也许大家早就意识到,但是,我依然可以在很多产品的代码里面找到文中所说的“教条”的影子,我说不清为什么,在这里有激烈的讨论,你们说呢?

 

本周我在教授XP(极限编程,译注)的课程,我们要写给当前的应用写FitNesse(一种测试工具,译注)的基础测试代码。其中一位程序员使用了RowFixture(一种测试结果比较的工具,译注),这种工具需要使用DTO(数据传输对象)并且要求其中的变量都为公有的。这时候这位程序员提出了质疑:“DTO应该使用私有的变量和一套相应的getter、setter方法!”,“为什么呢?”我问。

 

到底是为什么?面向对象的信仰如此根深蒂固地影响我们,以至于我们都无法识别出来,这里根本就只是一个数据结构吗?为什么我们要用一堆毫无用处的getter、setter方法,去遵循那些没有人可以解释的通的教条,来膨胀我们的代码呢?

 

在我的观点中,面向对象程序包含两种实体:对象和数据结构。对象有私有属性和公有方法,数据结构只有公有属性并且没有方法(或者只有一些毫无意义的数据访问方法)。有很好的理由去保持变量的私有性,我们想知道是什么方法在操纵它们,我们可以保护对象的数据,我们不想让其它人依赖对象内部的细节,即DIP(依赖倒转原则,Dependency Inversion Principle,即要依赖于抽象,不依赖于具体,译注)。但另一方面,对一个单纯的数据结构使用getter和setter并没有什么好处,一个数据结构只是一种数据简单的容器,没别的了!

 

---------------------------------------------------------------------------------------------------------------------------------

 

2012-2-22,以下补充内容译自 The C++ Style Sweet Spot by Bjarne Stroustrup:

 

 

我尤其不喜欢一个类里面有一大堆getter、setter方法,这通常意味着这个类一开始就不该是一个类,这个东西只是个数据结构。既然它是数据结构,就让它成为数据结构好了。

 

文章系本人原创,转载请注明出处和作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值