广告
返回顶部
首页 > 资讯 > 前端开发 > html >为什么类的职责要单一化
  • 364
分享到

为什么类的职责要单一化

2024-04-02 19:04:59 364人浏览 八月长安
摘要

本篇内容主要讲解“为什么类的职责要单一化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“为什么类的职责要单一化”吧!单一职责原则一个类应该只有一个发生变化的原因开

本篇内容主要讲解“为什么类的职责要单一化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“为什么类的职责要单一化”吧!

单一职责原则

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

开闭原则

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

里氏替换原则

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

依赖倒置原则

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

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

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

接口隔离原则

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

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

谁的职责

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

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

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

单一真的容易吗

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

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

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

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

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

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

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

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

class UserBasicInfo {      //用户id     public 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要解决的问题之一。

拆分原则

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

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

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

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

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

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

到此,相信大家对“为什么类的职责要单一化”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 为什么类的职责要单一化

本文链接: https://www.lsjlt.com/news/83479.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 为什么类的职责要单一化
    本篇内容主要讲解“为什么类的职责要单一化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“为什么类的职责要单一化”吧!单一职责原则一个类应该只有一个发生变化的原因开...
    99+
    2022-10-19
  • python的单一职责原则怎么实现
    今天小编给大家分享一下python的单一职责原则怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一,封装封装是面向对象...
    99+
    2023-06-29
  • 什么实现Java项目中的单一职责原则
    这期内容当中小编将会给大家带来有关什么实现Java项目中的单一职责原则,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。问题由来:类T...
    99+
    2023-05-31
    java 单一职责原则 ava
  • C++单一职责原则的代码怎么写
    今天小编给大家分享一下C++单一职责原则的代码怎么写的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。单一职责原则:就一个类而言...
    99+
    2023-07-05
  • java设计模式的单一职责原则怎么实现
    这篇“java设计模式的单一职责原则怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java设计模式的单一职责原则怎么...
    99+
    2023-06-17
  • 探讨一下JS为什么提交表单前需要序列化
    Javascript是一种被广泛应用于web前端的编程语言。在web开发中,表单(form)提交是一个非常常见的操作,而在Javascript中,提交表单前通常需要序列化(serialize)表单数据。本文旨在探讨一下Javascript为...
    99+
    2023-05-14
  • 为什么Java单例模式一定要加 volatile
    目录1.volatile 作用1.1 内存可见性问题1.2 防止指令重排序2.为什么要用 volatile?总结前言: 单例模式的实现方法有很多种,如饿汉模式、懒汉模式、静态内部类和...
    99+
    2022-11-13
  • springboot jpaRepository为什么一定要对Entity序列化
    这篇文章主要介绍“springboot jpaRepository为什么一定要对Entity序列化”,在日常操作中,相信很多人在springboot jpaRepository为什么一定要对Entity序列化问题上存在疑...
    99+
    2023-06-21
  • java项目中的实体类为什么需要实现序列化
    这篇文章给大家介绍java项目中的实体类为什么需要实现序列化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。当客户端访问某个能开启会话功能的资源,web服务器就会创建一个HTTPSession对象,每个HTTPSessi...
    99+
    2023-05-31
    java 实体类 序列化
  • Java中的实体类为什么要 implements Serializable?
    1. 序列化和反序列化 首先来解释一下什么是序列化和反序列化: 序列化:把对象转换为字节序列的过程称为对象的序列化。反序列化:把字节序列恢复为对象的过程称为对象的反序列化。 在 Java 和其他语言进行通信的时候,需要将对象转化成一种通用的...
    99+
    2023-09-02
    java json 序列化和反序列化 Serialzable
  • 为什么mybatis中的SqlSession一定要关闭
    目录mybatis的SqlSession一定要关闭快的情况慢的情况mybatis中SqlSession使用事项一.SqlSession的使用范围二.SqlSessionFactory...
    99+
    2022-11-12
  • Java单例一定要加volatile的原因是什么
    这篇文章主要介绍“Java单例一定要加volatile的原因是什么”,在日常操作中,相信很多人在Java单例一定要加volatile的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java单例一定要...
    99+
    2023-06-30
  • 为什么Go语言中的Windows数据类型如此重要?
    在Windows系统中,数据类型是非常重要的。这是因为Windows系统使用了许多特定的数据类型来处理各种不同的数据。在Go语言中,同样也有许多特定的数据类型可以用来处理Windows系统中的数据。本文将介绍为什么在Go语言中使用Wind...
    99+
    2023-09-12
    windows 数据类型 关键字
  • 云服务器虚拟化是一种成本结构对吗为什么这么重要
    云服务器虚拟化技术的优点有很多,其中最为突出的就是提高了服务器的可用性和可扩展性。通过云服务器虚拟化,用户可以将多个物理服务器虚拟成一个逻辑服务器,从而实现了更加灵活的IT架构,并且可以在一个云服务器上部署多个应用程序。同时,云服务器虚拟化...
    99+
    2023-10-28
    是一种 成本 结构
  • 为什么数字化转型不仅需要技术,也需要人的改变?
    事实证明,在一个大型企业中,数字化转型是不可能的。因为传统的中层管理人员会尽其所能地抵制任何对现状的改变。缺乏文化变革通常不会带来有意义的进展。根据Gartner的说法,积极主动和适应性文化是一项关键资产,一些CIO可能会在其企业内建立正确...
    99+
    2023-06-03
  • Android组件化架构开发--为什么要使用组件化?组件分层?组件路由的简单实现。
    文章目录 android组件化架构开发一.为什么要使用组件化1.1 单工程项目结构1.2 什么是组件化 二. 组件分层三. 组件化项目搭建流程3.1 创建业务组件3.2 创建基础组件3....
    99+
    2023-08-31
    android 架构
  • 为什么并发是ASP和LeetCode路径上的一个重要问题?
    随着互联网的普及,人们对于网站的访问量和响应速度要求越来越高,这也使得网站的并发处理成为了一个非常重要的问题。ASP和LeetCode是两个截然不同的领域,但是它们都需要考虑并发的影响。 ASP是一种动态网页开发技术,它可以将HTML和服...
    99+
    2023-09-21
    path leetcode 并发
  • 一文了解mysql索引的数据结构为什么要用B+树
    目录1. Hash表?No2. 二叉查找树(BST)?No3. 红黑树?No4. 平衡二叉树(AVL)?差那么二点意思5. B-tree(B-树也称B树)?差那么一点意思6. B+树...
    99+
    2022-11-13
  • 详解为什么现代系统需要一个新的编程模型
    目录为什么现代系统需要一个新的编程模型?封装的挑战现代计算机体系结构中共享内存的错觉一个调用栈的错觉【总结】为什么现代系统需要一个新的编程模型? Actor模型作为一种高性能网络中的...
    99+
    2022-11-12
  • 为什么Java中的重定向日志接口是一种必要的工具?
    在Java中,日志是一个非常重要的概念。它可以帮助我们更好地了解应用程序的运行情况,发现并修复潜在的问题。而重定向日志接口则是日志处理中的一个重要工具,它可以将日志信息输出到指定的地方,方便我们进行查看和分析。 那么,为什么Java中的重...
    99+
    2023-11-05
    重定向 日志 接口
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作