【软件工程】简单讲讲设计模式七大原则,以及代码简单举例

news2024/11/17 3:51:21

给自己一个目标,然后坚持一段时间,总会有收获和感悟!
学软件或计算机专业的同学应该都会接触到一门课程《软件工程》,七大设计原则属于软件工程中的重要知识点。

目录

  • 一、软件工程
    • 1.1、提供指导和规范
    • 1.2、确保软件质量
    • 1.3、提高开发效率和生产力
    • 1.4、降低软件开发风险
    • 1.5、支持可维护和可扩展性
  • 二、七大原则
    • 2.1、单一职责原则
    • 2.2、开放封闭原则
    • 2.3、里式替换原则
    • 2.4、依赖倒转原则
    • 2.5、接口隔离原则
    • 2.6、迪米特法则
    • 2.7、合成复用原则
  • 三、代码例子
    • 3.1、单一职责原则例子
    • 3.2、开放封闭原则例子
    • 3.3、里式替换原则例子

在这里插入图片描述

一、软件工程

软件工程是一门关注构建高质量软件的学科,它涉及了软件开发的全过程,从需求分析、设计、编码、测试到部署和维护。软件工程的目标是通过系统性的方法和工具来开发和维护可靠、高效、可维护和安全的软件。

  • 软件工程的作用包括以下几个方面

1.1、提供指导和规范

软件工程提供了一系列的准则、方法和最佳实践,以指导开发团队如何有效地组织和管理软件项目。它帮助开发者遵循一套规范和标准,以确保软件开发过程的质量和可控性。

1.2、确保软件质量

通过使用软件工程方法和技术,开发团队可以在整个软件开发生命周期中进行严格的质量控制。这包括对需求的准确定义、系统设计的完整性和正确性、代码的可读性和可维护性,以及全面的软件测试和验证。

1.3、提高开发效率和生产力

软件工程通过引入工程化的方法和工具,提供了一系列的自动化和协作机制,可以大大提高开发效率和生产力。例如,使用版本控制系统可以更好地管理代码的变更,使用集成开发环境可以提供更好的编码和调试工具。

1.4、降低软件开发风险

软件工程注重风险管理和控制,帮助开发团队在项目早期识别和处理潜在的问题和风险,从而降低项目失败的风险。通过合理的项目计划、风险评估和迭代开发等方法,可以更好地管理和减少开发过程中的不确定性。

1.5、支持可维护和可扩展性

软件工程关注软件的长期维护和演化,帮助开发团队构建易于维护和灵活扩展的软件系统。通过合理的架构设计、模块化和抽象化,软件工程可以提高软件系统的可维护性和可扩展性。

总之,软件工程在软件开发过程中起到指导、规范、管理和控制的作用,以确保开发高质量的软件系统。
它帮助开发者和团队更好地组织、规划和执行软件项目,从而提高开发效率、减少风险,并满足用户需求。

二、七大原则

在软件设计中,有七个常用的设计原则,也被称为SOLID原则

2.1、单一职责原则

单一职责原则(Single Responsibility Principle,SRP),一个类应该只有一个引起它变化的原因。简单来说,一个类或模块应该只负责一项任务或功能。例如,一个负责处理用户登录的类不应该承担其他与用户无关的功能。

2.2、开放封闭原则

开放封闭原则(Open-Closed Principle,OCP),软件实体(类、模块、函数等)应该是可扩展的,但对修改是封闭的。这意味着我们应该通过扩展现有实体,而不是修改它们来实现新的功能或行为。例如,通过使用抽象类或接口,我们可以定义一个通用的日志记录接口,然后通过实现该接口来添加新的日志记录器。

2.3、里式替换原则

里式替换原则(Liskov Substitution Principle,LSP),子类应该能够替换父类并且不影响程序的逻辑正确性。简单来说,子类应该能够以父类的身份无缝使用,并且不引起错误或异常。例如,如果有一个父类定义了一个返回数字的方法,子类应该能够返回同样类型的数字,而不是返回字符串或其他类型。

2.4、依赖倒转原则

依赖倒转原则(Dependency Inversion Principle,DIP),高层模块不应该依赖于低层模块的具体实现,而是应该依赖于抽象接口或类。简单来说,代码应该依赖于接口或抽象类,而不是具体的实现类。例如,一个控制器类应该依赖于定义好的接口而不是具体的服务类。

2.5、接口隔离原则

接口隔离原则(Interface Segregation Principle,ISP),客户端不应该依赖于它不需要的接口。简单来说,一个类不应该强制依赖于它不使用的接口方法。例如,如果有一个需要进行文件操作的类,不应该强制实现与网络通信相关的方法。

2.6、迪米特法则

