程序员过关斩将--领导说我的类的职责不单一

为什么类的职责要单一化?

类的职责单一化很容易吗?

首先,我要提醒一下看到这篇文章的同学,我认为保证类(一定是类吗?)的单一职责并不容易

软件开发过程中,自古就流传着几大规则,无论如何这里都要和大家阐述一遍

单一职责原则

一个类应该只有一个发生变化的原因

开闭原则

软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。这个原则是诸多面向对象编程原则中最抽象、最难理解的一个。

里氏替换原则

所有引用基类的地方必须能透明地使用其子类的对象,换句话说,子类在任何引用基类的地方都可以替换成子类。

依赖倒置原则

这个原则说的详细一点其实可以概括为两点:

  1. 高层模块不应该直接依赖于底层模块,应该依赖于抽象

  2. 抽象不应该依赖于具体实现,具体实现应该依赖于抽象

接口隔离原则

程序不依赖于不使用的接口,换句话说,一个程序只依赖于它需要的接口。

单纯从概念上讲呢,单一职责原则可算是最简单易懂的一种原则了,就像设计模式中的单例模式一样无趣,是这样吗?

谁的职责

说实话,看过不少讲解“职责单一”设计原则的文章,都是以类来阐述。其实我觉得不对,职责单一设计原则本质上是软件设计原则的一种思想,具有指导意义。至于谁的职责需要单一,是一个伪命题,不仅仅指面向对象编程中的类,系统的模块,甚至于微服务在架构设计中也应该遵循此规则。

在面向对象设计的理解中,程序最基本的组成单位是类(class),多个类组成模块(module),多个模块组成服务(service),多个服务组成系统(system),一般的软件系统都会存在以上几个概念。

无论是类,还是模块,还是服务,还是系统,我认为设计的时候都要保证“单一职责”。

单一真的容易吗

说到“单一”职责,每个人都有不同的看法

class UserInfo
{//用户idpublic int UserId{get ;set ;}//用户登录账号public string Account{get;set ;}//用户登录密码public string Pwd{get ;set;}//用户姓名public string Name{get ;set ;}}

以上是最常见的用户信息实体,你认为它职责单一吗?说一说,我自己的看法:

站在用户信息的角度来说,这个类代表的是用户信息,它就是单一的,这也是大多数人的看法,有错吗?其实没错。因为在当前场景下,它确实是这样。

随着业务的发展,用户的信息字段会越来越多,比如:用户的年龄,性别,学历....等等。看着越来越大的UserInfo类,是否该拆分呢?

这个时候我觉得你可以根据用户信息的类型来进行拆分,毕竟大而全的类其实并不好。怎么拆分呢?比如:可以根据用户登录场景拆分出用户认证的类型

class UserAuth
{//用户idpublic int UserId{get ;set ;}//用户登录账号public string Account{get;set ;}//用户登录密码public string Pwd{get ;set;}
}

可以根据用户信息在系统中的出现频率和重要度拆分出用户基本信息和用户扩展信息

class UserBasicInfo
{//用户idpublic int UserId{get ;set ;}//用户姓名public string Name{get ;set ;}//用户手机号public string Phone{get ;set ;}//其他基本属性
}
class UserExtendnfo
{    //用户邮箱public string Email{get ;set ;}//用户QQ号public string QQ{get ;set ;}//其他属性
}

当然这里我只是举个栗子,如果用户的Email和手机号一样常用,可以把Email属性提到基本属性中。

以上只是以用户信息为例,根据不同的用途进行拆分的一个栗子。在不同的业务背景下,不同的业务阶段,对同一个类的拆分可能会有很大不同。有的时候,你所认为的"正确“会随着系统的发展慢慢变成”错误“,当然这种”错误“并不可怕,毕竟系统的架构都是慢慢迭代出来的。

总之呢,评价一个类是否一定满足单一原则,并没有一个统一标准和规范,在实际的开发中,也没有必要进行过度设计,在项目初级,完全可以是一个满足业务需求的大而全的类,随着业务的发展,你必然会经历拆分的过程,这也是软件发展的必然阶段。

以上只是针对类这个最基本的面向对象单位来聊了聊,上升到模块以及系统也是一样的道理,微服务也是随着软件开发的不断演进而出现的,其实从职责上来看,微服务也是职责单一原则的产物,而这个这则单一更多的是倾向于业务单一性,并非功能单一性。

那职责拆分的越细越好吗?我不这么认为,当一个类或者模块甚至系统,被拆分过细的时候,就会面临着维护的问题,拿微服务来说,当微服务的数量过多,就会面临着治理等一系列问题,这也是K8s要解决的问题之一。

拆分原则

说到底,虽然职责单一很难在主观上给予准确判断,但是还是有一些通用规则可以借鉴,这里以类为例

