首页 > 其他分享 >单一职责 (设计模式)

单一职责 (设计模式)

时间:2024-02-27 11:12:19浏览次数:31  
标签:String private 我们 拆分 设计模式 单一 职责

定义

一个类或者模块只复杂完成一个职责。也就是说,不要设计大而全的类,要设计力度小,功能单一的类。一个类包含两个以上和业务不相干的功能,应该将他拆分多个功能更加单一,粒度更加细化的类。 

比如一个类力既含有订单的一些操作,又包含用户的一些操作,而订单和用户是两个独立的业务领域模型,我们将两个不相干的功能放到同一个类中,那就违反了单一原则。为了满足单一原则,我们需要将这个类分为两个粒度更细的类。: 订单类和用户类。 

如何判断类的职责是否单一

从刚刚的这个列子来看,单一职责看似不难应用,那是因为我举的例子,比较极端,一眼九年呢给看出订单和用户好不相干,但大部分情况下,类里的方法是否归为同一类,还归为不相关的两个功能,并不是那么容易判断。在真实的软件开发中,对于一个类是否职责单一的判断,很难拿捏。我们举一个贴近现实的例子。 

public class UserInfo {
 private long userId;
 private String username;
 private String email;
 private String telephone;
 private long createTime;
 private long lastLoginTime;
 private String avatarUrl;
 private String provinceOfAddress; // 省
 private String cityOfAddress; // 市
 private String regionOfAddress; // 区
 private String detailedAddress; // 详细地址
 // ... 省略其他属性和方法...
}

  

对于这个问题有两种不同的观点。一种观点是,UserINfo 类包含的都是跟用户相关的信息,所有的属性和方法都隶属于用户业务模型。满足单一模型;另一种观点在UserInfo 中,所赞的比重比较高,可以拆分为独立的userAddress ,UserInfo只保留Address 之外的其他信息。拆分之后两个类的职责更加单一

那种观点更对,实际上,要从中做出选择,我们不能脱离具体的应用场景。如果在这个社交产品中,用户的地址跟其他的信息一样,我们单纯的用来展示。那么UserInfo 的设计就是合理的。但是如果这个社交产品发展的非常好。之后又在产品中添加了电商模块,

用户的地址信息会在电商物流中,那么我们最好件该地址从UserInfo 中拆分出来。独立成用户的物流信息。 

我们在进一步延申,如果这个社交产品发展的越来越好,公司内部又开发出了更多其他产品,公司希望支持统一账号胸痛,也就是用户一个账号。可以在其他狄梵刚登陆。 这个时候,我们需要继续对UserInfo 进行拆分,比如email telephone 独立出来 。

从这个雷子,我们可以看出,不同的应用场景,不同的阶段的需求的背景下,对同一个类的职责的单一的判断,可能都不是一样的。 在某些长江活当下的需求背景下,一个类的设计可能满足了单一原则,但是换一个场景,可能就不满足了。 

 

除此之外,从不同的业务层去看待同一个类的设计,对类的单一原则也会又不同的认识,比如例子中的UserInfolei,我们从用户的层面来看,userInfo 包含的信息属于用户满足单一原则,如果我们从更细分的地址信息,登录认证信息,等等这些更细的粒度业务层面来看那么usreInfo 就应该继续拆分。 

综上所述,评价一个类的职责是否足够单一,我们并没有一个非常明确的、可以量化的标 准,可以说,这是件非常主观、仁者见仁智者见智的事情。实际上,在真正的软件开发中, 我们也没必要过于未雨绸缪,过度设计。所以,我们可以先写一个粗粒度的类,满足业务需 求。随着业务的发展,如果粗粒度的类越来越庞大,代码越来越多,这个时候,我们就可以 将这个粗粒度的类,拆分成几个更细粒度的类。这就是所谓的持续重构(后面的章节中我们 会讲到)。

现实中的判断标准,类中的代码行数,函数或属性过多,会影响代码的可读性和可维护性,我们就需要考虑对类进行拆分。 

类如果依赖饿其他类过多,或者依赖类的其他类过多,不符合低内聚,低耦合的设计思想,我们就要考虑对类进行拆分。

私有方法过多,我们烤炉是否可以件将私有方法独立到新的类中,设置为public ,供更多的类使用。 

比较难给类起一个合适的名字,很难用一个业务名称概况,或者用一些笼统的Manager Context 之类的名词命名,说民跟这个类的职责定义肯能不够清晰。

比如上边的UserInfo 又一半的内容都在操作Addresses 那么可以将他拆分出来。 

 

对于我们开发中,类的行数,不要超过200 ,函数的个数不要多余10 个。 

单一原则是不是越单一越好