迪米特法则(Law of Demeter,LoD,最少知识原则),一个对象应该与其他对象之间保持最少的了解。简单来说,一个类或对象应该尽可能少地知道其他类或对象的细节。例如,如果一个类需要使用另一个类的功能,应该通过接口或抽象的方式进行交互,而不是直接调用该类的方法。

2.7、合成复用原则

合成复用原则(Composition/Aggregation Reuse Principle,CARP),优先使用对象组合和聚合,而不是继承来达到代码复用的目的。简单来说,应该通过组合多个类的方式来实现代码复用,而不是通过继承。例如,使用组合关系将多个小的功能类组合成一个大的功能类,而不是通过继承来扩展功能。

三、代码例子

3.1、单一职责原则例子

// 单一职责原则例子
class UserService {
    public void register(String username, String password) {
        // 用户注册逻辑
    }
}

class EmailService {
    public void sendEmail(String recipient, String content) {
        // 发送邮件逻辑
    }
}

3.2、开放封闭原则例子

// 开放封闭原则例子
interface Logger {
    void log(String message);
}

class ConsoleLogger implements Logger {
    public void log(String message) {
        System.out.println(message);
    }
}

class FileLogger implements Logger {
    public void log(String message) {
        // 将日志写入文件的逻辑
    }
}

3.3、里式替换原则例子

// 里式替换原则例子
class Shape {
    public double getArea() {
        return 0;
    }
}

class Rectangle extends Shape {
    private double width;
    private double height;