  • 高内聚。系统在修改任一功能的时候,只需要修改一处地方,如果你需要修改多处才能满足某个需求,很有可能你的职责划分的不合理

  • 属性过多。当一个类属性过多的时候,可以考虑把这个类进行职责的拆分。而至于多少个才算多呢?当查找某个属性令你头疼的时候,说明已经到了可以拆分的程度了(自己杜撰)

  • 依赖过多。当一个类型中依赖的资源过多的时候,可以进行拆分

  • 独立变化。当一个类的某些属性被大量使用而且会经常变化的时候,可以考虑把这些属性进行拆分成独立的类。

说到职责单一,这里顺便提一下接口的设计,接口的设计更要遵循职责单一的原则,接口本质上是对业务的抽象,不同的业务应该抽象成不同的接口,以保证每个类,每个模块,每个系统都可以独立扩展。

论系统设计的高可扩展性

写在最后

没有绝对好的方法可以让所有人都认为你的拆分是正确的“职责单一”,有的时候,怎么样才能职责单一真是要靠“灵感”

面试官扎心一问:数据量很大,分页查询很慢,有什么优化方案?


吊打MySQL,MariaDB到底强在哪?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从概念到案例,机器学习应该掌握的20个知识点

随着科技的发展,计算机对人类的生产活动和社会活动产生了极为重要的影响,同时以强大的生命力飞速发展着。目前计算机正广泛用于社会各个领域,并朝着微型化、网络化、智能化和巨型化的方向前进。说到智能化,大家最先想到的应该就是…

闲来没事写个记事本玩玩!!!

这两天工作压力大,还好今天见着太阳了,这会儿没事写了个记事本,功能单一,适合练手,可能对新手会有所帮助,贴上来看看吧, 说到实现 记事本,我们应该选择什么样的控件呢,Te…

LG将授权webOS给其他电视厂商使用

喜欢就关注我们吧!LG 将向其他公司提供 webOS。根据 LG 发布的公告,其自家电视机搭载的专有系统 webOS 将会授权给其他的外部电视厂商使用。被授权使用 webOS 的电视厂商还会获得来自 LG 的 Magic Motion 遥控器,此外,系统的语音控…

数据之美,堪比好莱坞大片!

看完下面的几张图,你就知道自己有多无知了。堪称是好莱坞大片啊!1城市3D空间通过2D瓦片图层的3D化,能够在经度维度、量级、时间多个维度上真实还原城市3D空间。例子中为模拟的轨迹数据和旧金山食物供应商分布。2GPS轨迹分布以三种不同的方式描…

HSRP的配置问题

HSRP的配置问题<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />实验目的&#xff1a;理解和掌握路由热备份的配置步骤和原理实现网关的冗余功能实验环境&#xff1a;如下图所示<?xml:namespace prefix v ns "urn:sch…

数学从小学开始“梯次掉队”?别让课本的枯燥“浇灭”孩子对数学的兴趣

1、2、3、4、5……从孩子用手指数数开始&#xff0c;就与数学结下了不解之缘。进入幼儿园&#xff0c;在老师的指导下画出三角形&#xff0c;圆形等&#xff0c;这是数学中的几何。稍大一点&#xff0c;到商店里买东西&#xff0c;开始懂得买的东西是多还是少&#xff0c;是大还…

用算法撩妹都不会,别跟我说你是程序员

程序员浪漫的表白方式可以说是花样百出&#xff0c;为什么用在自己身上就没效果呢&#xff1f;作为一个程序员“身边的女生”&#xff0c;小编觉得&#xff0c;大部分程序员没有女朋友&#xff0c;很可能是恋爱技能bug太多&#xff0c;当你还不确定那个女生对你的喜欢程度&…

从工作经历和实践理论看工业互联网的发展

一.前言本篇文章是对以前点点滴滴的记录整理而成&#xff0c;也是我们做iNeuOS工业互联网操作系统进行的深入思考。本篇文章有宣传产品之嫌&#xff0c;但是确实是我们理念与实践相结合的产物。下面的图是我2017年参加完工博会后&#xff0c;在QQ群里做的调查&#xff0c;仅供大…

关于c语言的符号常量以下叙述中正确的是,关于C语言的符号常量,以下叙述中正确的是...

摘要&#xff1a;项指需要哪一以下标不上报&#xff0c;关于女病工作普查普治评价进行对妇时。下列正确的是说法&#xff0c;符号治愈率达&#xff0c;告说治疗者某广某药斑狼了2例红疮患&#xff0c;其中痊愈0例。行为个体这种矫正称为方法&#xff0c;常量吸烟济处烟者予经当…

2017年终奖发放,程序员人均11776元排名第一!

又到了一年一度的“晒年终奖”时刻了&#xff01;你敢晒一波吗&#xff1f;快过年了&#xff0c;又到了一年一度的年终奖盘点时间&#xff01;此可谓扎心扎心再扎心&#xff01;那么&#xff0c;你2017年的年终奖有多少&#xff1f;满意不&#xff1f;2017年全国白领人均年终奖…

因MemoryCache闹了个笑话

前言是这么一回事&#xff1a;我正在苦思一个业务逻辑&#xff0c;捋着我还剩不多的秀发&#xff0c;一时陷入冥想中……突然聊天图标一顿猛闪&#xff0c;打开一看&#xff0c;有同事语音&#xff1b;大概意思是&#xff1a;同事把项目中Redis部分缓存换成MemoryCache/Memcach…

Coursera吴恩达《卷积神经网络》课程笔记(1)-- 卷积神经网络基础

推荐阅读时间&#xff1a;8min~15min主要内容&#xff1a;卷积神经网络《Convolutional Neural Networks》是Andrw Ng深度学习专项课程中的第四门课。这门课主要介绍卷积神经网络&#xff08;CNN&#xff09;的基本概念、模型和具体应用。该门课共有4周课时&#xff0c;所以我将…

纯c语言实现的改进暗通道去雾算法测试程序(附赠大量测试图像),基于改进暗通道先验算法的图像去雾...

邱清辉摘要&#xff1a;针对普通暗通道先验算法去雾能力的不足&#xff0c;本文提出了一种改进算法&#xff0c;通过采用高斯平滑将原图像分为基础子图和细节子图&#xff0c;基础子图采用暗通道先验算法&#xff0c;细节子图采用gamma变换方法&#xff0c;再采用图像融合进行融…

为什么离开学校后,学习能力直线下降?

最近几年&#xff0c;人工智能浪潮层层推进&#xff0c;对各大科技公司产生巨大影响。百度推出Apollo无人车计划&#xff0c;阿里建立达摩院&#xff0c;腾讯成立的AI Lab虽布局较晚却也不甘人后。ChinaAI已是大势所趋&#xff0c;吸引的不仅是大公司&#xff0c;更有许多人工智…

android6.0重力工具箱,重力工具箱 GravityBox For Android8.0/8.1(Oreo)稳定版发布!

作为功能最强大的Xposed框架模块之一&#xff0c;重力工具箱 GravityBox的更新适配一直也是最积极的&#xff0c;本次发布的8.x专用版本也算是比较及时&#xff0c;每一个大的Android版本&#xff0c;重力工具箱基本都会有一个专门的版本来适配&#xff0c;当然基础功能也会略有…

如何在 ASP.Net Core 中使用 MediatR

MediatR 是一个 中介者模式 的.NET开源实现&#xff0c; 中介者模式 管控了一组对象之间的相互通讯并有效的减少了对象之间错综复杂的相互依赖&#xff0c;在 中介者模式 中&#xff0c;一个对象不需要直接和另一个对象进行通讯&#xff0c;而是通过 中介者 进行转达&#xff0…

全球100款大数据工具汇总(前50款)

01 Talend Open Studio是第一家针对的数据集成工具市场的ETL(数据的提取Extract、传输Transform、载入Load)开源软件供应商。Talend的下载量已超过200万人次&#xff0c;其开源软件提供了数据整合功能。其用户包括美国国际集团&#xff08;AIG&#xff09;、康卡斯特、电子港湾…

NLP快速入门:手把手教你用HanLP做中文分词

导读&#xff1a;随着自然语言处理(Natural Language Processing, NLP)技术日趋成熟&#xff0c;实现中文分词的工具也越来越多。中文分词技术作为中文自然语言处理的第一项核心技术&#xff0c;是众多上层任务的首要基础工作&#xff0c;同时在日常的工作中起着基础性的作用。…

动态内存(Dynamic Memory),微软的内存过量分配技术?

Hyper-V不支持Memory Overcommitment&#xff0c;一直为VMware和其他虚拟化厂商所诟病。当然&#xff0c;微软一直不承认这是他们的软肋&#xff0c;认为为了保证生产环境VM的性能&#xff0c;过量分配内存是不合时宜的。但是&#xff0c;微软的态度似乎突然转变&#xff0c;3月…

程序员上帝视角解读“旅行青蛙”,你的呱真的在旅行嘛?

来源&#xff1a;知乎作者&#xff1a;黄小秋原文链接&#xff1a;https://www.zhihu.com/question/68733553/answer/305463907导语&#xff1a;知乎有位程序员大佬&#xff0c;为了让老母亲老父亲们理解自己的呱究竟在干什么&#xff0c;于是花了五个晚上逆向游戏程序逻辑&…