首页 > 其他分享 >七大设计原则(一)

七大设计原则(一)

时间:2024-04-06 21:44:05浏览次数:17  
标签:return 职责 原则 double oriPrice 七大 class 设计 public

一、单一职责原则

  单一职责原则指的是,在程序设计时,一个类或者一个接口的应该职责是唯一的。于此对应的,只有某种特定的原因,才能引起类或者接口的变动。单一职责原则要求我们不要设计大而全的接口,而是将其拆分为多个接口,每个接口只负责单一的职责。这样做有如下几个优点:

  • 容易复用。一个类设计的越臃肿,复用它的概率就越低,反之则越改。
  • 提升内聚性,降低耦合性。一个类承担的职责越多,那么相当于很多功能就被耦合到了一起,一个职责发生变动时,其他职责受到的影响也就越大。
  • 单一职责的接口容易维护,反之则不容易维护。

示例:

  为了查询查询NBA中球队的一些数据进行展示,需要开发一个程序,这个程序包含三个步骤,向数据库查询球队数据,对查回来的数据进行处理,展示数据。

  不符合单一职责原则的设计:

 1 class NBATeamDataDisplay
 2 {
 3     public:
 4         /* 向数据库查询数据*/
 5         void queryTeamData();
 6 
 7         /* 处理查回来的数据*/
 8         void handleTeamData();
 9 
10         /* 展示处理查回来的数据*/
11         void showTeamData();
12 }

  上面设计的这个类不符合单一职责原则,NBATeamDataDisplay这个类同时承担了查询数据,处理书籍,展示数据三个职责,三个职责耦合在一起,其中一个职责如果发生修改,这个类都会受影响,维护起来比较困难。

  符合单一职责原则的设计:

 1 class NBATeamDataQuery
 2 {
 3     public:
 4         /* 向数据库查询数据*/
 5         void queryTeamData();  
 6 }
 7 
 8 class NBATeamDataHandle
 9 {
10     public:
11         /* 向数据库查询数据*/
12         void handleTeamData();  
13 }
14 
15 class NBATeamDataDisplay
16 {
17     public:
18         /* 展示处理查回来的数据*/
19         void showTeamData();
20 }

  我们可以将最初NBATeamDataDisplay这个类拆分成NBATeamDataQuery, NBATeamDataHandle, NBATeamDataDisplay三个类,分别对应,查询,数据处理,展示三个功能,这样,三个不同功能被隔离开来,更容易维护。

   

二、开闭原则

  开闭原则是面向对象设计的第一基石,它指的是,系统设计应对扩展开发,对修改关闭。即对系统的改动应该尽量不涉及源码的改动。任意一个程序或软件,在开发的过程中,难免遇到需求变更的情况,这时应该尽量避免修改到原来的代码。因为修改意味着不确定性,在软件开发的过程中,要尽可能的消除不确定性,才能实现系统架构的稳定。

  在《设计模式的艺术》这本书中提到,要实现开闭原则,就需要对系统进行抽象化设计。可以为系统分为抽象层和实现层,这个抽象层相对稳定,描述对象一些共性的特征,而具体对象具体的具体行为,可以放到实现层中实现。

示例:

  有一家书店有一个图书管理系统,可以用这个系统管理售卖的书。当前书店正在搞活动,历史类的数据打八折,艺术类的书打八折。现在需要根据这个活动,对图书管理系统进行修改。

  不符合开闭原则的设计:

 1 // 修改前
 2 class bookManager
 3 {
 4     private:
 5         double oriPrice;
 6     public:
 7         double getPrice(std::string bookType)
 8         {
 9             return oriPrice;
10         }
11 }
12 // 修改后
13 class bookManager
14 {
15     private:
16         double oriPrice;
17     public:
18         double getPrice(std::string bookType)
19         {
20             if(bookType == "history")
21             {
22                 return 0.8*oriPrice;
23             }
24             else if(bookType == "act")
25             {
26                 return 0.7*oriPrice;
27             }
28             else
29             {
30                 return oriPrice;
31             }
32             
33         }
34 }

  上面这个代码是不符合开闭原则的,要修改历史和艺术类谁的售价,必须修改bookManger这个类的源码,这样,理论上所有用到bookManger这个类的代码都会收到影响。

    符合开闭原则的设计:

 1 //抽象的图书管理程序
 2 class bookManager
 3 {
 4     protected:
 5         double oriPrice;
 6     public:
 7         virtual double getPrice() = 0;
 8 };
 9 
