`
yangdong
  • 浏览: 66435 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

getters 与回调

阅读更多
《Growing Object-Oriented Software, Guided by Tests》中说,过多的 getters 意味着你暴露了过多的内部细节。这种细节包括内部的数据结构、内部的对象图。作者的团队主张“No Getters”。当然这是很极端的主张。这种主张有两个比较出名,而且充满争议的名字“Tell, Don't Ask”、“Law of Demeter”。尽量坚持 Law of Demeter 的好处是能让你提高信息隐藏的程度。我个人认为 OO 之所以受欢迎就是因为提供了一个自然地实现信息隐藏的手段。

如果你注意观察这两个链接所展示的争论你会发现极少有人否定 Law of Demeter 的意义,但是的确有很多人认为如果过分坚持这个原则会导致类臃肿。不是有这么一句名言吗,“Laws were meant to be broken”。总有时候会因为成本等原因我们会选择直接暴露内部数据结构,提供 getters。而且总有一些类的职责太简单,就是一些数据载体,比如 Point、Size 这种类。就算复杂一点,Scala 里面的 Tuple2、Tuple3,AWT 里面的 Rectangle,它们也都会不可避免地直接暴露 getters。

除去这些自身职责就是承载数据的类,其余的类我们还是可以通过方法和函数尽量去屏蔽内部数据结构和对象图。当然这样做的副作用就是你的类会变大。我们需要在类变大与内部信息隐藏之间取得一个平衡,并非完全是要么黑要么白。如果你看过比较大的系统因为信息隐藏做得糟糕而使得整个系统变成了意大利面条的话,那么你一定更倾向信息隐藏。
分享到:
评论
2 楼 yangdong 2010-03-28  
No Getters 当然很极端,并不可取。但是不失为一种很好的启发式方法。如果 getters 过多,跟 setters 过多一样,都表明类有向纯数据容器的方向退化的趋势(前提是类的职责并不仅仅是容器)。这应当被看做是一种 code smell。事实上,Law of Demeter 在《Pragmatic Programmer, The From Journeyman to Master》也有提到。

退一步说,同样是简单地 return 成员变量,方法命名不一样也会带来完全不一样的抽象。减少在接口中直接暴露数据结构或暗示着这是内部数据结构的方法肯定会带来好处。
1 楼 yiding_he 2010-03-13  
No Getters?面向对象的概念可不是这样子的。

相关推荐

    基于鸿洋okhttputils 封装数据 bean和callback 回调

    例如,如果服务器返回一个JSON对象,我们可以创建一个与之匹配的Java类,包含相应的字段和getter/setter方法。这样做不仅可以提高代码的可读性,还能方便地进行数据转换。当使用OkHttpUtils发送请求时,可以将这个...

    Go-go-getter-一个Go库用于从各种来源使用URL下载文件或目录

    6. **用户自定义回调函数**: 开发者可以提供自定义的回调函数,在下载过程中执行特定操作,如进度更新、日志记录等。 7. **配置选项**: 提供了丰富的配置选项,允许开发者定制下载行为,如超时设置、代理设置、认证...

    浅析JavaScript回调函数应用

    取值器(getter)方法返回的是需要获取的数据,通常不适合实现链式调用,除非使用回调函数作为返回值,这样可以将回调函数的执行结果传递给下一个函数。 JavaScript中的函数是对象。它们是使用Function()构造函数创建...

    iOS 监听回调机制KVO实例

    在iOS开发中,KVO(Key-Value Observing,键值观察)是一个重要的监听回调机制,它允许对象观察并响应另一个对象属性值的变化。通过使用KVO,开发者可以在某个属性值发生变化时得到通知,并可以执行相应的逻辑处理。...

    jQuery 3.0 的 setter和getter 模式详解

    - `fn`:一个函数,用于在元素上进行操作,可以是一个回调函数。 - `key`:要获取或设置的属性名称。 - `value`:要设置的属性值,如果没有传递,则表示调用的是getter。 - `chainable`:一个布尔值,表示是否可以...

    JavaScript-Objects-Extensions-for-Meteor:Meteor 的有用 JavaScript 对象扩展

    在 Setter 和 Getter 之前设置回调 在 Setter 上设置回调 在 Getter 上设置回调 someArray.inArray(needle, searchInKey, searchByKey) - 在 inArray 函数中扩展对象原型 someArray.diff(comparableArray) - 比

    DB:LectureViewer 的数据库示例

    对于 getter 方法,回调应采用 function(error,returned_data) 形式。 对于 setter 方法,回调应采用函数(错误,受影响的文档)形式。 用户接口 方法 返回 addBookmarkById(user_id, newBookmark, callback) ...

    ngx-on-change:完全通用的装饰器,以取代Getter Setter和ngOnChanges

    如果类字段的值更改,则@OnChange装饰器将调用回调,其名称将作为装饰器参数提供。 无需在@Input属性绑定上使用Decorator,但是要跟踪更改的任何类字段都可以使用。 ## Installation首先,您需要安装npm模块: ...

    深入学习Vue nextTick的用法及原理

    Vue.nextTick是Vue.js框架提供的一个非常重要的方法,它允许我们在下一次DOM更新循环结束之后执行某些延迟回调。在实际开发中,我们常常会遇到需要在数据更新后立即操作DOM的情况,但是由于Vue的响应式机制,数据...

    JCTP(CTP JAVA接口) 0.3.2

    修正:Spi回调时报空指针,无法进入回调方法的问题 修正:无法调用带参数的CreateFtdc.....Api函数的问题 修正:只能在调试模式下进行回调的问题 变更:CTP动态链接库置入jar包 变更:将JCTP相关类独立出CTP调用包

    Aixs2相关

    - 这个文件名暗示了它可能是用于处理Bean服务器的回调操作的类。在Java中,"BeanServer"通常与Java Management Extensions (JMX) 相关,JMX允许开发者管理应用程序、系统和服务。回调处理程序可能负责在服务器端...

    Vue 3.0双向绑定原理的实现方法

    vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过new Proxy()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。 Vue 3.0与Vue 2.0的区别仅是数据劫持的方式由Object....

    前端Vue面试题精选,速来!!!完整版pdf.pdf

    * 双向数据绑定的原理:Vue.js 采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。 2. 数据绑定 * ...

    Vue侦测相关api的实现方法

    当创建一个新的`Watcher`时,会解析表达式或函数(`expOrFn`),并设置getter和回调。`Watcher`实例会收集它所依赖的`Dep`(依赖)实例,以便在数据变化时通知`Watcher`。 `Dep`类是数据依赖的容器,每个被观察的...

    WPF依赖项属性示例

    4. **属性更改通知**:当依赖项属性的值发生变化时,系统会自动调用属性更改回调函数,通过`PropertyChangedCallback`进行响应。 5. **线程安全性**:依赖项属性是线程安全的,可以跨线程访问和更新。 ### 二、...

    一步一步实现Vue的响应式(对象观测)

    当属性值改变时,`dep`中的所有回调都会被依次执行,实现了数据变化与回调执行的关联。 总结一下,Vue的响应式原理主要涉及以下几个步骤: 1. 使用`Object.defineProperty`为对象的属性创建getter和setter。 2. 在...

    依赖属性学习代码

    当依赖属性的值发生变化时,可以设置回调函数`PropertyChangedCallback`,这个回调会在属性值改变时执行。在上面的示例中,`PropertyMetadata`允许我们传递回调函数。 4. **元数据(Metadata)** 依赖属性的元...

    DWR教程ppt

    回调函数有两种写法,根据应用场景选择合适的回调处理方式。 **DWR DEMO介绍** 一个DWR演示通常包括以下步骤: 1. **编写服务器端逻辑代码**:涵盖DWR开发的多个方面,如数据处理、业务操作等。 2. **配置文件的...

    vue中watch和computed为什么能监听到数据的改变以及不同之处

    在`initWatch`阶段,Vue会创建`Watcher`实例,当对应的被观察数据发生变化时,`Watcher`的`update`方法会被调用,执行用户定义的回调函数。 4. **`watch`和`computed`的区别**: - **计算方式**:`computed`是被动...

Global site tag (gtag.js) - Google Analytics