Java高级特性:循序渐进地培养面向对象的思维方式( 三 )


但学武之初 , 扎扎马步 , 练练兵器拳法 , 还是有助于培养悟性的 。
同时又不能生搬硬套为了模式而模式 , 觉得它精妙就想时时处处都模式了 。 举个邪恶点的例子 , 由于教育的缺失 , 就如在学生时代男生普遍性启蒙都是靠观摩岛国爱情动作片来领悟啪啪啪的要义一样 , 你要是模仿男主角把里面的每个场景每个招式都实践一遍吧 , 有些高难度动作会完成不了还会伤害自己 , 你懂的 。
设计模式的精髓就在遵循开闭原则 , 将通用代码向父类抽取 , 对可变的行为抽象成接口进行封装 。 模式的提炼应该是水到渠成的事情 。
只要平时养成面向接口编程 , 依赖于抽象而不是依赖于具体实现类的开发习惯 。 当编码实践经验达到一定的临界点后 , 量变引起质变 , 不知不觉中发现写的代码已经是运用了设计模式在里面了 。 大家都听说过 , 一万小时理论 , 精通一项技能往往需要持续实践一万小时以上 。 但凡5年以上扎实地编程实践 , 即使得不到高人指点 , 也会对OOD顿悟 。
5 持续重构可帮助对抽象思维的培养
OOD的精华在于抽象 , 抽象 , 再抽象 。 但是每个人对于设计经验有一个积累的过程 , 不可能一开始就设计的非常完美 , 能应付项目中所有的需求 。
抽象思维能力 , 更需要一个循序渐进的培养过程 。 我们不断地学习优秀开源框架的源码 , 学习设计模式都是一种外部手段 , 旨在迫使自己大脑中学会抽象思考的方式 。
所面临的问题域是一个子系统 , 一个模块 , 那抽象的思维培养的是面向对象设计的能力 , 系统分析与领域建模的能力 。 放大了看 , 如果面临的问题域是整个系统或者多个系统 , 则培养的就是系统架构设计的能力 。
有过一定编程实践经验的人都有过这样的经历 , 系统中如果有重复的代码段出现2~3次就会觉得很恶心 , 尤其是一大段大段上百行几乎一样的代码 。 因为每个人的编码能力经验不同 , 开发的时候很可能设计不到位 。 那可不可以将其进行提炼复用呢?
答案是可以 , 因为我们有重构(Refactor)这个法宝 。
持续的重构是可以有效改进面向对象的设计的 。 我常常在看别人的代码时候 , 不自觉地帮着进行重构 , 这只是一种习惯 。 当然 , 必须在尊重原作者的前提下 , 一步步小范围内重构 。
落实到细节上 , 难点在于类和方法的命名 , 类的职责划分 , 抽象的粒度大小适中 。 这些真的只能靠经验积累 , 去领悟理解了 , 没有一定的标准 , 什么是好 , 什么是不好 。 我觉得起码命名要清晰 , 易于理解 , 类的职责要专一 , 方法长度不能过长 。 细节方面可参照大牛Martin写的那本关于重构的圣经书 。
最后 , 一个人对知识的理解 , 不是线性增长或者抛物线上升的 , 应该是阶梯形上升的 。 每上一个台阶 , 需要熬过一段不规则的积累沉淀期 , 再由外界因素的触发引起内在的觉醒才能继续到下一个台阶 。 以前死活不明白的事情 , 或许随着年龄增长 , 都释然了 。 闻道有先后 , 但终究会顿悟
总结:
面向对象抽象思维的培养方式: 学习设计模式 、重构代码