本文翻译自 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 方法,这通常意味着这个类一开始就不该是一个类,这个东西只是个数据结构。既然它是数据结构,就让它成为数据结构好了。
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》