程序开发设计原则

news2025/7/27 22:01:09
(图片来自网络)
单一职责 Single Responsibility Principle

  不论是在设计类,接口还是方法,单一职责都会处处体现,单一职责的定义:我们把职责定义为系统变化的原因。所有在定 义类,接口,方法的时候。定义完以后再去想一想是不能多于一个的动机去改变这个类,接口,方法。如果答案是肯定的,说明定义的类,接口,方法则多于一个职 责。故违背单一职责,遇到这种情况应该重新细分职责,直到不会出现多种职责的类,接口方法为止(发现职责,并把那些职责相互分离)。单一职责的为最简单的 五种原则之一。在软件设计的过程中处处体现。无处不在。

        开发过程中如果发现类过大,接口方法过多时,大部分情况下是类或接口设计不满足单一职责设计。将业务代码写成了流程式实现。一般情况下需要将类中的过大方法在单一职责的前提下重构成小一些的方法。然后考虑这些方法的职责是否是属于当前类对象,如果不是则考虑是否应该存在其他类实现该行为。以多个类协作方式完成业务代码

开闭原则 Open Closed Principle

  开闭原则是指类、模块、方法是可以扩展的,但不可以 修改。开即对扩张开放,闭即对修改关闭。开闭原则的应用体现在,开发人员应该仅仅对程序中频繁出现变化的地方进行抽象(封装变化点)。对变化点的封装即对 变化的修改关闭。对于变化的不确定性,可随时扩展。即 继承的使用。抽象类的运用。

       面向对象特种是继承,封装,多态,个人觉得此设计模式主要是体现封装特点。可以通过简答工厂设计来体会开闭原则。

替换原则(Is-A) Liskov Substitution Principle

  替换原则即是总是保证子类可以替换它的基类。

       替换原则的实现。对于一组具有类似属性,方法,变量的类。我们可以提取公共属性,方法,变量做为一个基类(抽象类或者类),使这一组类继承基类,重写虚 方法。现在这些继承的类和基类的关系符合Is-A。如基类为鸟,则继承类可以为麻雀,燕子。我们可以说麻雀Is-A鸟,燕子Is-A鸟。

  在项目中所有使用子类的地方都可用父类替换,但在调用方法的时候 ,即呈现面向对象编程的多态性。即替换原则,非常重要的原则,也是比较对难的原则。

依赖倒置原则 Dependency Inversion Principle
  •   高层模块不应该依赖于低层模块。二者都应该依赖于抽象
  •   抽象不应该依赖于细节。细节应该依赖于抽象。

      在面向过程的开发语言中分析和设计,总是创建一些高层模块去调用低层模块、策略依赖于细节的软件结构。实际上这种方法的目的就是要定义子程序层次结构,该 结构 描述了高层模块怎样调用低层模块。而设计良好的面向对象的程序,正好“倒置”了这种依赖关系。高层模块不再依赖于低层模块,从而低层模块的修改不会影响到 高层模块,并且高层模块也是能非常容易的被重用,高层模块和低层模块都影响都依赖于抽象。这样也非常符合强内聚松耦合的编程思想。故该原则也是框架设计的 核心原则。

      使用传统的过程化程序设计所创建出来的依赖关系结构,策略是依赖于细节的,这是糟糕的,因为这样会使策略受到细节改变的影响,面向对象的程序设计倒置了依赖关系结构,全程细节和策略都依赖抽象,并且常常是客户程序拥有服务接口。

      事实上,这种依赖关系的倒置正是好的面向对象设计 的标志所在,使用何种语言来编写程序是无关紧要的。如果程序的依赖关系是倒置的,它就是面向对象的设计。如果程序的依赖关系不是倒置的,它就是过程化的设计。

      依赖倒置原则是实现许多面向对象技术所宣称的好处的基本低层机制。它的正确应用对于创建可重用的框架来说是必需的。同时它对于构建在变化面前富有弹性的代码也是非常重要的,由于抽象和细节彼此隔离,所以代码也非常容易维护。

        Spring 以“依赖注入”的方式实现了“控制反转"的效果,以便符合软件工程中“依赖倒置”原则。

