各位看官大大们,晚上好。好久不见,我想死你们了...

先说说写这个系列文章的背景:

工作了这么久了,每天都忙着写业务,好久没有好好静下心来好好总结总结了。正好这段时间公司组织设计模式的分享分,所以我才有机会在这里和大家唠唠嗑。

也许因为自己是小白自学的吧,所以磕磕绊绊走了好多弯路。所以我深刻的理解到在自学的时候有一个前辈在前面引路是多么重要。可以让你少走很多弯路。

拥有更高的学习效率。特别是在一些问题上,苦思冥想很久都没有结果,白白浪费了很多时间,也许有人点拨一下就能茅塞顿开。

有这么一句话说的:如果你想真正掌握某个知识,那就尝试把它教给别人吧。所以我苦思冥想了很久终于决定写一个系列的文章,是为了帮助别人也是为了提升自己。

好了话不多说,下面咋们上干货。

说道设计模式呢,我相信很多人都学习过。但是设计模式到底是什么呢?我相信每个人心中都有自己的答案,就像一千个人心中有一千个哈姆雷特。

那么他到底是什么呢?从字面意思来说,它就是代码设计时解决某些问题的套路。(哎...自古真情留不住唯有套路得人心啊。)

好了,看到这看官们就要问了,你这说的啥玩意,干货呢?尽在这扯玄学,这玩意到底应该怎么学习?

各位看官莫慌,下面就带大家进入设计模式的海洋。设计模式多不胜数,常见的设计模式就有23种(工作中我也只用到了代理模式,策略模式,单例模式,工厂模式和建造者模式)。

在学习他们之前,我们先要了解这些模式的设计思想,所谓知其然还要知其所以然。下面要讲到的就是设计模式的六大原则之单一职责原则。

单一职责原则(Single Responsibility Principle)简称SRP:

定义:There should never be more than one reason for a class to change(原文解释)

中文解释:应该有且仅有一个原因引起类或者方法的变更

单一职责原则的好处:

  1. 类的复杂性降低,实现什么职责都有清晰明确的定义。
  2. 复杂性降低也降低了出现问题的概率,并且提高了可读性和可维护性。
  3. 变更引起的风险降低,变更是不可避免的,如果接口的单一职责做得好,一个接口的修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助。

看到这的看官是不是准备开骂了。这他妈什么玩意,讲了半天,还是照本宣科。搞个锤子!

各位看官不要急,请往下看。

先请各位看一个类图:

各位看官大大有没有发现什么异常?

现在我来揭晓答案:

这是举例的是一个我工作中遇到的反面例子,这个抽象类和接口很明显的违反了单一职责原则。它包含了数据采集,解析,转换,清洗,映射,计算,保存等多种职责。

期初是为了方便开发,大家便绞尽脑汁封装了一个公共处理类供大家使用。开始项目初期数据来源少,并没有发生什么问题,大家也很满意。

但是(大家注意转折来了)随着项目的推进,数据来源、数据类型越来越多,随之而来的数据映射方式也越来越多。

为了适应各种映射方式大家开始在公共类中加入一些可以覆写的空方法,用子类继承公共类覆写某些方法来实现改变(这里使用的是模板设计模式)。

这也导致这个公共基类被频繁修改经常出现各种莫名其妙的bug,很多之前好的功能也会突然出现问题。而且后来方法越加越多,原先的方法也越来越长逻辑越来越难看懂,导致后面甚至都无法维护,

大家焦头烂额,最后只能推到从来重新划分职责细化方法。最后我们花费了大量的人力物力将之前的抽象类改造成了如下所示五个类:

AbstractDataCapture类:职责是数据采集 由它专门负责数据采集,该类包含主要抽象方法是数据采集方法(由具体子类自己实现)和一些辅助方法。

AbstractDataParser类:职责是数据解析,它专门负责数据解析,该类包含主要抽象方法是数据解析方法(由具体子类自己实现)和一些辅助方法。

AbstractDataCleansing类:职责是数据清洗,它专门负责数据转换成映射model类和清洗数据,该类包含主要抽象方法是数据转换方法和数据清洗方法(由具体子类自己实现)以及一些辅助方法。

AbstractDataHandler类:职责是数据处理,它专门负责数据处理,该类包含主要抽象方法是数据关系映射和数据的计算处理(由具体子类自己实现)以及一些辅助方法。

AbstractDataSave类:职责是数据持久化,该类包含主要方法是数据持久化方法(非抽象方法有公共实现)和一些辅助方法。

这是我实际经历的事情,这是一次血的教训。

 总结:

大家看了之后是不是像反思一下了,我以前的设计是不是有问题了?不,并不是这样的,不要怀疑自己。

原则本身是非常优秀的,但是现实有现实的难处,因为职责和变化因数难以被具体量化。

而且在日常开发中,我们还要考虑工期,成本,人员技术水平等等多种情况。原则是死的人事活的。

我们应该审视夺度,在适当的时候用适当的设计。我个人的意见是接口和方法设计一定要做到职责单一,类的设计尽量做到。

