对象健身操九式

优秀设计背后的七条核心概念

内聚性,松耦合,零重复,封装,可测试性,可读性,单一职责。

采用这些规则的关键在于:只要使用Java语言,就应该使用面向对象的思考。

规则1:方法只使用一级缩进

动机:庞大的方法往往缺少内聚性,一个常见的原则是将方法控制着5行以内(不包括入参检查)。你可以尝试让每个方法只做一件事情——每个方法只保护一个控制结构或一个代码块。

方法:利用IDE的抽取方法的功能,不断的抽取方法中的行为,直到一个方法只有一级缩进位置。

“运用这些规则的技能是一种艺术,它能将程序员提升到一个新的高度。”

规则2:拒绝else关键字

动机:复杂的条件判决难于理解,而且易产生重复代码。

方法:对于简单判断可以使用卫语句和提前返回,对于复杂的条件判断则可以使用多态。另外也可以使用策略模式。

规则3:封装所有的原生类型和字符串

动机:整数只是代表一个数量,没有实际的含义。用类来表示原生类型,比如年,月,日等。这样可以进行严格的类型检查。

规则4:一行代码只有一个“.”(或者“->”)运算符

动机:如果一行中含有多个“.”,则说明很多职责的位置放置错了。尝试让对象为你做一些事情,而不要窥视对象内部的细节。封装的含义就是,不要让类的边界跨入到它不应该知道的类型中。

规则5:不要使用缩写

动机:缩写的原因:1)一遍一遍的敲打同样的单词,则可能是因为某个方法调用过于频繁——要消除一下重复。2)方法名字太长——可能是职责没有放在应该在的位置或者有确实的类。

方法:所有实体对象的名称都只能包含一到两个单词,不要使用缩写。

规则6:保持对象实体简单清晰

动机:超过50行的类所做的事情通常都不止一个。这会导致他们难以理解和重用。这意味着每个类的长度不能超过50行。每个包所包含的文件不超过10个。

规则7:任何人类中的实例变量不要超过两个

动机:将一个对象从拥有大量属性的状态,解构成分层次的,相互关联的多个对象,会直接产生一个更实用的对象模型。将一个复杂的大的对象,分解成多个简单的对象。

方法:可以将实例变量按照相关性分离在两个部分中;可以创建一个新的对象来封装两个已有的实例变量。

规则8:使用一流的集合

集合的概念应该是一类实例的集合。比如,定时器对象的集合——包括所有的定时器。我一般是放在定时器类中,然后使用static来表示集合。看了这个方法要改一下了。

任何包含集合的类都不能再包含其他的成员变量。每个集合都被封装在自己的类中。集合其实是一种应用广泛的原生类型。

规则9:不要使用任何的Geter/Setter/Proerty

Geter/Setter/Proerty会对对象的封装性找出破坏。

在严格封装的边界背后,真正的动机是迫使程序员在完成编码后,一定要为这段代码的行为找到一个合适的位置,确保它在对象模型中的唯一性。

这样可以减少重复性的差错,以及在添加新特性的时候,可以在一个更合适的位置引入变化。

这九条原则可以作为对面向对象优秀设计的训练(可以通过一个小的项目),但是,在实际的过程中不可以教条的应用上面的原则。引用P.J. Plauger的话:

“你在应用某种设计方法的时候越教条化,你所能解决的现实问题就会越少。请把设计看出是一个险恶的,杂乱的和启发式的过程(没有教条化的规则可以遵循,能够巧好解决现实问题的方案才是最佳的方案)。不要停留于你所想到的第一套方案,而是去寻求合作,探求简洁性,在需要的时候做出原型,迭代,并进一步迭代。你将对你的设计成果感到满意。”

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,105评论 1 32
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,993评论 6 13
  • 1.埋点是做什么的 2.如何进行埋点 3.埋点方案的设计 近期常被问到这个问题,我担心我的答案会将一些天真烂漫的孩...
    lxg阅读 2,018评论 0 1
  • 让阅读之花竞相开放——第二届苏派名师精品课堂(名著阅读)研讨活动 引子:每一次出门学习都是一种淬炼与升华,淬炼一个...
    丝语随笔阅读 1,154评论 1 22
  • 文/常庆旺 童年最快乐的时光总是有好多,记得在每年春天的时候,满地的油菜花盛开,黄灿灿的一大片,我会和玩伴们...
    常庆旺阅读 595评论 2 3