文章分类 - 极客时间
摘要:前面我们讲到,重构可以分为大规模高层重构(简称“大型重构”)和小规模低层次重构(简称“小型重构”)。大型重构是对系统、模块、代码结构、类之间关系等顶层代码设计进行的重构。对于大型重构来说,今天我们重点讲解最有效的一个手段,那就是“解耦”。解耦的目的是实现代码高内聚、松耦合。关于解耦,我准备分下面三个
阅读全文
摘要:在上一节课中,我们对单元测试做了介绍,讲了“什么是单元测试?为什么要编写单元测试?如何编写单元测试?实践中单元测试为什么难贯彻执行?”这样几个问题。 实际上,写单元测试并不难,也不需要太多技巧,相反,写出可测试的代码反倒是件非常有挑战的事情。所以,今天,我们就再来聊一聊代码的可测试性,主要包括这样几
阅读全文
摘要:上一节课中,我们对“为什么要重构、到底重构什么、什么时候重构、该如何重构”,做了概括性介绍,强调了重构的重要性,希望你建立持续重构意识,将重构作为开发的一部分来执行。 据我了解,很多程序员对重构这种做法还是非常认同的,面对项目中的烂代码,也想重构一下,但又担心重构之后出问题,出力不讨好。确实,如果你
阅读全文
摘要:“重构”这个词对于大部分工程师来说都不陌生。不过,据我了解,大部分人都只是“听得多做得少”,真正进行过代码重构的人不多,而把持续重构作为开发的一部分的人,就更是少之又少了。 一方面,重构代码对一个工程师能力的要求,要比单纯写代码高得多。重构需要你能洞察出代码存在的坏味道或者设计上的不足,并且能合理、
阅读全文
摘要:在上一节课中,我们对计数器框架做了需求分析和粗略的模块划分。今天这节课,我们利用面向对象设计、实现方法,并结合之前学过的设计思想、设计原则来看一下,如何编写灵活、可扩展的、高质量的代码实现。 话不多说,现在就让我们正式开始今天的学习吧! 小步快跑、逐步迭代 在上一节课中,我们将整个框架分为数据采集、
阅读全文
摘要:上两节课中,我们讲了如何针对一个业务系统做需求分析、设计和实现,并且通过一个积分兑换系统的开发,实践了之前学过的一些设计原则。接下来的两节课,我们再结合一个支持各种统计规则的性能计数器项目,学习针对一个非业务的通用框架开发,如何来做需求分析、设计和实现,同时学习如何灵活应用各种设计原则。 话不多说,
阅读全文
摘要:上一节课中,我们讲了积分系统的需求分析和系统设计。今天,我们来讲它的代码实现。 上一节课中,我们把积分赚取和消费的渠道和规则的管理维护工作,划分到了上层系统中,所以,积分系统的功能变得非常简单。相应地,代码实现也比较简单。如果你有一定的项目开发经验,那实现这样一个系统,对你来说并不是件难事。 所以,
阅读全文
摘要:对于一个工程师来说,如果要追求长远发展,你就不能一直只把自己放在执行者的角色,不能只是一个代码实现者,你还要有独立负责一个系统的能力,能端到端(end to end)开发一个完整的系统。这其中的工作就包括:前期的需求沟通分析、中期的代码设计实现、后期的系统上线维护等。 前面我们还提到过,大部分工程师
阅读全文
摘要:今天,我们讲最后一个设计原则:迪米特法则。尽管它不像SOLID、KISS、DRY原则那样,人尽皆知,但它却非常实用。利用这个原则,能够帮我们实现代码的“高内聚、松耦合”。今天,我们就围绕下面几个问题,并结合两个代码实战案例,来深入地学习这个法则。 什么是“高内聚、松耦合”? 如何利用迪米特法则来实现
阅读全文
摘要:在上一节课中,我们讲了KISS原则和YAGNI原则,KISS原则可以说是人尽皆知。今天,我们再学习一个你肯定听过的原则,那就是DRY原则。它的英文描述为:Don’t Repeat Yourself。中文直译为:不要重复自己。将它应用在编程中,可以理解为:不要写重复的代码。 你可能会觉得,这条原则非常
阅读全文
摘要:上几节课中,我们学习了经典的SOLID原则。今天,我们讲两个设计原则:KISS原则和YAGNI原则。其中,KISS原则比较经典,耳熟能详,但YAGNI你可能没怎么听过,不过它理解起来也不难。 理解这两个原则时候,经常会有一个共同的问题,那就是,看一眼就感觉懂了,但深究的话,又有很多细节问题不是很清楚
阅读全文
摘要:关于SOLID原则,我们已经学过单一职责、开闭、里式替换、接口隔离这四个原则。今天,我们再来学习最后一个原则:依赖反转原则。在前面几节课中,我们讲到,单一职责原则和开闭原则的原理比较简单,但是,想要在实践中用好却比较难。而今天我们要讲到的依赖反转原则正好相反。这个原则用起来比较简单,但概念理解起来比
阅读全文
摘要:上几节课中,我们学习了SOLID原则中的单一职责原则、开闭原则和里式替换原则,今天我们学习第四个原则,接口隔离原则。它对应SOLID中的英文字母“I”。对于这个原则,最关键就是理解其中“接口”的含义。那针对“接口”,不同的理解方式,对应在原则上也有不同的解读方式。除此之外,接口隔离原则跟我们之前讲到
阅读全文
摘要:在上两节课中,我们学习了SOLID原则中的单一职责原则和开闭原则,这两个原则都比较重要,想要灵活应用也比较难,需要你在实践中多加练习、多加体会。今天,我们再来学习SOLID中的“L”对应的原则:里式替换原则。 整体上来讲,这个设计原则是比较简单、容易理解和掌握的。今天我主要通过几个反例,带你看看,哪
阅读全文
摘要:在上一节课中,我们学习了单一职责原则。今天,我们来学习SOLID中的第二个原则:开闭原则。我个人觉得,开闭原则是SOLID中最难理解、最难掌握,同时也是最有用的一条原则。 之所以说这条原则难理解,那是因为,“怎样的代码改动才被定义为‘扩展’?怎样的代码改动才被定义为‘修改’?怎么才算满足或违反‘开闭
阅读全文
摘要:上几节课中,我们介绍了面向对象相关的知识。从今天起,我们开始学习一些经典的设计原则,其中包括,SOLID、KISS、YAGNI、DRY、LOD等。 这些设计原则,从字面上理解,都不难。你一看就感觉懂了,一看就感觉掌握了,但真的用到项目中的时候,你会发现,“看懂”和“会用”是两回事,而“用好”更是难上
阅读全文
摘要:在上一节课中,针对接口鉴权功能的开发,我们讲了如何进行面向对象分析(OOA),也就是需求分析。实际上,需求定义清楚之后,这个问题就已经解决了一大半,这也是为什么我花了那么多篇幅来讲解需求分析。今天,我们再来看一下,针对面向对象分析产出的需求,如何来进行面向对象设计(OOD)和面向对象编程(OOP)。
阅读全文
摘要:面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程(OOP),是面向对象开发的三个主要环节。在前面的章节中,我对三者的讲解比较偏理论、偏概括性,目的是让你先有一个宏观的了解,知道什么是OOA、OOD、OOP。不过,光知道“是什么”是不够的,我们更重要的还是要知道“如何做”,也就是,如何进行
阅读全文
摘要:上一节课,我们做了一些理论知识的铺垫性讲解,讲到了两种开发模式,基于贫血模型的传统开发模式,以及基于充血模型的DDD开发模式。今天,我们正式进入实战环节,看如何分别用这两种开发模式,设计实现一个钱包系统。 话不多说,让我们正式开始今天的学习吧! 钱包业务背景介绍 很多具有支付、购买功能的应用(比如淘
阅读全文
摘要:在前面几节课中,我们学习了面向对象的一些理论知识,比如,面向对象四大特性、接口和抽象类、面向对象和面向过程编程风格、基于接口而非实现编程和多用组合少用继承设计思想等等。接下来,我们再用四节课的时间,通过两个更加贴近实战的项目来进一步学习,如何将这些理论应用到实际的软件开发中。 据我了解,大部分工程师
阅读全文