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

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

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

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

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

单一职责原则

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

开闭原则

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

里氏替换原则

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

依赖倒置原则

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

  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…

在c语言程序中将数据分为两种,2012年计算机二级C语言考点归纳汇总(一至四章)...

第1章程序设计基本概念考点归纳1.1 C语言的特点C语言是近年来非常流行的语言,很多人宁愿放弃已经熟悉的其他语言而改用C语言,其原因是C语言有优于其他语言的一系列特点。下面是C语言的主要特点:(1)语言简洁、紧凑,并且使用方便、灵…

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

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

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

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

redis 公网ip访问_Redis很重要,怎么只允许指定IP访问?

在 Linux 中安装了redis 服务,当在客户端通过远程连接的方式连接时,报could not connect错误。错误的原因很简单,就是没有连接上redis服务,由于redis采用的安全策略,默认会只准许本地访问。需要通过简单配置&#xff0…

HSRP的配置问题

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

Dotnet的垃圾回收

最近在做一个项目&#xff0c;用到了大量的非托管技术&#xff0c;所以垃圾回收变得很重要。在说垃圾回收之前&#xff0c;先说说两个概念&#xff1a;托管代码&#xff0c;是由CLR管理的代码非托管代码&#xff0c;是由操作系统直接执行的代码在早期C的时候&#xff0c;内存分…

c语言抬起按键,c语言获得键盘的按键

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼TC 2.0版#include#includeint main(){int key;while(1){keygetch();/*用于去掉第一个字节*/if(key27) break; /*如果是ESC退出*/if(key>31 && key<127) /*如果不是特殊键*/{printf("You have pressed %c Press …

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

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

行者运行脚本命令_行者脚本指令说明

例2:SellItem(返回卷轴[ID736],2;复活卷轴[ID737],3)例3:SellItem(*)卖出道具设定中设为"卖"的全部物品SaveItem(名字[IDx],数量)例1:SavelItem(返回卷轴[ID736],2)例2:SavelItem(返回卷轴[ID736],2;复活卷轴[ID737],3)例3:SavelItem(*)保存道具设定中设为"存&q…

史上最全最常用批处理260多个打包下载

请看这里转载于:https://blog.51cto.com/sunxuewei/281145

中南民族大学c语言报告,中南民族大学信C语言实验报告.doc

中南民族大学信C语言实验报告中南民族大学管理学院学生实验报告课程名称&#xff1a; C语言程序设计姓  名&#xff1a;微博song-style是坏学长学  号&#xff1a;年  级&#xff1a;  2011专  业&#xff1a;信息管理与信息系统指导教师&#xff1a;实验地点&#xff1…

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

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

CSRobot gen:mssql-c#类型映射

CSRobot的gen命令&#xff0c;有一个参数--map&#xff0c;是指数据库字段类型到实体类型映射&#xff0c;本例是sql server到csharp的类型映射&#xff1a;SQL ServerC#bigintInt64binaryByte[]bitBooleancharString&#xff0c;Char[]date DateTimedatetimeDateTimedatetime2…

2020项目商机_2020未来商机,一万元可以做什么项目

随着人们经济实力的增加&#xff0c;许多朋友都有开店的想法&#xff0c;但可能因为没有经验或者对市场不了解&#xff0c;不知道该开什么商店&#xff0c;所以今天我会和大家分享&#xff0c;在2020年开业前景很好?2020年有什么商业机会?1、动漫店如果你经常在社交网站上看到…

Oracle RAC 修改 IP 地址

RAC 修改IP 这个操作本身也只有几步操作&#xff0c; 但是它涉及到OCR。 所以要格外小心。一般来说&#xff0c;如果不是必须要修改的话&#xff0c;尽量不要去修改OCR 的东西。 稳定第一。 在做之前&#xff0c;要手动的OCR 进行一个备份&#xff0c; 这样即使修改失败&…

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

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

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

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

谷歌浏览器怎么长截图怎么截_电脑谷歌浏览器截长图方法详解

电脑谷歌浏览器截长图方法详解我们平时在浏览网页时&#xff0c;想把碰到好的网页内容或者文章截屏保存&#xff0c;但是网页的长度常常会超出屏幕高度&#xff0c;一般的截屏功能只能截取显示在屏幕上的内容&#xff0c;那我们该如何方便快捷截取全部内容&#xff1f;今天就分…