为了满足单一职责原则,是不是把类拆得越细就越好呢?答案是否定的。我们还是通过一个 例子来解释一下。Serialization 类实现了一个简单协议的序列化和反序列功能,如果我们想让类的职责更加单一,我们对 Serialization 类进一步拆分,拆分成一个只负责 序列化工作的 Serializer 类和另一个只负责反序列化工作的 Deserializer 类。虽然经过拆分之后,Serializer 类和 Deserializer 类的职责更加单一了,但也随之带来了新 的问题。如果我们修改了协议的格式,数据标识从“UEUEUE”改为“DFDFDF”,或者序 列化方式从 JSON 改为了 XML,那 Serializer 类和 Deserializer 类都需要做相应的修改, 代码的内聚性显然没有原来 Serialization 高了。而且,如果我们仅仅对 Serializer 类做了 协议修改,而忘记了修改 Deserializer 类的代码,那就会导致序列化、反序列化不匹配, 程序运行出错,也就是说,拆分之后,代码的可维护性变差了。

 

标签:String,private,我们,拆分,设计模式,单一,职责
From: https://www.cnblogs.com/dousil/p/18036469

相关文章

  • 机器学习策略篇:详解单一数字评估指标(Single number evaluation metric)
    单一数字评估指标无论是调整超参数,或者是尝试不同的学习算法,或者在搭建机器学习系统时尝试不同手段,会发现,如果有一个单实数评估指标,进展会快得多,它可以快速告诉,新尝试的手段比之前的手段好还是差。所以当团队开始进行机器学习项目时,经常推荐他们为问题设置一个单实数评估指标。......
  • 面向对象,到底是个什么鬼? (设计模式)
    什么才算是面向对象编程语言面向对象是支持类对性得语法机制,并有现成得语法机制,能方便得实现面向对象得封装,继承多态,抽象。 一般来讲,面型对象编程,是通过面向对像得编程语言来进行得,但是不用面型对象编程语言,我们照样可以进行面向对象编程,反过来讲,即使我们使用面向像得语言写出......
  • 那些维度评价代码的好坏?设计模式
    1.可维护性对于项目来说,维护代码的耗时,远远大于大于代码的编码。代码维护性非常关键主观评价标准:bug容易修复,添加功能比较简单。2.可读性代码的可读性,关乎代码的可维护性。 代码是否符合代码的命名规范。 命名是否规范,注释是否全面,函数是否长短合适,模块划分是否清......
  • 类变量和类方法、代码块、单例设计模式、final关键字、抽象类、接口、内部类
    类变量和类方法类变量-提出问题说:有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?,编写程序解决。传统的方法来解决思路在main方法中定义一个变量count当一个小孩加入游戏后count++,最后个count就记录有多少小孩玩游戏小孩是一个类,有名字属......
  • 依赖注入(Dependency Injection, DI)是一种设计模式,例如,在React中,父组件可以通过props向
    依赖注入renderprops其实就是React世界中的“依赖注入”(DependencyInjection)。所谓依赖注入,指的是解决这样一个问题:逻辑A依赖于逻辑B,如果让A直接依赖于B,当然可行,但是A就没法做得通用了。依赖注入就是把B的逻辑以函数形式传递给A,A和B之间只需要对这个函数......
  • 设计模式行为型之观察者模式
    实验介绍本实验为大家介绍的是观察者模式,我们通过家长群的例子为大家仔细地梳理了这一模式的基本概念,帮助大家建立基本认识。虽然为大家介绍这一模式在前端热门框架VUE中的真实应用,并且还区分了观察者模式与发布订阅模式,帮助大家理清概念,相信通过本实验的学习,大家一定能对这一......
  • 设计模式行为型之策略模式
    实验介绍本实验为大家带来了策略模式,策略模式如果从定义上来看容易混乱,但其本身并不复杂。因此在一开始首先通过一个职级与区域划分差旅费用的实例为大家逐步展开策略模式的应用,通过这个实例就能很好的看到策略模式的应用方向。同时为大家指出了策略模式优点与缺点。在对应的情况......
  • 设计模式前言
    基本概念设计模式是什么?相信这是每一个同学在刚开始学习设计模式的时候都会存在的疑问,单单从名字上来看这确实会让人感觉是一门十分高大上的学问,但是真的是这样吗?答案当然是否定的。相反,设计模式十分的接地气,可以说它存在于我们生活中的方方面面。在《设计模式:可复用面向对象......
  • 设计模式结构型之装饰器模式
    实验介绍本实验主要为大家介绍设计模式中的装饰器模式。从装饰器的概念引入,详细的介绍了装饰器和装饰器的应用,帮助大家对其有一个深层的理解。随后提供了两个在实际开发过程中可能会遇到的真实场景,帮助大家建立装饰器模式在前端应用的直观印象。最后提供了使用装饰器时候需要注意......
  • 设计模式结构型之适配器模式
    实验介绍本节实验为大家带来了适配器模式,适配器模式是作为两个不兼容的接口之间的桥梁,可以将变化都封装于它本身,提供简单统一的接口使用。从一个有趣的例子开始为大家逐步的讲解适配器,帮助大家学习其基本的概念。随后为大家介绍了适配器在前端中的真实应用,加深对适配器的认识。最......