
设计模式
文章平均质量分 82
iblade
明年的某个时候,你会想着要是今天就行动了该多好!
展开
-
设计模式之美——20条编程技巧
如果在同一个项目中,不同的同事使用不同的缩进方式(空格缩进或 tab 键缩进),有可能会导致有的代码显示为两格缩进、有的代码显示为四格缩进。在类中,成员变量排在函数的前面。除此之外,成员变量之间或函数之间,还会按照作用域范围从大到小的顺序来排列,先写 public 成员变量或函数,然后是 protected 的,最后是 private 的。在类内部,成员变量与函数之间、静态成员变量与普通成员变量之间、函数之间,甚至成员变量之间,都可以通过添加空行的方式,让不同模块的代码之间的界限更加明确。原创 2022-11-24 23:29:33 · 945 阅读 · 1 评论 -
设计模式之美——解耦
除此之外,因为 open() 函数基于抽象而非具体的实现来定义,所以我们在改动 open() 函数的底层实现的时候,并不需要改动依赖它的上层代码,也符合我们前面提到的“高内聚、松耦合”代码的评判标准。不管是阅读代码还是修改代码,“高内聚、松耦合”的特性可以让我们聚焦在某一模块或类中,不需要了解太多其他模块或类的代码,让我们的焦点不至于过于发散,降低了阅读和修改代码的难度。而且,因为依赖关系简单,耦合小,修改代码不至于牵一发而动全身,代码改动比较集中,引入 bug 的风险也就减少了很多。原创 2022-11-24 23:00:41 · 1561 阅读 · 0 评论 -
设计模式之美——单元测试和代码可测性
单元测试由研发工程师自己来编写,用来测试自己写的代码的正确性。我们常常将它跟集成测试放到一块来对比。单元测试相对于集成测试(Integration Testing)来说,测试的粒度更小一些。集成测试的测试对象是整个系统或者某个功能模块,比如测试用户注册、登录功能是否正常,是一种端到端(end to end)的测试。而单元测试的测试对象是类或者函数,用来测试一个类和函数是否都按照预期的逻辑执行。这是代码层级的测试。原创 2022-11-24 22:49:18 · 1615 阅读 · 0 评论 -
设计模式之美——重构
一方面,重构代码对一个工程师能力的要求,要比单纯写代码高得多。重构需要你能洞察出代码存在的坏味道或者设计上的不足,并且能合理、熟练地利用设计思想、原则、模式、编程规范等理论知识解决这些问题。另一方面,很多工程师对为什么要重构、到底重构什么、什么时候重构、又该如何重构等相关问题理解不深,对重构没有系统性、全局性的认识,面对一堆烂代码,没有重构技巧的指导,只能想到哪改到哪,并不能全面地改善代码质量。原创 2022-11-24 20:45:07 · 1277 阅读 · 0 评论 -
设计模式之美——实战MVC的意义
对于一个工程师来说,如果要追求长远发展,你就不能一直只把自己放在执行者的角色,不能只是一个代码实现者,你还要有独立负责一个系统的能力,能端到端(end to end)开发一个完整的系统。这其中的工作就包括:前期的需求沟通分析、中期的代码设计实现、后期的系统上线维护等。大部分工程师都是做业务开发的。很多工程师都觉得,做业务开发没啥技术含量,没有成长,就是简单的 CRUD,翻译业务逻辑,根本用不上专栏中讲的设计原则、思想、模式。技术人也要有一些产品思维。对于产品设计、需求分析,我们要学会“借鉴”,一定不要自己闷原创 2022-11-24 20:24:27 · 1225 阅读 · 0 评论 -
设计模式之美——DRY原则 和 迪米特法则
尽管我们还是要往 DemoClass_1 的构造函数中,传入包含序列化和反序列化的 Serialization 实现类,但是,我们依赖的 Serializable 接口只包含序列化操作,DemoClass_1 无法使用 Serialization 类中的反序列化接口,对反序列化操作无感知,这也就符合了迪米特法则后半部分所说的“依赖有限接口”的要求。复用意识也非常重要。对于高度耦合的代码,当我们希望复用其中的一个功能,想把这个功能的代码抽取出来成为一个独立的模块、类或者函数的时候,往往会发现牵一发而动全身。原创 2022-11-24 16:57:33 · 1152 阅读 · 0 评论 -
设计模式之美——KISS、YAGNI原则
KISS 原则算是一个万金油类型的设计原则,可以应用在很多场景中。它不仅经常用来指导软件开发,还经常用来指导更加广泛的系统设计、产品设计等,比如,冰箱、建筑、iPhone 手机的设计等等。我们知道,代码的是衡量代码质量非常重要的两个标准。而 KISS 原则就是保持代码可读和可维护的重要手段。代码足够简单,也就意味着很容易读懂,bug 比较难隐藏。即便出现 bug,修复起来也比较简单。下面这三段代码可以实现同样一个功能:检查输入的字符串 ipAddress 是否是合法的 IP 地址。原创 2022-11-24 11:49:25 · 1195 阅读 · 0 评论 -
设计模式之美——依赖反转原则
依赖反转原则用起来比较简单,但概念理解起来比较难。原创 2022-11-23 23:58:27 · 962 阅读 · 0 评论 -
设计模式之美——里式替换原则 和 接口隔离原则
单一职责原则针对的是模块、类、接口的设计。但我们可以结合老师说的,判定职责是否单一,要懂得结合业务场景,业务需求,此方法,其实就是要通过JDK提供的CAS乐观自选锁(方法最终依赖硬件指令集原语,Compare And Swap)从“原语”这一词的含义看,其实也是同时、原子性地做了一件“完整”的事情,因此,考虑这一点,是可以判定它符合单一职责的。而这其实正是单一职责判定结果,往往见仁见智的原因:基于不同的角度,不同的立场,不同的业务理解,往往可以得到不同的判定结果,但不必纠结,判定过程中用到的思想才是精髓。原创 2022-11-23 23:21:59 · 1063 阅读 · 0 评论 -
设计模式之美——单一职责原则和开闭原则
看懂”和“会用”是两回事,而“用好”更是难上加难。SOLID 原则:SRP单一职责原则(the single responsibility principle )OCP开闭原则(the open closed principle)LSP里氏替换原则(the liskov substitution principle)ISP接口独立原则(the interface segregation principle)原创 2022-11-23 22:06:27 · 1457 阅读 · 0 评论 -
设计模式之美——DDD充血模式
领域驱动设计(Domain Driven Design,简称 DDD)基于贫血模型的传统开发模式,将数据与业务逻辑分离,违反了 OOP 的封装特性,实际上是一种面向过程的编程风格。但是,现在几乎所有的 Web 项目,都是基于这种贫血模型的开发模式,甚至连 Java Spring 框架的官方 demo,都是按照这种开发模式来编写的。面向过程编程风格有种种弊端,比如,数据和操作分离之后,数据本身的操作就不受限制了。任何代码都可以随意修改数据。原创 2022-11-23 18:14:26 · 1264 阅读 · 0 评论 -
设计模式之美——多组合少继承
组合优于继承,多用组合少用继承。原创 2022-11-23 17:18:55 · 1127 阅读 · 0 评论 -
设计模式之美——基于接口编程
将接口和实现相分离,**封装不稳定的实现,暴露稳定的接口**。上游系统面向接口而非实现编程,不依赖不稳定的实现细节,这样当实现发生变化的时候,上游系统的代码基本上不需要做改动,以此来降低代码间的耦合性,提高代码的扩展性。原创 2022-11-23 16:47:04 · 1043 阅读 · 0 评论 -
设计模式之美——接口VS抽象类
在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。比如,我们可以使用接口来实现面向对象的抽象特性、多态特性和基于接口而非实现的设计原则,使用抽象类来实现面向对象的继承特性和模板设计模式等等。原创 2022-11-23 16:27:13 · 809 阅读 · 0 评论 -
设计模式之美【总结】
尽管代码结构相似,但这 4 种设计模式的用意完全不同,也就是说要解决的问题、应用场景不同,这也是它们的主要区别。这里我就简单说一下它们之间的区别。代理、桥接、装饰器、适配器 4 种设计模式的区别代理、桥接、装饰器、适配器,这 4 种模式是比较常用的结构型设计模式。它们的代码结构非常相似。笼统来说,它们都可以称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类。原创 2022-10-27 21:29:49 · 871 阅读 · 1 评论 -
设计模式之美——封装,继承,多态的意义
What:隐藏信息,保护数据访问。How:暴露有限接口和属性,需要编程语言提供访问控制的语法。Why:提高代码可维护性;降低接口复杂度,提高类的易用性。原创 2022-10-29 19:32:23 · 1578 阅读 · 0 评论 -
设计模式之美——看似面向对象,实则面向过程
常见的编程范式或者说编程风格有三种,面向过程编程、面向对象编程、函数式编程,而面向对象编程又是这其中最主流的编程范式。现如今,大部分编程语言都是面向对象编程语言,大部分软件都是基于面向对象编程这种编程范式来开发的。总以为把所有代码都塞到类里,自然就是在进行面向对象编程了。实际上,这样的认识是不正确的。有时候,从表面上看似是面向对象编程风格的代码,从本质上看却是面向过程编程风格的。定义完类的属性之后,就顺手把这些属性的 getter、setter 方法都定义上。它违反了面向对象编程的封装特性。面向对象封装的定原创 2022-11-23 15:55:52 · 1141 阅读 · 0 评论