接口隔离原则 Interface Segregation Principle

        应该说该原则是处理现有“胖”接口所存在的缺点。如果类的接口不是内聚的,就表示该类具有“胖”接口。换句话说“胖”接口可以分解成多组方法。每一组方法 都服务于一组不同的客户程序。这样,量引客户程序可以使用一组成员函数,而其他客户程序可以使用其他组的成员函数。

        接口隔离的方法有两种(分享客户就是分离接口):

  • 使用委托(此委托非.net委托[delegate])分离接口使用委托即,创建一个委托类,用此类去实现分离后的其它接口中的方法。
  •   使用多重继承分离接口、 此方法,即将现有“胖”接口分成供不同客户程序调用的两个或多个接口,而需要实现多个接口的客户程序,则使用多重继承来实现。

    这两种方法是实现接口隔离的全部方法,其中第二种方法使用较普遍,也比较简单。而第一种方法使用起来相对比较复杂,而且在使用委托的过程中也会产生重 复的对象,则占用运行时间和内存开销。有的时候第二种方法是必须的,第一种方法是不能使用的。如:利用委托对象所做的转换是必需的,或者不同的时候会需要 不同的转换。

封装变化

封装将属性私有化,提供公有方法访问私有属性,

封装的本质就是让类的调用者不必清楚地了解类的实现者是如何实现类的,只要知道如何使用类就行了。这样就降低了类调用者的学习和使用成本,从而降低了复杂程度。

  • 封装之后,对于那个事物来说,看不到这个事物比较复杂的那一面,只能看到该事物简单的那一面。复杂性封装,对外提供简单的操作入口。
  • 封装之后才会形成真正的“对象”,真正的独立体”
  • 封装就意味着以后的程序可以重复使用。并且这个事物应该适应性比较强,在任何场合都可以使用。
  • 封装之后,对于事物本身,提高了安全性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1156665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CV2 将图片中某个点与中心点的角度变换成0-360度

众所周知,CV2中的坐标方向是这样的: 所以一般我们想计算图片中某个点P1(x1,y1)与中心点P0(x0,y0)的方向时,我们会先将y坐标翻上去,然后计算角度。即: p1_xint(x1) # p1_yint(y1)p0_xint(x0) #图像大小为512*512中心点坐标为25…

PO-提示json不能为空 not valid json at character 2 of ““““