10 //具体的图书管理程序
11 class normalBookManger:public bookManager
12 {
13     public:
14         double getPrice() override
15         {
16             return oriPrice;
17         }
18 };
19 
20 class historyBookManager:public bookManager
21 {
22     public:
23     double getPrice() override
24     {
25         return oriPrice*0.8;
26     }
27 };
28 
29 class actBookManager:public bookManager
30 {
31     public:
32     double getPrice() override
33     {
34         return oriPrice*0.7;
35     }
36 };

  上面这个设计中,将bookManger这个类提取出来,成为一个抽象的类,它的具体实现成了某一类具体书的管理器。这样,再实现新功能时,只需要新增两个类hsitoryBookManger和actBookManager两个新的实现,不会影响到原来的类normalBookManager,

减小了影响的范围。

标签:return,职责,原则,double,oriPrice,七大,class,设计,public
From: https://www.cnblogs.com/xyhj/p/18117763

相关文章

  • 【JavaWeb】Day32.MySQL概述——数据库设计-DDL(一)
    项目开发流程需求文档:    在我们开发一个项目或者项目当中的某个模块之前,会先会拿到产品经理给我们提供的页面原型及需求文档。设计:    拿到产品原型和需求文档之后,我们首先要做的不是编码,而是要先进行项目的设计,其中就包括概要设计、详细设计、接口设计、......
  • 从零开始的自定义神经网络设计
    目录第一部分:深度学习基础——深度学习简介前言一、深度学习的历史和重要性二、什么是神经网络?三、神经网络的基本组成部分四、基本术语和概念五、深入理解总结第一部分:深度学习基础——深度学习简介前言欢迎来到我们的从零开始的自定义神经网络设计系列!在这......
  • 前端使用 Konva 实现可视化设计器(2)
    作为继续创作的动力,继续求githubStar能超过50个(目前惨淡的0个),望多多支持。源码示例地址在上一章,实现了“无限画布”、“画布移动”、“网格背景”、“比例尺”、“定位缩放”,并简单叙述了它们实现的基本思路。关于位置和距离从源码里可以发现,多处依赖了Konva.Stag......
  • 基于ssm图书馆智能选座系统设计与实现
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频https://graduation-images.oss-cn-beijing.aliyuncs.com/videos/828%E5%A5%97ssm%E5%BD%95%E5%83%8F/10877_ssm720%E5%9B%BE%E4%B9%A6%E9%A6%86%E6%99%BA%E8%83%BD%E9%80%89%E5%BA%A7%E7%B3......
  • Node.js毕业设计基于的班委报名投票系统(Express+附源码)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的飞速发展,互联网已经深入到我们生活的各个角落,包括教育领域。在传统的班委选举中,通常采用纸质投票的方式,这种方式不仅浪费资源,而且效率低下,统......
  • Node.js毕业设计基于的OA办公系统的设计与实现(Express+附源码)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的飞速发展和互联网应用的普及,办公自动化(OA)系统已经成为企业、机构乃至政府部门不可或缺的工具。传统的手工办公方式效率低下、易出错且难以管......
  • 毅四捕Go设计模式笔记——桥接模式
    桥接模式(BridgePattern)桥接模式是一种结构型设计模式,它的主要目的是将抽象部分与它的实现部分解耦,使它们都可以独立的变化。通过使用组合而非继承的方式,桥接模式结合了两个独立的维度,让它们可以独立扩展而不是在两者之间建立静态的继承关系。为了解决什么问题?桥接模式解......
  • 接口自动化框架设计
    框架通用性:哪里都可以使用可扩展性:方便新增和修改功能可维护性:是否便于修改,适当封装但不能过度、分层设计(同一类型放一块)分层设计框架思路:1、写测试用例数据:test_data,存放excel2、测试用例文件:test_cases,写测试流程、业务流程、接口要干什么3、封装的工具类:tools,类似日志收......
  • 色彩在设计中的重要性
    色彩是设计中不可或缺的元素,它不仅可以影响人的情绪和心理状态,还可以在品牌识别、用户体验、文化差异和创意表达等方面发挥重要作用。在网站设计中,选择合适的色彩和色调可以帮助营造出符合品牌形象和目标受众喜好的氛围,增强用户的情感共鸣和认同感。本文将从心理学和情感影响......
  • 基于SpringBoot+Vue导师选择管理系统设计和实现(源码+LW+部署讲解)
    博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌主要内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs......