`
yangdong
  • 浏览: 65175 次
  • 性别: 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?面向对象的概念可不是这样子的。

相关推荐

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

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

    前端面试题js,html,css,vue

    vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。 具体步骤: 第一步: 需要 observe 的数据...

    DB:LectureViewer 的数据库示例

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

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

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

    JCTP(CTP JAVA接口) 0.3.2

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

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

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

    VUE面试题Vue2(基础代码,响应式,指令)

    watch: 更多的是观察的作用,每当监听的数据变化时都会执行回调进行后续操作,它只能设置getter。watch默认只监听一层。如果要深度监听,让deep属性为true。 2)、作用: computed: 是为了显示而用,降低了模板上...

    vue中computed 和 watch的异同!

    而通常更好的办法是使用computed属性,而不是命令是的watch回调。  二、computed: 在vue的 模板内({{}})是可以写一些简单的js表达式的 ,很便利。但是如果在页面中使用大量或是复杂的表达式去处理数据,对页面...

    lupengge#note#监听Dom和属性1

    // 创建一个观察器实例并传入回调函数// 以上述配置开始观察目标节点// 之后,可停止观察二、监听js代码中对象属性的变化1.使用getter和setter监

    开源bbs源码java-luaj:玩

    增加getter与setter快速调用,用于简化控件属性设置, 修复Java方法返回null没有返回值的bug, 更新布局表算法,支持布局间距, 优化Java方法缓存机制,效率提高一倍,布局表效率提高8倍, 2.0.3 修复IDE布局bug ...

    2023年高频前端vue面试题

    3.watcher 观察者 作为observe和compile的桥梁 能够订阅并通过订阅者收到每个属性变动的通知,执行指令绑定的回调函数 从而更新试图 4.dep 订阅者 管理数据的订阅者 当数据发生变化之后 通知观察者来更新视图 2....

    详解Vue双向数据绑定原理解析

    采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter和getter,数据变动时发布消息给订阅者,触发相应函数的回调。 思路整理 要实现mvvm的双向绑定,需要实现如下几点: ...

    vue2.0双向绑定v-modal.html

    vue,双向绑定,代码实现,打开即用,直接浏览器运行查看效果,实现mvvm的双向绑定,是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在...触发相应的监听回调。

    harmonyos2-node-overload:node.js插件提供了一个Watchable类,该类具有没有属性名称的getter/set

    回调可以使用this对象来正常操作而无需重新调用自己。 值 onGet(ArgInfo) - 属性 返回特定索引处的值 Value onSet(ArgInfo) - 属性,值 返回要保存在特定索引处的值 数组 onForeach(ArgInfo) 返回一个包含此对象所有...

    浅谈Vue数据响应

    Vue 中可以用 $watch 实例方法观察一个字段,当该字段的值发生变化时,会执行指定的回调函数(即观察者),实际上和 watch 选项作用相同。如下: vm.$watch('box', () => { console.log('box变了') }) vm.box = '...

    JavaScript将您JavaScript库转换为远程服务。-JavaScript开发

    RemoteLib将您JavaScript库转换为远程服务:dizzy:。 RemoteLib是一个可以与其他对等方远程共享的库,而无需担心API接口或RPC集成。...这包括使用回调,Promises,类继承,getter和setter支持等来调用函数。 见我们

    深入理解Android组件间通信机制对面向对象特性的影响详解

    原因是组件都是给系统框架调用的,开发者只能实现其规定的回调接口,组件的创建与销毁都是由系统框架控制的,开发者不能强行干预,更没有办法获取组件的对象。比如Activity,Service,BroadcastReceiver,你没有办法...

    svelte-asyncable:Svelte 3的异步存储,它存储值作为Promise

    SvelteJS的超小,声明式,乐观,异步存储。 特征 将价值存储为承诺。 按需延迟初始化。 透明和声明性的方式来描述副作用。... 此回调使您可以建立存储的初始值。 import { asyncable } from 'svelte-asynca

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

    vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。 具体实现过程的代码如下: 1、定义构造函数...

Global site tag (gtag.js) - Google Analytics