首页 > 其他分享 >设计原则

设计原则

时间:2023-05-09 11:14:38浏览次数:34  
标签:职责 原则 对象 子类 模式 设计 函数

一 单一职责原则

职责: 引起变化的原因
SRP原则:一个对象(方法)只做一件事

  • SRP原则的应用难点就是如何去分离职责

1 何时应该分离职责

并不是所有职责都应该一一分离

  1. 如果随着需求变化,职责总是同时变化的就不必分离

    创建xhr对象 & 发送xhr请求

  2. 职责的变化轴线仅当他们确定会发生变化时才有意义

    虽职责耦合,但无变化迹象也不必分离

2 SRP 原则的优缺点

优点

  • 降低了单个类或者对象的复杂度,按照职责把对象分解成更小的粒度,这有助于代码的复用,也有利于进行单元测试
  • 当一个职责需要变更的时候,不会影响到其他的职责

缺点

  • 会增加编写代码的复杂度
  • 也增大了对象之间相互联系的难度

3 违反单一职责原则

受设计原则的指导,但未必要在任何时候都一成不变地遵守原则

在方便性与稳定性之间要有一些取舍

  • jQuery 的 attr 是个非常庞大的方法,既负责赋值,又负责取值

    1. 这对于jQuery 的维护者来说,会带来一些困难
    2. 但对于 jQuery 的用户来说,却简化了用户的使用

二 最少知识原则

一个软件实体(类、模块、函数、变量)应当尽可能地减少与其他实体发生相互作用

1 减少对象之间的联系

  • 做法:引入第三方对象来承担对象之间的通信作用

缺点:可能会增加一些庞大到难以维护的第三者对象

2 封装在 LKP 原则中的体现

  • 数据的隐藏 -- 只暴露必要的接口
  • 限制变量的作用域

作用域尽可能小,对其它不相关模块的影响越小,变量被改写和发生冲突的机会越小

三 开放封闭原则

开放封闭原则是编写一个好程序的目标,其他设计原则都是达到这个目标的过程

思想:当需要改变一个程序的功能或者给这个程序增加新功能的时候,可以使用增加代码的方式,但是不允许改动程序的源代码

  • 软件实体(类、模块、函数、变量)应当是可扩展的,但是不可修改

1 怎么做

找出变化的地方

1. 放置挂钩
  • 在程序可能发生变化的地方放置一个挂钩,挂钩的返回结果决定程序的下一步走向
2. 使用回调函数
  • 把易于变化的逻辑封装在回调函数里,作为参数传入一个稳定和封闭的函数中

ajax异步获取用户信息后处理

function getUserInfo(callback) {
    $.ajax('http://xxx.com/getUserInfo', callback);
}
getUserInfo(data => {
    console.log(data.name);
    console.log(data.userId);
})

2 设计模式中的开放—封闭原则

发布订阅模式 模板方法模式 策略模式 代理模式 职责链模式

2.1 发布订阅模式

  • 降低多个对象之间的依赖关系
    • 取代对象之间硬编码的通知机制,一个对象不用再显式地调用另外一个对象的某个接口

当有新的订阅者时,发布者的代码不需要改动;改动发布者的代码时,不影响之前的订阅者

2.2 模板方法模式

通过封装变化来提高系统扩展性

  1. 在运用模板方法的程序中,子类的方法种类和执行顺序是不变的

    将这部分逻辑抽出来放到父类的模板方法里

  2. 子类的方法具体实现规则是可变的

    将这部分逻辑封装到子类中

  3. 通过增加新的子类,便能给系统增加新的功能

无需改动抽象父类及其它子类 -- 符合开放封闭原则

2.3 策略模式

大多数情况下,策略模式和模板方法是可以相互替换使用的

  • 模板方法基于继承的思想
  • 策略模式侧重于组合和委托

将各种算法都封装成单独的策略类,这些策略类可以被交换使用

策略和使用策略的客户代码可以分别独立进行修改而互不影响

2.4 代理模式

图片预加载

  1. 提供代理函数 proxyMyImage 负责图片预加载
  2. 之后将请求转交给 myImage 函数负责给图片设置 src

myImage不知晓代理的存在,专注于自己的职责

2.5 职责链模式

let order500 = function(orderType, pay, stock) {}
let order200 = function(orderType, pay, stock) {}
let orderNormal = function(orderType, pay, stock) {}
order500.setNextSuccessor(order200).setNextSuccessor(orderNormal);
order500.passRequest(1, true, 10); // 500 元定金预购,得到 100 优惠券

