《大话设计模式》读书笔记
补充基本思想~
阅读时,摘抄是非常好的习惯。“最淡的墨水也胜于最强的记忆!"有不少读者会认为摘抄了将来也不会再去看,有什么必要,但其实在写字的过程就是大脑学习的过程,写字在减缓你阅读的速度,从而让你更好地消化阅读的内容。相信大家都能理解,“囫囵吞枣"和“慢慢品味”的差异,学习同样如此。
1.5 活字印刷,面向对象
作者使用了很生动的活字印刷的例子来告诉我们,程序的复用,可拓展是多么重要,但是我觉得所有这些优秀的特性都是建立在良好的封装性上面的, 复用的尽量都要抽成方法,减少冗余。
“第一,要改,只需更改要改之字,此为可维护:第二,这些字并非用完这次就无用,完全可以在后来的印刷中重复使用,此乃可复用:第三,此诗若要加字,只需另刻字加入即可,这是可扩展:第四,字的排列其实可能是竖排可能是横排,此时只需将活字移动就可做到满足排列需求,此是灵活性好。”“而在活字印刷术出现之前,上面的四种特性都无法满足,要修改,必须重刻,要加字,必须重刻,要重新排列,必须重刻,印完这本书后,此版己无任何可再利用价值。”
1.6 面向对象的好处
大鸟:“哈,这下你明白了?我以前也不懂,不过做了软件开发几年后,经历了太多的类似曹操这样的客户要改变需求,更改最初想法的事件,才逐渐明白当中的道理。其实客观地说,客户的要求也并不过份,不就是改几个字吗,但面对己完成的程序代码,却是需要几乎重头来过的尴尬,这实在是痛苦不堪。说白了,原因就是因为我们原先所写的程序,不容易维护,灵活性差,不容易扩展,更谈不上复用,因此面对需求变化,加班加点,对程序动大手术的那种无奈也就成了非常正常的事了。之后当我学习了面向对象的分析设计编程思想,开始考虑通过封装、继承、多态把程序的耦合度降低,传统印刷术的问题就在于所有的字都刻在同一版面上造成耦合度太高所致,开始用设计模式使得程序更加的灵活,容易修改,并且易于复用。体会到面向对象带来的好处,那种感觉应该就如同是一中国酒鬼第一次喝到了茅台,西洋酒鬼第一次喝到了XO一样,怎个爽字可形容呀。”
1.8 业务的封装
在软件中有需要展示页面和完成业务功能逻辑的要求,但是在编写代码的时候,很容易把界面和业务逻辑都写在同一个类中,最基本的就是把页面展示和业务逻辑分开,让其耦合度分开。其实就算页面也有很多的事件接口,随着界面的复杂程度越来越高,一些跳转,刷新,交互效果会越来越多,需要进一步的管理,同样业务逻辑更多,所以会抽出一些管理类来实现更好的封装。
文中需要实现一个计算器,如果拿到代码,可能直接把代码逻辑写在当前的类中,然而更好,更容易复用的是写一个计算器的类,提供必要的接口,可以不断让它帮我们干这个计算业务的活。

1.9 紧耦合和松耦合
上面这种写法在拓展上还不足,如果新增case,需要把之前的函数没,其实就是逻辑熟悉“分的还不够开”,可以将公共的部分抽成基类,让各种子类去实现.


只需要输入类型,工厂就能实例化合适的对象,

