软件设计师笔记-算法设计与分析面向对象技术

算法设计与分析

算法的特性
  • 有穷性
  • 确定性
  • 可行性
  • 输入
  • 输出
算法的表示方法
  • 自然语言
  • 流程图
  • 程序设计语言
  • 伪代码
递归算法求时间复杂度
  • 展开法:将等式依次展开
  • 代换法:用所猜测的值代替函数的解
分治法

将一个难以直接解决的大问题分解成一些规模较小的小问题各个击破:

  • 分解
  • 求解
  • 合并
动态规划法
  • 将待求解问题分解成若干子问题分别求解,再根据子问题的解得到原问题的解
  • 分解得到的子问题往往不是独立的
  • 找出最优解性质并刻画其结构特性
  • 递归地定义最优解的值
  • 以自底向上的方式求出最优值
  • 根据最优值构造最优解
贪心算法
  • 仅根据当前已有信息做出选择,重点考虑局部最优以达到全局最优
  • 最优子结构
  • 贪心选择性质
回溯法
  • 以深度优先的方式系统地搜索问题
  • 定义问题的解空间
  • 确定解空间结构
  • 深度优先的方式搜索解空间
分支限界法
  • 以广度优先或以最小耗费优先的方式搜索解空间
  • 队列式分支限界法
  • 优先队列式分支限界法
概率算法
  • 把随机性的选择加入到算法中,允许较小概率的错误来提高运行效率
  • 数值概率算法
  • 蒙特卡罗算法
  • 拉斯维加斯算法
  • 舍伍德算法
近似算法

放弃求最优解,而用近似最优解代替。
衡量标准:

  • 算法的时间复杂度
  • 解的近似程度
NP 完全性理论

研究计算问题难易以及一类特殊的难解问题的理论

P 类问题

能够以 O( n k n^k nk)的时间运行一个确定性算法得到准确答案

NP 类问题

能够以 O( n k n^k nk)的时间运行一个不确定性算法得到准确答案

NP 完全问题

能够证明用多项式时间的确定性算法得到准确答案

面向对象技术

面向对象技术

以客观世界的对象为中心,其分析和设计思想符合人们的思维方式,分析和设计的结果与客观世界的实际比较接近,容易被人们所接受。

面向对象
  • 对象:对象名、属性、操作
  • 分类:所包含的方法和数据描述一组对象的共同行为和属性
  • 继承:父类与子类之间共享数据和方法的机制
  • 通过消息的通信:对象之间进行通信的一种构造
多态

