[1]动机、原则与模式——OO设计之我见

2014年8月,我应内训经理的要求,做一次技术分享。我认为在公司的IT开发中,对面向对象的设计和实现没有得到足够的重视,宣贯做的不够,大部分软件工程师在这方面的素养也有待提高。另外由于我的专业和长时间的实践,始终想对面向对象设计做一个自己的阐述。我觉得这是特别好的一次机会,所以就这个问题做了题为《动机、原则与模式——OO设计之我见》的讲座,反响较好。这篇文章就是脱胎于这次分享,并在文字上更规范了一些。

编程是什么?
说到面向对象的设计和开发,我就想到上学的时候Pascal老师问过的问题:编程是什么?经过这么多年的实践,我觉得当时老师给出的答案是本质上的。编程就是数据结构加算法。这里先谈谈我对算法的理解。

算法就是解决问题的步骤,我认为是一种对软件工程的动态表述。关于算法,我有一个好消息和一个坏消息。好消息是,作为社会科学的范畴,大到国家强盛,民族复兴,小到家庭和谐,自我实现。往往都很难用1234的步骤来描述;而作为自然科学的计算机技术,大多数的问题都可以用某种算法的表述十分精确的定义。这就是为什么让我们觉得科学家比社会学家更靠谱;坏消息是即使有明确的步骤,很多算法还是很难。探其缘由,算法的难度来源于与数学的不解之缘。因为很多算法问题都是可以通过数学来进行建模,进而变成一个数学问题来求解。

讨论完算法,再说数据结构,数据结构是数据的组织方式,是软件工程的静态表述,数据结构是一种静态的美。作为一个普通的程序员,你可能不会设计很高深的算法,但你会经常遇到设计数据结构的问题,OO设计,本质上就是设计数据结构。从现在业界的技术人员构成,你会发现,真正研究狭义的算法的程序员是金字塔的塔尖,他们在大型科研单位和BAT这种巨型互联网企业中。而大量的软件工程师和高级软件工程师其实都在做数据结构,只是在解决数据结构问题的过程中,涉及解决问题的步骤,即广义的算法。而且好的数据结构设计,会从根本上简化解决问题的步骤。

程序员的境界
我在这里提到了两个典型的员工,他们可能不是具体的两个人,但绝对代表了两类人。老李,10年以上工龄的老程序员,习惯了开发过程中不费脑子的Ctrl+c,v大法,鲜有拿得出手的OO设计方案;小王,科班出身但经验缺乏,遇到问题善于思考和总结,即使很小的设计,也能看出OO设计的影子。我对他们的看法是,老李是典型的“一年进步,N年循环”的程序员,而小王终将“从优秀到卓越”。为什么造成了这种不同?境界的不同!

这时我又想起了《大腕》这部电影,其中一个桥段就是葛优给Lucy讲解境界的含义。它是一种眼光,境界越高的人,看的就越远。我给出了这样一张slide和一个结论。就OO设计而言,普通的程序员,优秀的程序员,伟大的程序员和佛,境界就是这么大的区别,而在我们修炼内功的道路上,提升OO设计能力,就是提升境界。

ood.jpg

动机、原则与模式
我认为,软件设计可以分为三个重要的层次,面向对象的思想和软件(构件)复用的动机是最高层次的,面向对象的设计原则是对以上内容的具体化和衔接,而设计模式才是更具体到实际问题的解决方案,即接”地气“的部分。所以一个好的软件系统设计师,首先应该有面向对象的思想,然后掌握面向对象的设计原则,最后才是具体问题具体分析,应用模式来解决实际问题。这样才会设计出比较合理的系统,以及降低滥用和错用设计模式的几率。

动机是指一个人想要干某件事情而在心里上形成的思维途径。同时也是一个人在做某种决定所产生的念头。说到动机,可以比较两种程序员,分别是懒程序员和“懒”程序员。前者,不深入思考系统的结构,不会用面向对象的方法设计整个系统,停留在面向过程的思维模式,简单的复制粘贴;后者,不是真的懒,而是不愿意在后期维护更多的代码,愿意在设计阶段投入更多的精力,专注于解耦和封装,磨刀不误砍柴工。

我把真正的OO设计的动机总结为三点,首先是真实的反应客观世界,也就是建立模型;其次是把正确的算法,即解决问题的步骤放到正确的结构中;最后是拥抱变化,为产品,也为自己的未来考虑。

有些人认为,学习OO设计就是学习设计模式。但我更认为,OO设计的原则重于设计模式。《Java与模式》是一部描述设计模式的出了名的大部头,一共1024页(好有计算机科学的感觉)。尽管你可以想象他用超过90%的篇幅描述各种设计模式,但是你可能不会想到,他在第二部分就写了这么一段话:

在目前的软件界,学习和应用设计模式正在形成风气。的确,通过学习和应用设计模式,可以更加深入地理解面向对象的设计理念,从而帮助设计师改善自己的系统设计。但是,设计模式并不能提供具有普遍性的设计指导原则。在读者经过一段时间的对设计模式的学习和使用之后,就会觉得这些孤立的设计模式的背后应当还有一些更为深层的、更具有普遍性的、共同的思想原则。

可见本书的作者,希望读者在进入设计模式这个绚丽世界前,先要掌握OO设计原则这个指南针,才不会在随后的学习中迷失方向,才能掌握“大巧若拙,大辩若讷”的OO设计精髓。那么OO设计原则都有哪些呢?我又怎样对它们进行解读呢?请看本文章的第二部分

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

推荐阅读更多精彩内容

  • OO设计的三宝在讲具体的原则之前,我想先明确一下面向对象语言的三个特性。所有的面向对象语言都首先必须支持这三个特性...
    扁圆柱体阅读 488评论 0 1
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,073评论 25 707
  • 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及...
    dle_oxio阅读 11,054评论 6 244
  • 人生不过四季:春、夏、秋、冬 四季随能轮回 但生命不会重来 只有春种一粒粟 才能秋收万颗子 其实,生命不过三天 昨...
    TWE阅读 1,576评论 0 0
  • 情商的表现之一就是自己能控制自己的情绪,那么在日常生活中,作为我们避免不了喜怒哀乐。这几种情绪当中,我们最难控制的...
    酥小栗阅读 313评论 0 0