👆点击“博文视点Broadview”,获取更多书讯
--文末赠书--
兔小白:大家好,我是兔小白,今年刚刚毕业,还是一名初级软件工程师。虽然我的编程经验有限,但痴迷于技术,一钻研起技术来可以说废寝忘食。最近我正在跟熊小猫学习设计模式。原本令我觉得枯燥、难懂的设计模式,在他的讲解下变得生动有趣,我不但学得快,记得也牢。
熊小猫:大家好,我是兔小白的技术经理熊小猫,已经工作5年多,编程经验比较丰富。我平时喜欢钻研技术,每当学习了新技术或者有了心得体会,都会和同事们分享、交流。指导兔小白,帮助初级程序员成长,也是我的工作职责。最近我在给兔小白讲解设计模式,如果你也感兴趣,欢迎加入进来,一起学习!
今天Code Review结束后,兔小白在座位上盯着电脑,闷闷不乐。熊小猫看在眼里,决定去关心一下这位小兄弟。
熊小猫:早就到了下班时间,你怎么还没走?看你这一脸“生无可恋”的样子,想什么呢?
兔小白:哎,刚才Code Review给我提了好多问题……
熊小猫:我刚工作的时候也一样,不用太过沮丧。Code Review是很好的学习机会,同事们给你提的每一个问题其实都在帮助你成长。
兔小白:我倒不是发愁问题多,主要是有些问题我不知道从何下手。你看看这个问题,“计算商品价格的代码耦合度高,负责计算的类逻辑过于复杂,不具备扩展性”,但是计算商品价格的业务就是非常复杂,没办法把代码逻辑写得更简单呀!
熊小猫:这个问题确实经常出现在新手的代码中,但优化的重点并不是在逻辑上优化,而是程序设计优化!手机的功能是不是很强大?但手机并不是一块铁板,而是由几十个大部件和成百上千个小零件组成的。你可以将每个零部件都比作程序中的一个类,比如摄像头类、话筒类、主板类、CPU类。开发一款手机并不是在主板上不断堆砌功能,而是要做好设计。首先识别出主要部件,设计好各部件相互之间的通信接口,然后分部件开发,最后组装到一起。写程序也是一样,不要一头扎进具体的逻辑之中,应该先设计出合理的程序结构。
兔小白:我有优化思路了!可以先把负责计算商品价格的类拆解成多个类,每个类实现部分功能,然后把这些类组合在一起,就像组装手机一样。
熊小猫:没错,封装是面向对象语言的特性之一,类的封装是其中一种。但封装只是软件设计的具体手段,类怎么拆、按什么力度拆、怎么组合,还需要深入了解软件设计思想才能做出合理的决策,不能只凭感觉。
兔小白:我之前写代码时,主要关注业务逻辑的实现,确实没有多考虑设计问题。软件设计有什么规则可以遵循吗?我可不想今天改完,明天又被提出好多新问题。
熊小猫:其实前辈们早就总结好了。你听说过设计模式吧?设计模式就是前辈们总结出来的软件设计思想。
兔小白:我听说过,但了解不多。我感觉不了解设计模式并不影响我写代码呀!你看我的代码质量一直都很好,很少出现Bug。
熊小猫:Bug数量少只是代码质量的基本要求。良好的可读性、复用性、扩展性、可维护性等,同样是重要的质量指标。只有当你具备了过硬的软件设计能力,才能全面考虑这些特性,而不会顾此失彼。学习设计模式绝对是程序员必不可少的一课。
兔小白:其实我也尝试过学习设计模式,但是感觉不太好理解就放弃了,看来我要重视起来。
熊小猫:咱们就从今天开始学习设计模式吧!我先提出一个直击灵魂的问题——设计模式从何而来?
兔小白:你不是说设计模式是前辈们总结出来的吗?
熊小猫:没错,不过我们刚才讨论的是软件中的设计模式,但其实设计模式早就存在于各行各业和我们的生活中了,我们先来理解什么是模式。
建筑学家Christopher Alexander 说过:每种模式描述了一个在我们周围不断发生的问题,以及该问题的解决方案的核心。这样,你就可以一次又一次地使用该方案,而不必做重复的劳动。
这句话放到软件领域也完全适用!模式是对问题的解决方案的总结。无论什么行业——软件还是硬件,只要问题相似,那么解决问题的方案就是相似的。
GoF对其著作《设计模式:可复用面向对象软件的基础》的介绍是——它描述了在面向对象软件设计过程中,针对特定问题的简洁而优雅的解决方案。
兔小白:这里的“简洁”和“优雅”该如何理解呢?
熊小猫:“简洁”很好理解,解决方案针对特定问题,要围绕该问题的核心制定方案,不要使问题发散,避免设计出过于复杂的方案。
“优雅”是一种和谐的表现,蕴含着明确、合理、适度、克制和平衡。解决方案需要合理且明确地解决特定问题,同时兼顾复杂度、成本、性能、可读性等因素。在制定解决方案的过程中,需要克制在某一方面的过度考虑,平衡全局。
兔小白:想要做到优雅可不容易呀!
熊小猫:没错,优雅追求的是合理的平衡。如果设计人员没有足够的经验,那么制定的解决方案很难达到优雅的水准。好在设计模式脱胎于现实世界,并且已经在软件行业中经过了数十年的验证,因此,每种设计模式在面对适合的场景时都足够优雅。
熊小猫:你以前在学习设计模式时,感觉不好理解就放弃了,其实设计模式并不难理解,在生活中随处可见。
兔小白:真的吗?我怎么没有发现?
熊小猫:与软件世界相比,现实世界中有着更多的问题,也有着更多的应对方案。平平淡淡的一天其实蕴藏了各种模式,只不过你已经习以为常。下面我说到的这些场景其实都涉及某种设计模式。
早上,你挑选一件漂亮衣服“装饰”自己。地铁站里,工作人员“迭代”安检每位乘客。到公司后,你取出笔记本电脑,插上“适配器”(电源),再接上鼠标、键盘、显示器,“组合”成你的工作站。中午,通过叫外卖“代理”购买午餐。下午有点儿困,你想要睡一会儿,让同事帮忙“观察”经理。下午,你使用公司提供的“模板”制作方案汇报幻灯片。晚上,回家打几局游戏,试试新学的“策略”好不好用……
这一天中有装饰模式、迭代器模式、适配器模式、组合模式、代理模式、观察者模式、模板方法模式、策略模式……你再仔细想想,还能想出更多的模式呢!
兔小白:哈哈,确实是充满了设计模式的一天!
熊小猫:可别再说设计模式难以理解啦!你每天都在实践各种设计模式。
想要在软件开发中复用现实世界几千年积累下来的模式,最好的做法就是用软件模拟现实世界。可以说,面向对象语言就是为此而生的。我们在使用面向对象语言时,可以在软件世界中构造出和现实世界一一映射的对象,从而很自然地借鉴现实世界中的解决方案。
兔小白:这么说,设计模式和面向对象语言是同时出现的?
熊小猫:并不是,设计思想建立在工具之上。虽然有了面向对象语言这个利器,但设计思想还需要经历一段时间的孕育。
从20世纪70年代出现比较完善的面向对象语言到20世纪90年代设计模式为大众所知,中间经历了二十多年。在这期间,软件工程师在不断总结、提炼解决方案,虽然没有将其公布于众,但其实早已有了智慧的结晶。当C++、Java等面向对象语言迎来辉煌之日,设计模式也随着GoF的《设计模式:可复用面向对象软件的基础》一书的出版而站在了世人面前。
兔小白:我有一个问题,你一直在说面向对象语言和设计模式的关系,那么面向过程语言有设计模式吗?
熊小猫:这是个好问题!设计模式指可以被复用的解决方案。面向过程语言一定也有可复用的解决方案,只不过这些方案没有集结成书而已。随着编程语言的发展向面向对象语言倾斜,人们更加关注面向对象语言的设计模式。如无特殊说明,现在我们所说的设计模式特指“面向对象语言的设计模式”。
熊小猫:经典的设计模式有23种。咱们一天学一个,不出一个月就学完了。
兔小白:这么说,一个月后我就可以用设计模式大展拳脚了!
熊小猫:嗯……恐怕我得给你泼泼冷水。学习设计模式并不难,但想做到灵活运用,还需要大量的实践。
还记得“优雅”二字吗?想做到优雅谈何容易。软件设计的过程是做取舍、找平衡的过程,需要考虑灵活性、可维护性、性能、未来演化等因素。在某个问题场景下,是否用设计模式、用哪种设计模式,需要平衡各种相关因素。
你可以想想选购手机的过程。如果有一部手机的功能、外形、性能完全满足你的要求,那么价格一定不“美丽”。在有限的预算内,你很难找到一部100%满足自己要求的手机。
软件设计也是如此,我们需要在有限的时间和资源下完成项目。面对大量的变量和约束,如何均衡设计,仅仅听我讲理论和经验是学不透彻的,只有身经百战,才能运筹帷幄。在实践中,设计模式的运用非常灵活,既可以对某个模式进行裁剪,也可以将多种模式搭配使用。我们学完设计模式后,可以按图索骥,但不能生搬硬套。
不管怎样,都要迈出第一步。
我们先学完23种设计模式,再在实践中参透设计模式的思想,一步步成为优秀的软件工程师。
以上摘自《漫画设计模式》一书,更多相关内容可阅读本书!
本书作者于10月23日(周三)晚20:00做客博文视点直播间,欢迎大家点击下方按钮预约直播,与作者一起来漫谈设计模式~~
双十一优惠中,快快抢购吧!
互动有奖
按以下方式与博文菌互动,即有机会获赠图书!
活动方式:在评论区留言参与“你想了解哪些关于设计模式的话题”等话题互动,届时会在参与的小伙伴中抽取1名幸运鹅赠送图书盲盒一份!
说明:留言区收到回复“恭喜中奖”者将免费获赠本图书,中奖者请在收到通知的24小时内将您的“姓名+电话+快递地址”留言至原评论下方处即可,隐私信息不会被放出,未在规定时间内回复视作自动放弃兑奖资格。
活动时间:截至10月28日开奖。
快快拉上你的小伙伴参与进来吧~~
温馨提示:可以将“博文视点”设为星标,以免错过赠书活动哦!
发布:刘恩惠
审核:陈歆懿
如果喜欢本文 欢迎 在看丨留言丨分享至朋友圈 三连 < PAST · 往期回顾 > 书单 | 10月新书速递!