    public void setWidth(double width) {
        this.width = width;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public double getArea() {
        return width * height;
    }
}

过上述例子,可以更好地理解七大设计原则在实际代码中的应用。这些原则有助于提高代码的可维护性、扩展性和重用性。

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

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

相关文章

【经验分享】解决vscode编码问题

目录 先看一下我遇到的问题和你们的一不一样 下面是我查到的解决办法: 简单点说就是 我们看看解决后的效果 先看一下我遇到的问题和你们的一不一样 我一开始以为就是编码问题。 下面是我查到的解决办法: 这个错误提示看起来仍然是中文乱码。可能是由于…

Flink学习之旅:(二)构建Flink demo工程并提交到集群执行

1.创建Maven工程 在idea中创建一个 名为 MyFlinkFirst 工程 2.配置pom.xml <properties><flink.version>1.13.0</flink.version><java.version>1.8</java.version><scala.binary.version>2.12</scala.binary.version><slf4j.ver…

Java构建Web项目

对无底线服务型的系统&#xff0c;业务代码和界面代码脚本化是及其重要的。一是脚本化能确保部署本地就是再用的代码&#xff0c;不存在为每个项目管理代码的问题。然后脚本化不需要人为编译和投放程序库。极大的简化维护难度和成本。能不能脚本化直接决定了能否全面铺开运维&a…

流量新玩法:微信问一问了解一下

来自一位不断探索的营销人的问题&#xff1a;微信“问一问”引流&#xff0c;一个问答引流1000精准粉&#xff0c;是不是真的&#xff1f;如果是真的&#xff0c;那该怎么做呢&#xff1f; 微信的问一问功能&#xff0c;支持图文回答&#xff0c;也支持用视频去回答&#xff0c…

Java使用javah命令:‘javah‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

前提是已安装jdk&#xff0c;配置JDK环境变量&#xff0c;并成功输出下图&#xff1a; 但在命令行窗口使用javah&#xff0c;找不到该命令&#xff1a; 原因&#xff1a;新版的Java不使用javah的命令了&#xff0c;而是使用javac -h 用法&#xff1a; javac -h <directory&…

低代码系列——可视化编辑器

前端社区里&#xff0c;低代码/无代码是被讨论的火热赛道。它通过用最少量的编程代码去开发应用程序&#xff0c;从而提高效率。由此&#xff0c;许多企业都在使用低代码平台进行业务的开发和升级。低代码平台可以大幅简化编码过程&#xff0c;并且可以快速构建定制化的应用程序…

C++ - 类型转换 - static_cast - reinterpret_cast - const_cast - dynamic_cast

目录 类型转换 C语言当中的类型转换 为什么C需要四种类型转换 &#xff08;讲解volatile关键字&#xff09; C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast&#xff08;动态转换&#xff09; RTTI 类型转换 C语言当中的类型转换 其实在 C语言当…

从理论到实践,实时湖仓功能架构设计与落地实战

在上篇文章中&#xff0c;我们向大家解释了为什么实时湖仓是当前企业数字化转型过程中的解决之道&#xff0c;介绍了实时计算和数据湖结合的应用场景。&#xff08;“数据驱动”时代&#xff0c;企业为什么需要实时湖仓&#xff1f;&#xff09; 在这篇文章中&#xff0c;我们…

使用Gitlab构建简单流水线CI/CD

什么是Gitlab Gitlab实质上是一套DevOps工具 目前看起来&#xff0c;Gitlab属于是内嵌了一套CI/CD的框架&#xff0c;并且可以提供软件开发中的版本管理、项目管理等等其他功能。 这里需要辨别一下Gitlab和Github Gitee的区别。 GIthub大家都很熟悉了&#xff0c;一般大家都会…

探索DeFi世界,MixGPT引领智能金融新时代

随着区块链技术的迅猛发展&#xff0c;DeFi&#xff08;去中心化金融&#xff09;正成为金融领域的新宠。在这个充满活力的领域里&#xff0c;MixTrust站在创新的前沿&#xff0c;推出了一款引领智能金融新时代的核心技术——MixGPT。 MixGPT&#xff1a;引领智能金融体验的大型…

Rust逆向学习 (1)

文章目录 Hello, Rust Reverse0x01. main函数定位0x02. main函数分析line 1line 2line 3line 4~9 0x03. IDA反汇编0x04. 总结 近年来&#xff0c;Rust语言的热度越来越高&#xff0c;很多人都对Rust优雅的代码和优秀的安全性赞不绝口。对于开发是如此&#xff0c;对于CTF也是如…

208. 开关问题 - 异或方程组

208. 开关问题 - AcWing题库 我们可以找每一个开关由哪些开关掌控&#xff0c;每一个开关的值设为动过为1&#xff0c;没动过为0 再看当前开关的状态与结果的状态是否一致&#xff0c;一致为0&#xff0c;说明掌控这个开关的开关门的异或值为0&#xff0c;不一致则为1&#xf…

彻底理解操作系统与内核的区别!

通用底盘技术 Canoo公司有一项核心技术专利&#xff0c;这就是它们的通用电动底盘技术&#xff0c;长得是这个样子&#xff0c;非常像一个滑板&#xff1a; 这个带轮子、有电池、能动的滑板已经包含了一辆车最核心的组件&#xff0c;差的就是一个外壳。这个看起来像滑板的东西…

【MATLAB源码-第50期】基于simulink的BPSK调制解调仿真,输出误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. Bernoulli Binary: 这个模块生成伯努利二进制随机数&#xff0c;即0或1。这些数字表示要传输的原始数字信息。 2. Unipolar to Bipolar Converter: 此模块将伯努利二进制数据从0和1转换为-1和1&#xff0c;这是BPSK调制的标…

AN动画基础——缓动动画

【AN动画基础——影片剪辑滤镜】 基础动画缓动动画缓动原理实例应用 本篇内容&#xff1a;了解曲线原理 重点内容&#xff1a;缓动动画 工 具&#xff1a;Adobe Animate 2022 基础动画 我们先做一个非缓动的效果的动画。 绘制一个矩形设置成元件—图形&#xff0c;30帧插入关…

SpringMVC源码分析(四)请求流程分析

a、http请求是怎么被Controller接受处理&#xff0c;然后返回结果的&#xff1f; 发出HTTP请求后&#xff0c;跳过网络层的东西&#xff0c;当被应用服务器Tomcat接受的时候。在Tomcat中存在一个servlet容器&#xff0c;它负责管理所有的servlet&#xff0c;包括SpringMVC的核…

MySQL绕过WAF实战技巧

一、前言 本人喜欢遇到好的东西&#xff0c;乐于分享&#xff0c;关注freebuf有段时间了&#xff0c;写过两篇文章&#xff0c;每次写写文章&#xff0c;不仅仅是为了挣点稿费。而是通过此平台能够认识一些安全圈的小伙伴&#xff0c;互相学习&#xff0c;共同进步。在安全行业…

为什么不可大张旗鼓地推动“汉字编程”?

为什么不可大张旗鼓地推动“汉字编程”&#xff1f; 没有不可。 我之前看到过一个vscode插件&#xff0c;是给一个不知道叫什么名字的编程语言用的&#xff0c;从代码到注释全是西里尔字母写的&#xff0c;反正就只有东欧那片区域用。最近很多小伙伴找我&#xff0c;说想要一些…

c++实现最大堆

前言 在写leetcode的时候&#xff0c;看到一道优先队列的题目&#xff0c;复习了一下最大堆&#xff0c;用c实现了一下。以前听网课的时候&#xff0c;根本看不懂实现&#xff0c;现在自己也能实现了。 参考文献 这个我觉得讲得挺好的&#xff0c;图很生动形象 代码 #incl…

2023年京东洗发护发行业增长趋势分析:头皮清洁或成小风口

如今&#xff0c;随着消费观念的转变&#xff0c;越来越多的消费者愈加重视头部的洗护&#xff0c;无论是女性还是男性&#xff0c;都开始积极寻找头部洗护用品&#xff0c;以更好地呵护头发及头皮。在用户需求的推动下&#xff0c;洗发护发行业已经逐渐发展成为成熟行业。 根据…