补充: 继承和多态度
继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写;
有了继承,才能有多态。接口的多种不同的实现方式即为多态,在调用类实例方法的时候,尽量把变量视作父类类型,这样,所有子类类型都可以正常被接收;这样的好处就是,一个方法名在不同的子类里具有不同的作用。
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
当我们定义一个class的时候,我们实际上就定义了一种数据类型。
def
run_twice
(animal):
animal.run()
animal.run()
你会发现,新增一个Animal的子类,不必对run_twice()做任何修改,实际上,任何依赖Animal作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态。
对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()
方法,而具体调用的run()
方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()
方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:
对扩展开放:允许新增Animal子类;
对修改封闭:不需要修改依赖Animal类型的run_twice()
等函数。
3.5 方块游戏的设计
这些都是和游戏有关的逻辑,和界面如何表示没有什么关系,为什么要写在一个类里面呢?如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏【ASD】
业务逻辑需要抽出来。
小菜:“说是这么说,我却感觉比较难受,我的同学,有几个其实水平不比我强,他们都签了xx大集团、XX知名公司,而我现在一无所有,感觉很糟糕。要是当时我也花点时间在简历上,或许现在也不至于这么不爽。”
大鸟:“你考研复习的时候,每天学习多长时间,有没有休息的时候?”
小菜:“差不多十小时吧,其实效率并不高,有不少时候都困得不行,趴在桌上睡觉去了。”
大鸟:“这就对了,你为什么不利用休息的时间考虑一下自己的简历如何写,关心一下有些什么单位在招聘呢?这样也就不至于现在这样唉声叹气。”
4.2 开发-封闭原则
开放一封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。[ASD]
大鸟:“这个原则其实是有两个特征,一个是说'对于扩展是开放的(Openforextension
个是说'对于更改是封闭的(Closedformodification)【ASD】。
大鸟:“我们在做任何系统的时候,都不要指望系统一开始时需求确定,就再也不会变化,这是不现实也不科学的想法,而既然需求是一定会变化的,那么如何在面对需求的变化时,设计的软件可以相对容易修改,不至于说,新需求一来,就要把整个程序推倒重来。怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?[ASD】,开放·封闭给我们答案。”
关于迟到
小菜:“那怎么办?老是迟到的确也不好,但不让迟到也不现实。家的远近,交通是否堵塞也不是可以控制的。”
大鸟:“仔细想想,你会发现,其实迟到不是主要问题,每天保证8小时的工作量是老板最需要的,甚至8小时工作时间也不是主要问题,业绩目标的完成或超额完成才是最重要的指标,于是应该改变管理方式,比如弹性上班工作制,早到早下班,晚到晚下班,或者每人每月允许三次迟到,迟到者当天下班补时间等等,对市场销售人员可能就更加以业绩为标准,工作时间不固定了一一这其实就是对工作时间或业绩成效的修改关闭,而对时间制度扩展的开放。”
小菜:“这就需要老板自己很清楚最希望达到的目的是什么,制定的制度才最合理有效。”
大鸟:“对的,用我们古人的理论来说,管理需要中庸之道。”
大鸟:“开放.封闭原则的意思就是说,你设计的时候,时刻要考虑,尽量让这个类是足够好,写好了就不要去修改了,如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动。”
小菜:“这可能做到吗?我深表怀疑呀,怎么可能写完一个类就再也不改了呢?”
大鸟:“你说得没错,绝对的对修改关闭是不可能的。无论模块是多么的'封闭,,都会存在一些无法对之封闭的变化既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化[ASD]。"我们是很难预先猜测,但我们却可以在发生小变化时,就及早去想办法应对发生更大变化的可能。也就是说,等到变化发生时立即采取行动[ASD]。正所谓,同一地方,摔第一跤不是你的错,再次在此摔跤就是你的不对了。”
大鸟:“在我们最初编写代码时,假设变化不会发生当变化发生时,我们就创建抽象来隔离以后发生的同类变化[ASD]。比如,我之前让你写的加法程序,你很快在一个client类中就完成,此时变化还没有发生。然后我让你加一个减法功能,你发现,增加功能需要修改原来这个类,这就违背了今天讲到的'开放·封闭原则,,于是你就该考虑重构程序,增加一个抽象的运算类,通过一些面向对象的手段,如继承,多态等来隔离具体加法、减法与client耦合,需求依然可以满足,还能应对变化。这时我又要你再加乘除法功能,你就犭嚅要再去更改client以及加法减法的类了,而是增加乘法和除法子类就可。即面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码[ASD]。这就是'开放·封闭原则,的精神所在。”(样例代码见第1章)
大鸟:“当然,并不是什么时候应对变化都是容易的。我们希望的是在开发工作展开不久就知道可
能发生的变化查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难〔ASD]。”
小菜:“这个我能理解,如果加减运算都在很多地方应用了,再考虑抽象、考虑分离,就很困难。”
大鸟:“开放.封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要[ASD]。切记,切记。”
4.4两手准备,并全力以赴
大鸟:“回过头来说,你考研和求职这两件事,考研是你的追求,希望考上研究生,可以更上一层楼,有更大的发展空间和机会。所以考研之前,学习计划是不应该更改,雷打不动的。这就是对修改关闭。但你要知道,你几个月来只埋头学习,就等于放弃了许多好公司来你们学校招聘的机会,这机会的失去是很不值得的。我就不信你一天到晚全在学习,那样效果也不会好。所以你完全可以抽出一点时间,在不影响你复习的前提下,来写写自己的简历,来了解一些招聘大学生的公司的咨讯,这不是很好的事吗?既不影响你考研,又可以增大找到好工作的可能性。为考研万一失败后找工作做好了充分的准备。这就是对扩展开放,对修改关闭的意义。”
小菜:“是的,我就不信,我会比别人差!”
仍然自由自我,永远高唱我歌,走遍千里!”(作者注:本故事和“开放·封闭原则”对应有些牵强,所以在此做一声明。全力以赴当然是必需,两手准备也是灵活处事的表现,希望读者您能对痛苦关闭,对快乐开放。)
第7章 代理模式
代理模式,相当于对模块的功能拓展,一些模块内不适合做的东西交给代理去完成~
© 本文版权归 FrizzleFur 所有,任何形式转载请联系作者。
© 了解版权计划
热门话题 · · · · · · ( 去话题广场 )
- 长大后才解其中味的文学经典 新话题 · 2819次浏览
- 我的赛博空间 20.1万次浏览
- 我的晚年生活画像 24.0万次浏览
- 哪一瞬间让你下定决心将人生推翻重来 49.8万次浏览
- 合租生活指南 50.1万次浏览
- 大都市的你形成了什么样的“怪癖” ? 33.2万次浏览