深入浅出系列第一篇(设计模式之单一职责原则)——从纯小白到Java开发的坎坷经历的更多相关文章

  1. 北风设计模式课程---单一职责原则(Single Responsibility Principle)

    北风设计模式课程---单一职责原则(Single Responsibility Principle) 一.总结 一句话总结: 一个类应该有且只有一个变化的原因:单一职责原则(SRP:Single Re ...

  2. 设计模式之单一职责原则(SRP)

    自己之前写过一些关于设计模式的博客,但是大部分都写得比较匆忙.现在正好趁年前有时间,笔者打算好好地整理一下自己这块知识结构.开篇的第一个原则就是设计原则里面最简单的一个原则--单一职责原则. 想必大家 ...

  3. 【设计模式】单一职责原则(SRP)

    单一职责原则是面向对象原则五大原则中最简单,也是最重要的一个原则, 他的字面定义如下: 单一职责原则(Single Responsibility Principle, SRP): 一个类只负责一个功能 ...

  4. 设计模式之单一职责原则(iOS开发,代码用Objective-C展示)

    单一职责原则:就一个类而言,应该只有一个引起它变化的原因. 在iOS开发中,我们会很自然的给一个类添加各种各样的功能,比如随便写一个简单的应用程序,一般都会生成一个viewController类,于是 ...

  5. JAVA设计模式之单一职责原则

    概念: 就一个类而言应该只有一个因其他变化的原因. 流程: 问题由来:设类或接口类C负责两个不同不同的职责:职责T1,职责T2.当由于职责T1需求改变进而需要修改类C时,可能导致职责T2收到不可预知的 ...

  6. C#设计模式系列:单一职责原则(Single Responsibility Principle)

    1.单一职责原则的核心思想 一个类应该有且只有一个变化的原因. 2.为什么要引入单一职责原则 单一职责原则将不同的职责分离到单独的类,每一个职责都是一个变化的中心.当需求变化时,这个变化将通过更改职责 ...

  7. C#软件设计——小话设计模式原则之:单一职责原则SRP

    前言:上篇C#软件设计——小话设计模式原则之:依赖倒置原则DIP简单介绍了下依赖倒置的由来以及使用,中间插了两篇WebApi的文章,这篇还是回归正题,继续来写写设计模式另一个重要的原则:单一职责原则. ...

  8. java设计模式学习笔记--单一职责原则

    单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...

  9. 深入学习jQuery选择器系列第一篇——基础选择器和层级选择器

    × 目录 [1]id选择器 [2]元素选择器 [3]类选择器[4]通配选择器[5]群组选择器[6]后代选择器[7]兄弟选择器 前面的话 选择器是jQuery的根基,在jQuery中,对事件处理.遍历D ...

随机推荐

  1. openstack Rocky 社区版部署1.3 安装OpenStack packages

    1 installing the Rocky release on all nodes. yum install centos-release-openstack-rocky 安装之后,会在/etc/ ...

  2. [CF1216E] Numerical Sequence hard version

    题目 The only difference between the easy and the hard versions is the maximum value of k. You are giv ...

  3. P4817 Fruit Feast G

    最开始拿到这道题的时候,题目中其实只规定了两种水果的饱食度,可以理解成价值或是重量,在不超过T的情况求最大值.第一眼看过去感觉就是装箱问题(背包),只不过这道题用的是完全背包,但是考虑到喝水的情况,做 ...

  4. 洛谷 P1196 【银河英雄传说】

    这道题其实就是一个带权并查集的基础题,维护的是点权,所以我们要维护两个数组dis:表示当前点到父亲节点的距离,size:当前子树的大小.那么程序就自然出来了: 代码: #include <bit ...

  5. Spring Cloud Alibaba基础教程:Nacos 生产级版本 0.8.0

    昨晚Nacos社区发布了第一个生产级版本:0.8.0.由于该版本除了Bug修复之外,还提供了几个生产管理非常重要的特性,所以觉得还是有必要写一篇讲讲这次升级,在后续的文章中也都将以0.8.0版本为基础 ...

  6. 使用SpringBoot构建REST服务-什么是REST服务

    前言: 本文按照Spring官网构建REST服务的步骤测试,可以得到结论: 到底什么样的风格才是RESTful风格呢? 1,约束请求命令如下: GET,获取资源.例如:/employees表示获取列表 ...

  7. Python3笔记006 - 2.3 变量

    第2章 python语言基础 python语法特点 保留字与标识符 变量 数据类型 运算符 输入和输出 2.3 变量 在python中,不需要先声明变量类型,直接赋值即可创建各种类型的变量. 1.定义 ...

  8. 从别人的代码中学习golang系列--02

    这篇博客还是整理从https://github.com/LyricTian/gin-admin 这个项目中学习的golang相关知识 作者在项目中使用了https://github.com/googl ...

  9. MySQL 索引结构 hash 有序数组

    MySQL 索引结构 hash 有序数组 除了最常见的树形索引结构,Hash索引也有它的独到之处.   Hash算法 Hash本身是一种函数,又被称为散列函数. 它的思路很简单:将key放在数组里,用 ...

  10. 微软全球资深副总裁对 VS Code 黑宝书的推荐序!VS Code 月活用户已达 1200 万!

    前不久,首本 VS Code 中文书终于问世了! 在本书出版之前,我很高兴能邀请到微软全球资深副总裁 Julia Liuson 为本书写推荐序!下面,我们就来看一下 Julia 所写的推荐序的完整内容 ...