什么是设计模式?
用特定的工具完成一件特定的任务,大家总是能想到很多方法。经过无数工程师的尝试之后,大家总结出了一些最优的方法,比如说“在某某情况下实现某某目的,采取什么做法最可靠、最可扩展”,这些经过总结的做法,就称为设计模式。
(联合收割机:解决收获问题的设计模式)
设计模式不是设计规范,它没有强制性,但它可以帮助你用优雅、可靠、可维护的方式解决一些前人已经解决过无数遍的问题,并在这个过程中吸收前人的精髓思想。如果你想解决的问题是工程问题而不是科学研究,你就必须得懂一点设计模式。
比如说半个世纪前,计算机程序是没有select(分支结构),也没有while(循环结构)的,一切都用goto(地址跳转)来实现。后来大家写程序写得多了,就有人发现:其实大多数编程工作都是在用goto实现select和while的功能。后来我们就把这些结构归纳为基本的设计模式,几乎所有高级编程语言都继承了这些设计模式,让我们可以方便地写程序。
搞软件有设计模式,搞电子其实也有设计模式。比如我们学单片机,往往学会了“单片机可以怎么编程”,却没有搞明白“单片机应该怎么编程”,后果就是程序一旦复杂起来,有时就不知道该怎么写了;或者有的问题搞了两三个月,结果换成人家两三个星期就搞好了。最后虽然知道了单片机是怎么工作的,但有些功能就是做不出来。
我经常看到很多人提问,说我要用单片机加某个传感器实现某个功能,程序怎么写?求大神帮忙!!!这些同学是不会写程序吗?不是的,他们会写for和while,只不过他们不了解单片机程序的一般设计模式。如果是验证工作原理,程序就很简单;要组成一个系统,系统间各个部件要协作,这个程序就不是谁都会写了。很多没有接受过工程教育的爱好者,甚至一辈子也写不出能流畅工作的程序,只好天天找大神求助,却不知道还有“设计模式”这回事。
举个例子,论坛有很多同学想自己用单片机设计数据采集系统,比如航电、数采卡之类的,并通过这个过程学习单片机程序设计。问题是,这些程序究竟该怎么写?写一个while循环吗?应该在中断内还是中断外处理数据?怎么实现延时?怎么实现多任务?于是这些同学就到处提问,成为了社会的负担。
还有的同学靠蛮力去尝试,那简直就是在浪费生命。假如他们了解那些经过检验的设计模式,就可以节省很多无用功。所谓跟牛人做项目,看高手写代码,拆机器拍电路,其实都是在学习设计模式。不过,这些学习方法都是野路子,效率很低。如果我想正经地学一下设计模式,有什么捷径吗?
我印象中科创除了joyeep发过一次他的软件设计模式库之外,就没有人提过这些事了,包括KC901的团队也只跟大家讲过一些原理性的东西,没有讲过设计模式。而决定一个工程项目(也就是绝大多数DIY项目)周期长短的关键,往往就是设计模式而不是基础理论。
对于单片机相关的设计,我推荐《时间触发嵌入式系统设计模式》,这本书是老外写的,写的很好。
最后,祝大家开发愉快。