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


反过来说 , 如果你不用任何框架 , 去实现一个中等规模的Web应用 。 看看自己写的代码与现在基于框架二次开发的代码差别大不大 , 差别在哪里 。 我想 , 自己去实现未必会比开源大牛们设计的更好 , 但却完全可以体会到复杂点难点在哪里 , OOD是不是有应用场景 , 因为写的过程中蛋疼了 。 编程虽易 , OO不易 , 且编且珍惜 。
2 Java平台中的面向对象举例
Java语言的API规范中 , 可以说是处处体现了OOD 。 这里仅仅举Servlet和JDBC规范两个例子 , 不同的厂商底层对Servlet API的实现 , JDBC驱动的实现 , 完全对开发人员屏蔽 , 两套规范都实现了精炼的抽象 。
Servlet API把HTTP协议中的请求信息封装成HttpServletRequest对象 , 响应消息封装成HttpServletResponse对象 。 开发人员直接从这两个对象中获取HTTP通信中的各种HTTP头信息 , 参数信息 , 以及完成对HTTP客户端的响应信息输出 。
JDBC API使得开发人员可以不考虑具体的数据库类型 , 用相同的API完成与数据库的交互 。
完全可以说 , 掌握了Servlet API就掌握了Java Web应用开发;掌握了JDBC API就掌握了与Java数据库应用开发 。
Java开源社区奉献了大量优秀的框架 , 例如:Lucene , Hadoop , Hbase , Mina , Netty , ActiveMQ等在互联网和电商行业得到广泛应用 。 (看来搞Java一时半会不会找不到工作 , 不过少年你天资聪颖活力青春 , 我还是建议你搞IOS开发简单粗暴 , 不解释) 。
3 面向对象不适用于所有业务场景
在Java语言中 , 一切都是对象 。 那是不是所有的业务问题 , 都可以用面向对象的方式去设计实现呢?要知道“尺有所短 , 寸有所长” , OOD也不是全知全能的宇宙真理啊!
举个例子 , 比如要实现一个自然整数n的阶乘 。 你再怎么面向对象去思维 , 也无法去抽象出对象模型对应这个问题 。 这种场景下 , 反而过程式的实现更加简单直接 。 还有很多数学推导公式的求解也是如此 。
再举个例子 , 项目中有个实现最短路径算法的需要 。 虽然我用面向对象思维方式活生生写了10来个类实现了功能 。 网上一搜 , C语言用邻接矩阵存储的方式来实现的一两个类就实现了该功能 。 面向对象的方式可能更加适合开发人员去读懂 , 对于计算机来说 , 可能面向过程的实现运行效率更高 。
在我看来 , 计算机技术的本质是计算 。 各种二进制表示的数据 , 通过网络通讯进行传输 , 然后系统对计算的结果进行存储或通过网络返回给调用方 。
我们的思维方式中不能排斥 , 不包容其它的设计理念 。 认为OOD一招打遍天下 , 就有点愚蠢了 。 这点其实挺难的 , 我们从小的受到的教育是同一种观念 , 同一种政治正确性 , 甚至同一种价值观 , 不允许有异见 。 经常能看到论坛上非此即彼的对骂 。 好在互联网的开放性 , 使得越来越多的人有了多元的世界观 , 价值观 。
4 学习设计模式可帮助理解OOD
设计模式列举了一些经典业务场景的最佳实践 , 非常值得借鉴学习 。 我们学习设计模式中常用的23种招式 , 最终目的是培养自己对OOD的悟性 。
就好像我们看武侠小说里面 , 十八般武艺招数全部学会 , 还不抵九阳神功一掌 。 对内功深厚的大师来说 , 飞沙走石一花一叶都可伤人性命 。
但学武之初 , 扎扎马步 , 练练兵器拳法 , 还是有助于培养悟性的 。
同时又不能生搬硬套为了模式而模式 , 觉得它精妙就想时时处处都模式了 。 举个邪恶点的例子 , 由于教育的缺失 , 就如在学生时代男生普遍性启蒙都是靠观摩岛国爱情动作片来领悟啪啪啪的要义一样 , 你要是模仿男主角把里面的每个场景每个招式都实践一遍吧 , 有些高难度动作会完成不了还会伤害自己 , 你懂的 。
设计模式的精髓就在遵循开闭原则 , 将通用代码向父类抽取 , 对可变的行为抽象成接口进行封装 。 模式的提炼应该是水到渠成的事情 。
只要平时养成面向接口编程 , 依赖于抽象而不是依赖于具体实现类的开发习惯 。 当编码实践经验达到一定的临界点后 , 量变引起质变 , 不知不觉中发现写的代码已经是运用了设计模式在里面了 。 大家都听说过 , 一万小时理论 , 精通一项技能往往需要持续实践一万小时以上 。 但凡5年以上扎实地编程实践 , 即使得不到高人指点 , 也会对OOD顿悟 。
5 持续重构可帮助对抽象思维的培养
OOD的精华在于抽象 , 抽象 , 再抽象 。 但是每个人对于设计经验有一个积累的过程 , 不可能一开始就设计的非常完美 , 能应付项目中所有的需求 。