- 关于设计模式与这一系列博客导读
- 基于《JavaScript模式》的学习路径与注意点
- 如何基于JavaScript设计关于解决特殊问题的模板
一、关于设计模式与这一系列博客导读
1.1什么是设计模式?
我在学习设计模式之前,听到或看到的最多的关于什么是设计模式的回答都是“....23种设计模式”,面对这个答非所问的回答让我学习这部分内容总是感觉云雾缭绕似懂非懂,关于这个问题我们首先需要弄清楚什么是模式?什么是设计?
模式:解决特定问题的模板。
设计:基于合理的规划、周密的计划、通过各种方式表达出来的过程。
那么,根据模式和设计的定义我们可以得到设计模式的解释就是:基于合理周密的代码逻辑解决特定问题的模板。
1.2从设计模式的抽象思维到具体问题的解决方案
前面解释了什么是设计模式,但还仅仅只是停留在抽象的思维总结层面,我们该如何具体的分析一个问题,又如何做到合理且周密?
首先,我们在遇到一个问题时需要分析这个问题是否是特定的问题,这个问题的特定范围边界在哪里?
其二,这个问题是否存在一定规模,如果不具备规模性那模板的意义和价值也就不存在了。
其三,解决这个问题都有哪些方式可行,那种方式才是合理的,合理的依据是什么?
其四,模板的具体实现是否能肯定的回答前面三个问题?
1.3关于设计模式的目的与六大设计原则
在实际的具体问题中设计模式往往围绕代码的重用性、可读性、可靠性、可维护性展开,由此产生了设计模式的六大原则:
单一职责原则:即当前程序模块只负责处理一项任务,保障该模块不受其他程序的干扰,在任何情况下都能正常完整的完成该模块的任务,其目的是保证代码的重用性和可靠性。
里氏替换原则:即程序模块1替换成程序模块2时,程序模块1的所有功能可以被程序模块2替换;但反过来程序模块2替换程序模块1时,程序模块2的所有功能维持不变。其目的是保证了程序模块2的可靠性。
依赖倒转原则:高层模块不应该依赖底层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。比如A依赖B,如果要将A依赖改为C,则A需要通过其抽象来完成,而不能通过依赖的B完成;如果A需要修改其某个功能,也需要通过A自身的抽象完成,不能通过依赖的B或C完成,并且如果A的抽象需要修改某个功能,不能通过A实现,而是在抽象自身实现。其目的也是为了保证程序的可靠性。
接口隔离原则:当前模块不应该依赖它不需要的模块,如果是需要的依赖模块则依赖只能建立在最小接口上。其目的是为了保证程序的可读性和可靠性。
迪米特法则:当前模块应该保持对其他模块最小的了解。其目的是为了保证程序的可靠性。
开闭原则:即对当前程序模块扩展开放,修改关闭。保障程序在必要的情况下可以随时升级维护,并不修改程序原本的功能,其目的是保证代码的可维护性。
二、基于《JavaScript模式》的学习路径与注意点
1.参考书籍:《JavaScript模式》
这是一本距离第一次发行已经有十年之久,现后被增印六次,第一次发行时间是2012年,所以这本书的相关技术背景和示例代码相对现在略微过时,但通过其增印六次和口碑可以肯定这是一本经典之作。
2.为什么选择这本书作为设计模式的参考书籍,虽然我学习过Java、C#,甚至一些其他语言也有写过几行代码的经历,但是我当下在深入的研究前端开发相关的技术,选择这本书也是为了更加熟练的掌握JavaScript这门语言。其二,这是一本少有的从如何基于一门语言的特性角度出发编写解决特定问题的模板,即如何设计模板。
3.我对设计模式的理解和学习建议:
每一个具体的模式都是为了解决特定问题的,熟悉和了解具体的设计模式可以提高我们的开发效率和代码质量,但这是一个非常初级的阶段。每一个特定的模板都要基于具体的编程语言的实现,在不同的语言环境中都会存在不同的差异,这些差异是由语言本身的特性决定的。如果要在某个特定语言上实现一个模板都必须对该语言的特性有深入的理解,这是实现模板的基础和前提条件。《JavaScript模式》花了很大的篇幅介绍了基于语言特性与模板设计相关的内容,这非常契合我的学习思路。
由于《JavaScript模式》当时问世的技术背景,部分内容会显得与当下的技术存在差异,但这不影响我们理解如何设计模板,鉴于内容的客观因素我会在前期围绕书籍内容展开解析和总结,后期随着我的深入理解和学习会在必要的内容上补充以当下技术为基础的内容,这是一个具有挑战性的学习过程,在这个过程中如果有理解不透彻的地方是难免的,我尽力做到准确不出错,也希望大家多多持支和指正,同时我也需要时间,希望大家能够多多理解。
4.最后关于JS的最新技术深入理解和学习,我建议参考《你不知道的JS》系列,这是当前我认为关于JS特性解析最优秀的参考书籍。
三、如何基于JavaScript设计关于解决特殊问题的模板
在第一节中介绍了模式、设计、设计模式以及设计模式的目的与六大原则,在第二节中终点强调了基于语言特性实现设计模式的基本思路,那么这一节就简单的谈谈如何基于JavaScript实现具体的设计模式用例,这也是很多刚刚学习设计模式的同学最大的疑问,学习设计模式到底学的是什么?这个问题在第一节中提出来了过,也回答过,但我相信大部分人依然不明白设计模式需要学习什么?
本质上,学习设计模式是深入的研究理解语言的特性,然后基于语言的特性实现重用性、可读性、可靠性、可维护性高的解决具体问题的模板代码,所以学习设计模式的第一个阶段是深入的研究理解语言特性,这一点往往会被忽略,因为很多教案和书籍将语言特性和具体的设计模式分离为两部分内容,具体释疑时又没有将这两部分联系起来。
在深入理解语言特性以后,再学习具体的经典的设计模式,比如23个设计模式,这些经典肯定是适用性广并且可靠稳定可维护,但一般是具体问题具有普遍性,只有问题具有普遍性设计模式才有存在的意义。借鉴和学习这些经典的设计模式,将语言特性解和程序的设计思想融会贯通,为以后具体工作中实现具体的设计模式打下坚实的基础。
那么,回到JavaScript语言上来看,其语言有哪些特性?
JavaScript是弱类型、动态类型检查的解释性语言。
基于这样的语言类型,所表现出来的特性主要有:单线程、异步、闭包、动态变量类型、基于原型的类型构造与继承等。基于这些特性,接下来会以编写可维护的JavaScript代码、JavaScript一切都是对象、JavaScript一等公民函数与闭包、JavaScript对象与继承、经典设计模式系列所展开。