不同的对象收到同一消息产生完全不同的结果(重载+重写+类属

绑定

把过程调用和响应调用所需要执行的代码加以结合的过程

动态绑定

当一个对象发送消息请求服务时,根据接受对象的具体情况将请求的操作与实现的方法进行连接

面向对象程序设计语言
  • 被封装的对象
  • 类和实例概念
  • 类间的继承性
  • 多态
程序设计范型

程序设计范型(Programming Paradigm)是人们在程序设计时采用的基本方式模型或程序设计体裁,是用程序设计语言表达各种概念和各种结构的一套设施。它不仅体现了一类语言的主要特点,更是执行设施的基本集合,或者说是关于计算机系统的思考方法。在编程的世界里,不同的程序设计范型犹如不同的工具箱,帮助程序员以不同的视角和方式解决问题。

面向对象的好处
  • 解决了产品质量与生产效率之间的权衡
  • 使系统具有很高的灵活性和易扩充性
  • 能管理复杂性并增强伸缩性
  • 把某一领域分割成各种对象分析设计更合理
  • 从概念模型化到分析、设计、编码可以实现无缝传递
  • 通过封装进行信息隐蔽有助于建立安全的系统
典型的面向对象设计语言
  • Smalltalk
  • Eiffel
  • C++
  • Java
类的特征
  • 同一个类的不同实例具有相同的数据结构和规律相同的行为
  • 同一个类的不同实例可以持有不同的值因而可以具有不同的状态
  • 实例的初始状态可以在实例化时确定
消息传递

使对象具有交互能力的主要模型

对象自身引用(this)
  • 值使得方法体中引用的成员名与特定的对象相关
  • 类型则决定了方法体被实际共享的范围
虚拟函数

只给出方法的定义不给出实现过程,供其子类重置(overriding

类属
  • 类的模版
  • 参数多态机制
  • 不限定成员的类型,具体对象再赋予具体类型
类库

预先定义的程序库,以程序模块的形式按照类层次结构把一组类的定义和实现组织在一起

抽象类

无实例的类,以供继承

面向对象分析
  • 认定对象
  • 组织对象
  • 描述对象间的相互作用
  • 定义对象的操作
  • 定义对象的内部信息
面向对象设计

设计分析模型,实现相应源代码

面向对象软件的测试
  • 算法层
  • 类层
  • 模版层
  • 系统层
面向对象的方法
  • OOA 方法:主题层,对象类层,结构层,属性层,服务层
  • OOD 方法:问题域部件,人机交互部件,任务管理部件,数据管理部件
  • Booch 的 OOD 方法:标识类和对象,确定他们的含义,标识他们之间的关系,说明每一个类的界面和实现
  • OMT(面向对象建模技术):对象模型,动态模型,功能模型(分析,系统设计,对象设计,实现)
  • UML(统一建模语言):事务(结构事务、行为事务、分组事务、注释事务),关系(依赖、关联、泛化、实现),图(类图、对象图、用例图、交互图、状态图、活动图、构建图、部署图)
设计模式四要素
  • 模式名称
  • 问题
  • 解决方案
  • 效果
设计模式分类
  • 创建型(抽象了实例化过程,帮助系统独立于如何创建、组合和表示它
    的那些对象,如 Singleton 模式:保证类只能有一个实例)
  • 结构型(采用继承机制灵活地组合类和对象以获得更大的结构)
  • 行为型(使用继承机制在类间分派行为,描述对象或类的模式以及其通信模式,如 Observer 模式:一旦模型发生变化所有视图都会得到通知)
面向对象设计原则

一、单一职责原则(SRP)

单一职责原则强调一个类应该只有一个引起它变化的理由,或者说,一个类应该只有一个职责。这一原则有助于降低类的复杂度,提高代码的可读性和可维护性。当类的职责过于复杂时,代码修改和扩展将变得困难。通过遵循单一职责原则,开发者可以将复杂的类拆分成多个简单的类,每个类只负责一个特定的职责,从而使得系统更加清晰和易于管理。

二、开放封闭原则(OCP)

开放封闭原则要求软件实体(类、模块、函数等)应该是可扩展的,但不可修改的。这意味着在现有功能不受影响的情况下,软件实体应该能够通过扩展来添加新功能。这一原则有助于确保软件系统的稳定性和可维护性。为了实现开放封闭原则,开发者需要采用抽象和接口等技术,使得软件实体在保持内部封闭性的同时,能够对外开放其扩展点。

三、里氏替换原则(LSP)

里氏替换原则指出,子类必须能够替换其父类而不会导致程序崩溃或产生不正确的结果。这一原则确保了软件系统的继承关系具有良好的行为特性,即子类在继承父类的同时,不会破坏父类的行为。遵循里氏替换原则有助于构建稳定的继承体系,降低系统因继承关系而引发的风险。

四、接口隔离原则(ISP)

接口隔离原则要求将庞大的、臃肿的接口拆分成更小的、更具体的接口,使得客户端只需要知道它们感兴趣的方法。这一原则有助于降低系统的耦合度,提高代码的可重用性和灵活性。通过遵循接口隔离原则,开发者可以设计出更加符合实际需求、易于理解和维护的接口。

五、依赖倒置原则(DIP)

依赖倒置原则强调高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。这一原则有助于降低系统各层之间的耦合度,提高系统的可扩展性和可维护性。通过引入抽象层,开发者可以更加灵活地修改和扩展系统,而无需对高层模块进行大量修改。

六、迪米特法则(LoD)

迪米特法则又称最少知道原则,它要求一个对象应该对其他对象保持最少的了解。这一原则有助于降低系统的耦合度,提高系统的模块化和封装性。通过遵循迪米特法则,开发者可以设计出更加清晰、易于理解和维护的软件系统。

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

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

相关文章

第9章 大模型的有害性(上)

9.1 引言 本章将探讨大型语言模型(LLMs)可能带来的有害性,重点讨论以下几个方面: 性能差异社会偏见和刻板印象 在后续内容中,还会涉及其他层面的危害,如有害信息、虚假信息、隐私和安全风险、版权问题、…

Hyperf jsonrpc

依赖的 composer 包 composer require hyperf/json-rpc composer require hyperf/rpc-server composer require hyperf/rpc-client composer require hyperf/service-governance composer require hyperf/service-governance-consul composer require hyperf/service-gove…

ECharts柱状图-交错正负轴标签,附视频讲解与代码下载

引言: 在数据可视化的世界里,ECharts凭借其丰富的图表类型和强大的配置能力,成为了众多开发者的首选。今天,我将带大家一起实现一个柱状图图表,通过该图表我们可以直观地展示和分析数据。此外,我还将提供…

07《缓存》计算机组成与体系结构 系列课

目录 深入了解缓存内存 缓存的重要性 游戏中的存储需求与主内存 虚拟内存和按需分页 现代系统中的多级缓存 缓存级别的大小与速度 缓存相关的术语 缓存命中与未命中 页面命中与缺页 局部性原理 结语 深入了解缓存内存 大家好,欢迎来到今天的课程。上节课…

【Exchange渗透02】Exchange 渗透信息收集

目录 一、Exchange 介绍 二、Exchange基础 1. exchange 开放端口 2. 域内定位 exchange 服务器 3. exchange 相关账号 4. exchange 目录介绍 管理中心 /ecp Outlook用户邮箱 /owa 三、Exchange 外网信息收集 1. 识别exchange版本 2. 通过exchange获取AD域名 3. 探测…

Linux中dos2unix详解

dos2unix 是一个用于将文本文件从DOS/Windows格式转换为Unix/Linux格式的工具。在不同的操作系统中,文本文件中的换行符表示方式是不一样的。具体来说: 在DOS和Windows系统中,换行由两个字符组成:回车(Carriage Retur…

贵州大学oj平台软工24-11-27第5次小测

题目&#xff1a;阶乘和函数 题目描述 设计一个计算阶乘和的函数&#xff0c;用于求1!2!...n!并返回结果。 其中n是函数的参数。 程序的开始部分及main函数已经写好如下&#xff1a; #include <stdio.h> double factSum(int n); int main(){ int n; scanf("…

FPGA实战篇(触摸按键控制LED灯)

1.触摸按键简介 触摸按键主要可分为四大类&#xff1a;电阻式、电容式、红外感应式以及表面声波式。根据其属性的不同&#xff0c;每种触摸按键都有其合适的使用领域。 电阻式触摸按键由多块导电薄膜按照按键的位置印制而成&#xff0c;但由于耐用性较差且维护复杂&#xff0c…

java基础概念47-ArrayList、LinkList和迭代器

一、ArrayList集合 1-1、ArrayList的两种添加信息的方式 1-2、ArrayList集合底层逻辑 1、利用空参创建的集合&#xff0c;在底层创建一个默认长度为0的数组 2、添加第一个元素时&#xff0c;底层会创建一个新的长度为10的数组 3、存满时&#xff0c;会扩容1.5倍。 4、如果…

Milvus python库 pymilvus 常用操作详解之Collection(下)

上篇博客 Milvus python库 pymilvus 常用操作详解之Collection&#xff08;上&#xff09; 主要介绍了 pymilvus 库中Collection集合的相关概念以及创建过程的代码实现&#xff0c;现在我们要在该基础上实现对于collection中插入数据的混合检索&#xff08;基于dense vector 和…

C++学习日记---第16天

笔记复习 1.C对象模型 在C中&#xff0c;类内的成员变量和成员函数分开存储 我们知道&#xff0c;C中的成员变量和成员函数均可分为两种&#xff0c;一种是普通的&#xff0c;一种是静态的&#xff0c;对于静态成员变量和静态成员函数&#xff0c;我们知道他们不属于类的对象…

Java基础之网络编程:开启网络通信的神秘之门

一、网络编程概述 网络编程是通过计算机网络进行数据传输和通信的编程技术&#xff0c;在 Java 中&#xff0c;我们可以使用丰富的网络编程功能和 API 来实现不同计算机之间的数据交互。 Java 网络编程是指在 Java 语言中使用网络协议和 API 进行网络通信的编程技术。Java 网络…

Go 语言函数编程指南:定义、调用技巧与返回值机制

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Go语言探索之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Go语言简介 2、Go语言的特点 二、函数定义 1、Go语言函数定义 2、函…

qt实现对pdf的编译、读、写、显示

PDFium 的下载和编译 PDFium 是一个开源的 PDF 渲染引擎,支持 PDF 的加载、解析和显示功能。1.1 下载 PDFium 源码 克隆 PDFium 的官方源码仓库: git clone https://pdfium.googlesource.com/pdfium.git cd pdfium 下载依赖项和工具链: gclient sync 1.2 配置编译环境 PDF…

在办公室环境中用HMD替代传统显示器的优势

VR头戴式显示器&#xff08;HMD&#xff09;是进入虚拟现实环境的一把钥匙&#xff0c;拥有HMD的您将能够在虚拟现实世界中尽情探索未知领域&#xff0c;正如如今的互联网一样&#xff0c;虚拟现实环境能够为您提供现实中无法实现的或不可能实现的事。随着技术的不断进步&#…

Springboot项目中子模块maven层级不一致的问题

&#xff08;一&#xff09;问题描述 campus-common、campus-pojo、campus-server都是campus-flower-system的子模块&#xff0c;但是只有campus-common在campus-flower-system下 &#xff08;二&#xff09;解决方法 打开父工程&#xff08;我这里是campus-flower-system&…

springboot-mybatis-plus集成篇

前言 MyBatis 最佳搭档&#xff0c;只做增强不做改变&#xff0c;为简化开发、提高效率而生。 简单用例 UserMapper.java Mapper public interface UserMapper extends BaseMapper<User> { }User.java TableName(value "user") public class User implem…

nginx配置http及https

nginx配置http及https 1.动静分离2.负载均衡3.配置https4.请求重定向5.常用参数配置介绍 现在日常工作中的项目大多数都是采用前后端分离&#xff0c;就用到了nginx进行反向代理、处理静态资源等&#xff1b;因此&#xff0c;记录整理了nginx一些常用的配置&#xff1b; 1.动静…

react学习记录

一、目录结构react优秀代码之react目录结构简洁之道React 作为一个库&#xff0c;不会决定你如何组织项目的结构。这是件好事&#xff0c;因为这样 - 掘金【React】项目的目录结构全面指南_react项目结构-CSDN博客 1、创建项目&#xff1a;开发文档 Getting Started | Create…

SpringBoot 架构下的在线家具商城:规划与实践之路

第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&#xff0c;以及各种计算机硬件的完善和升…