问题描述: 调用第三方REST接口,提示提示json不能为空 not valid json at character 2 of """" 原因分析: 一般都是对方接收后出现错误没有处理,返回空值;有可能是他们映射有问题 解决方案&…

小程序获取头像和昵称的思路

小程序获取头像和昵称的基本方法是调用小程序自带的API wx.getUserProfile(),这也是小程序官方目前最推荐的做法。成功获取用户名头像之后,小程序允许保存调用的结果,以便下一次打开页面的时候自动显示头像和名字。保存用户名和头像并不是保存…

JMeter组件

1.JMeter常用组件 必须组件:测试计划,线程组(包含多个线程),取样器 测试计划,JMeter默认创建且仅有一个 线程组: 添加步骤: 选择TestPlan并点击鼠标右键添加 分类以及使用&…

MyBatisPlus 使用枚举

MyBatisPlus 使用枚举 表中的有些字段值是固定的,例如性别(男或女),此时我们可以使用MyBatis-Plus的通用枚举来实现 数据库表添加字段sex 创建通用枚举类型 Getter public enum SexEnum {MALE(1, "男"),FEMALE(2, &qu…

MySQL与MongoDB,该如何做技术选型?

hello,大家好,我是张张,「架构精进之路」公号作者。 引言 一般情况下,会考虑到MySQL与MongoDB如何做技术选型的时候,你一定是遇到了类似于非结构化数据JSON的存取难题,否则大家都直接MySQL开始搞起了。 为什…

西工大CSAPP第二章课后题2.56~2.58答案及解析

因为我获取并阅读CSAPP电子书的方式是通过第三方网站免费下载,没有付给原书作者相应的报酬,遵循价值交换原则,我会尽我所能通过博客的方式,推广这本书以及原书作者就职的大学,以此回馈原书作者的劳动成果。另外&#x…

【JMeter】逻辑控制器分类以及功能介绍

常用逻辑控制器的分类以及介绍 If Controller 满足if条件才会执行取样器 Loop Controller 对取样器循环多次 ForEach Controller

MySQL笔记--SQL语句

1--SQL的通用语法 2--SQL语句的分类 3--DDL语句 3-1--数据库操作 # 查询所有数据库 show databases;# 查询当前使用数据库 select database();# 创建数据库 create database 数据库名 create database if not exists 数据库名; # 不存在时创建,存在则不创建 creat…

【设计模式】第25节:行为型模式之“访问者模式”

一、简介 访问者模式允许一个或者多个操作应用到一组对象上,设计意图是解耦操作和对象本身,保持类职责单一、满足开闭原则以及应对代码的复杂性。 二、优点 分离操作和数据结构增加新操作更容易集中化操作 三、适用场景 数据结构稳定,操…

数据结构与算法-(7)---栈的应用拓展-前缀表达式转换+求值

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

测试C#调用Aplayer播放视频(3:编写简易播放器)

学习了参考文献1中的示例代码,也找出了前一篇文章中自己测试控件但无法播放视频的问题(没有将解码库文件复制到可执行程序所在的codecs文件夹内),本文基于APlayer组件编写简单的视频播放器,主要实现以下功能&#xff1…

iOS实现弹簧放大动画

效果图 实现代码 - (void)setUpContraints {CGFloat topImageCentery (SCREEN_HEIGHT - 370 * PLUS_SCALE) / 2;[self.topIconView mas_makeConstraints:^(MASConstraintMaker *make) {make.centerX.mas_equalTo(0);make.centerY.equalTo(self.view.mas_top).with.offset(t…

一定要看看的大模型【评测基准】及【评测报告】

评测标准 1.能力基础评测 为了检验大语言模型(LLM)的有效性和优越性,已有研究采用了大量的任务和基准数据集来进行实证评估和分析。根据任务定义,现有语言生成的任务主要可以分为语言建模、条件文本生成和代码合成任务。需要注意的是,代码合成不是典型的自然语言处理任务…

Qt6:子窗口向父窗口传值

终于解决了这个问题!这才怀着激动的心情跑来记录一下。你们是不知道这其中的艰辛啊,太难了,差亿点就放弃学Qt了…… 此处苦水省略一万字…… 关于子窗口向父窗口传值的方法,在网上搜了不下百遍,免费的、付费下载、会员…

STM智能小车——OLED实现测速小车

目录 1. 测速模块 2. 测试原理和单位换算 3. 定时器和中断实现测速开发和调试代码 4. 小车速度显示在OLED屏 1. 测速模块 用途:广泛用于电机转速检测,脉冲计数,位置限位等。有遮挡,输出高电平;无遮挡,输出低电平接线…

0基础学习VR全景平台篇第115篇:转换为立方体面 - PTGui Pro教程

上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程!PTGui的软件教程到了这节课即将结束,我们此前历数各种编辑、优化全景的方法步骤,相信可以带给大家一些帮助。可是因为一些人力不可抗拒因素,造成…

SSM校园设备管信息管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

选题理由 随着计算机网络及多媒体技术的广泛应用,互联网已成为高校办学的基础设施和必备条件,基于互联网的高校信息管理越来越综合化,越来越多的教学管理、行政管理工作将架构在互联网上,互联网正在变为学校实施教学、科研和管理…

图数据库Neo4j概念、应用场景、安装及CQL的使用

一、图数据库概念 引用Seth Godin的说法,企业需要摒弃仅仅收集数据点的做法,开始着手建立数据之间的关联关系。数据点之间的关系甚至比单个点本身更为重要。 传统的**关系数据库管理系统(RDBMS)**并不擅长处理数据之间的关系,那些表状数据模…

python爬取csdn的文章内容

今天写了一个爬取csdn文章的 初学不太会,下面代码有时间可以自行优化 新建python文件,把我的代码复制进去保存 把依赖python install 一下 import re import urllib.error import urllib.request import os import tkinter as tk from bs4 import Bea…