增加一个新类型的订单函数时,不需要改动原有的订单函数代码,只需要在链条中增加一个新的节点

3 开放—封闭原则的相对性

  1. 挑选出最容易发生变化的地方,然后构造抽象来封闭这些变化
  2. 在不可避免发生修改的时候,尽量修改那些相对容易修改的地方

    开源库: 修改它提供的配置文件,总比修改它的源代码来得简单

标签:职责,原则,对象,子类,模式,设计,函数
From: https://www.cnblogs.com/pleaseAnswer/p/17384223.html

相关文章

  • Java设计模式-代理模式
    简介代理模式是一种结构型设计模式,它可以让我们通过一个代理对象来访问一个真实的目标对象,从而实现对目标对象的功能扩展或保护。代理模式的主要角色有三个:抽象主题(Subject):定义了真实主题和代理主题的公共接口,使得在任何使用真实主题的地方都可以使用代理主题。真实主题(RealS......
  • BBS数据库表结构设计
    BBS数据库表结构设计在我们分析完一个项目的需求之后,我们着手开发项目所需要做的第一件事就是设计数据库的表结构及其字段。一般来说,设计一个数据库的表结构一般要注意以下三点:第一,把项目的需求转化为一个个数据库中的表第二,探寻表与表之间的关联关系第三,牢记以下原则:......
  • 软考中级软件设计师主观题详解
    软件设计题分析试题考察内容数据流图/DFD补充外部实体、数据存储、加工、数据流等数据库设计/ERE-R图关系模式主键/外键规范化理论增加实体UML建模类图用例图活动图等C语言算法C语法+数据结构Java/C++基础语法+设计模式备考策略前三题固定......
  • 以圆类Circle及立体图形类Solid为基础设计圆锥类Cone
    以点类Point及平面图形类Plane为基类公有派生圆类Circle,再以圆类Circle及立体图形类Solid为基类公有派生圆锥类Cone,main(void)函数完成对圆锥类Cone的测试。Point类结构说明: Point类的数据成员包括:①私有数据成员:X坐标x(double型),Y坐标y(double型)。Point类成员函数包括:①......
  • java基于ssm的求职招聘管理系统、校园求职招聘管理系统,附源码+数据库,适合毕业设计、课
    1、项目介绍​该求职招聘网站基于B/S架构,采用SSM框架,运用JSP网页开发技术,并结合MySQL数据库,为招聘者和求职者搭建了一个高效、便捷的网络招聘平台。系统总共有三个角色:求职者、招聘者、管理员​本系统分别为前台求职招聘和后台系统管理,功能如下:​1.前台求职招聘​前台首......
  • 编程打卡: C++ 语言程序设计
    编程打卡:C++语言程序设计#include<iostream>#include<array>usingnamespacestd;intmain(){intn;cin>>n;array<double,100000>scores;for(inti=0;i<n;i++){cin>>scores[i];}......
  • pta_【CPP0027】以圆类Circle及立体图形类Solid为基础设计球类Sphere
    #include<iostream>usingnamespacestd;//点类PointclassPoint{private:doublex;doubley;public:Point(doublexv=0,doubleyv=0);/*构造函数*/Point(constPoint&p);/*拷贝构造*/~Point();/*析构函数*/voidsetX(d......
  • Python设计模式面试题
    单例模式1请手写一个单例#encoding=utf8importthreadingimporttime#这里使用方法__new__来实现单例模式classSingleton(object):#抽象单例def__new__(cls,*args,**kw):ifnothasattr(cls,'_instance'):orig=super(Singleton,cls)......
  • 第三章-Java的基本程序设计结构
     3.1一个简单的Java语言程序 这是程序虽然很简单,但是所有的Java程序都具有这种结构,因此还是值得花一些时间来研究的。首先,Java区分大小写。如果出现了大小写拼写错误(例如:将main拼写成Main),程序将无法运行。下面逐行的查看这段源代码。关键字pubilc称为访问修饰符(accessmodi......
  • 33基于Java简单实现图书馆借书管理系统设计与实现
    本章节给大家介绍一个基于Java简单实现图书馆借书管理系统的设计与实现项目概述项目总体分为俩种角色,分别是管理员和阅读者,管理员可以登录系统中,进行图书管理,上架下架图书,对用户进行管理、对读者进行管理、查看借阅记录管理等,读者角色可以登录系统查询图书信息、借阅和归还图......