[架构之路-244]:目标系统 - 设计方法 - 软件工程 - 软件开发方法:结构化、面向对象、面向服务、面向组件的开发方法

目录

前言:

一、概述: 软件聚合的程度由简单到复杂

二、主要开发方法详见

2.1 结构化的开发方法

2.2 面对对象的开发方法

2.3 面向服务的开发方法

2.4 面向组件的开发方法

三、不同开发方法比较

3.1 结构化开发方法

3.2 面向对象(OOP)开发方法

3.3 面向服务开发方法

3.4 面向组件开发方法

3.5 组件与服务,哪个的粒度更大


前言:

软件开发方法(纵向):研究组织、管理、复用软件代码的方法。

一、概述: 软件聚合的程度由简单到复杂

软件开发方法(Software Development Methodologies)指的是软件开发全生命周期过程中采用的具体方法、技术、工具和过程等。

软件开发方法可以帮助开发团队规范全生命周期的开发过程提高开发效率和质量、实现代码可重用等目标。

软件的开发方法,随着软件规规模变得越来越大而逐步演进的。

软件开发方法是指在软件开发过程中用于组织、管理软件代码完成开发任务具体方法论和实践方式。不同的软件开发方法有不同的特点和适用场景。

软件开发方法和编程语言的发展密不可分,下面以五种常见的软件开发方法为例,简单介绍它们与编程语言发展的关系

  1. 无结构化方法(语句):无结构化方法是早期的软件开发方法,应用于早期的编程语言,如机器语言、汇编语言等,这些编程语言没有明确的语法规则和结构形式,因此使用无结构化方法进行开发。但是,由于无结构化方法的缺点显著,现在基本不再使用

  2. 结构化开发方法(函数):随着高级编程语言的发展,结构化开发方法兴起了。结构化开发方法常与结构化编程语言如 C、Pascal等一起应用。这些编程语言强调代码结构化,通过控制流和数据结构等方式使程序更容易阅读和维护

  3. 面对对象方法(方法与数据的聚合):面对对象方法与面向对象语言发展起来。现代的面向对象编程语言如Java、C#、Python、Swift支持面向对象编程。同时,这些语言都支持面向对象方法的特性,如封装、继承、多态等,使得面向对象方法可以更好地运用。

  4. 面向服务的方法(一组静态对象或函数的单一功能):面向服务的方法的兴起得益于 Web 服务技术的发展。它通常结合使用服务描述语言,如WSDL、SOAP和REST等,这些语言与XML相结合,使得不同的编程语言之间可以互相通信。同时,现代编程语言如Java、.NET等都提供了对 Web 服务的支持。

  5. 面向组件的方法(一组静态对象或函数的多重功能):随着互联网技术的发展和软件架构演进,面向组件的方法得以广泛应用。同时,支持组件技术的编程语言和框架也相应出现,如Java EE、.NET 等,它们提供了丰富的组件库和接口规范。

综上所述,软件开发方法与编程语言的发展是相互促进的,它们共同推动了软件工程的发展和进步。

备注:

原型法并非是组织、管理、复用软件代码的方法。

二、主要开发方法详见

2.1 结构化的开发方法

结构化的开发方法是一种以逻辑(水平)和层次化(垂直)的方式进行软件开发的方法。它强调将软件系统划分为不同的模块,并使用明确的规则和标准来定义模块之间的接口和依赖关系。

以下是结构化的开发方法的主要特点和步骤:

特点:

  1. 模块化:将系统功能划分为多个模块,每个模块负责完成特定的任务。
  2. 顺序性:按照特定的顺序依次进行需求分析、系统设计、编码和测试等开发阶段。
  3. 结构化编程:编写结构化的、可读性强的程序,使用顺序、选择和循环等结构化语句。
  4. 抽象和封装:通过抽象和封装将模块内部的细节隐藏起来,提高代码的可维护性和可重用性。

步骤:

  1. 需求分析:明确系统的需求和目标,定义系统的功能和性能要求。
  2. 系统设计:根据需求分析的结果,设计系统的架构和模块划分,确定模块之间的接口和数据流。
  3. 编码:根据系统设计,将每个模块分别实现,编写结构化的、可读性强的代码。
  4. 测试:对每个模块进行单元测试,确保各个模块的功能和接口符合设计要求。
  5. 集成测试:将所有模块集成到一起,测试整个系统的功能和性能。
  6. 调试和优化:对系统进行调试和性能优化,修复错误和改进效率。

结构化的开发方法提供了一种清晰、有序的开发流程,使得软件系统更易于维护、扩展和理解。然而,随着软件开发的复杂性和需求的变化,结构化的开发方法在某些情况下可能显得过于刻板和不灵活。因此,在实际开发中,结构化的方法可能与其他方法结合使用或为基础,以满足不同项目的需求。

2.2 面对对象的开发方法

面向对象的开发方法是一种以对象为中心思想的软件开发方法。它将现实世界中的实体抽象为对象,并通过封装、继承和多态等概念来描述对象之间的关系和行为。

以下是面向对象开发方法的主要特点和步骤:

特点:

  1. 封装:将数据和对数据的操作封装在对象中,实现数据的隐藏和保护性。
  2. 继承:通过继承关系,让一个对象可以继承另一个对象的属性和方法,以实现代码的复用和扩展。
  3. 多态:同一种操作可以在不同的对象上呈现不同的行为,提高系统的灵活性和可扩展性。
  4. 抽象和接口:通过抽象类和接口,对一组对象进行统一的定义和约束,降低代码耦合性。

步骤:

  1. 需求分析:明确系统的需求和目标,定义对象的属性和行为。
  2. 类设计:根据需求分析的结果,确定所需的类,设计类的属性和方法,并建立类之间的关系。
  3. 类编码:根据类设计,编写具体的类代码,实现类的属性和方法。
  4. 类测试:对每个类进行单元测试,确保类的功能和接口符合设计要求。
  5. 集成测试:将所有类集成到一起,测试整个系统的功能和交互性。
  6. 调试和优化:对系统进行调试和性能优化,修复错误和改进效率。

面向对象的开发方法提供了一种更为灵活、可扩展和可维护的开发方式。它使得软件系统的设计和实现更贴近现实世界的情境,提高了代码的可读性和可维护性。同时,面向对象的开发方法也提供了更好的代码复用和模块化的支持,使得开发团队可以更高效地开发和维护软件系统。

常见的面向对象的编程语言包括Java、C++、C#、Python和Ruby等,这些语言提供了丰富的面向对象的特性和语法,使得开发人员能够更方便地应用面向对象的开发方法。

2.3 面向服务的开发方法

面向服务的开发方法是一种以服务为中心思想的软件开发方法。它将现实世界中的功能和服务抽象为独立的服务(Service),通过服务的组合和调用来满足软件系统的需求和目标。以下是面向服务开发方法的主要特点和步骤:

特点:

  1. 服务化:将系统的功能和服务模块化,设计和实现独立的服务。
  2. 标准化:定义服务的接口和协议,实现服务的可互操作性和可组合性。
  3. 松耦合:服务之间的耦合度要尽可能地低,以实现服务的独立性和可替换性。
  4. 可组合性:通过服务的组合和调用,实现软件系统的构建和业务流程的组合。

步骤:

  1. 需求分析:明确系统的需求和目标,定义所需的功能和服务。
  2. 服务设计:根据需求分析的结果,确定所需的服务,设计服务的接口和行为,并建立服务之间的关系。
  3. 服务实现:根据服务设计,编写具体的服务代码,实现服务的功能和接口。
  4. 服务发布:将服务部署到服务容器中,发布服务以供其他服务或客户端调用。
  5. 服务集成和调用:将不同的服务组合和调用起来,实现业务流程的完整性和可组合性。
  6. 调试和优化:对系统进行调试和性能优化,修复错误和改进效率。

面向服务的开发方法提供了一种更为灵活、可扩展和可组合的开发方式。它通过服务的复用、标准化和组合,实现了更高效、更快速的软件开发和集成。同时,面向服务的开发方法也需要满足服务的标准化和协同化,需要考虑服务之间的接口和兼容性等问题。

目前,许多技术平台和框架支持面向服务的开发方法,比如SOAP、REST、SOA、微服务等。它们提供了服务的标准化和支持,确保了服务之间的兼容性和协同性。

2.4 面向组件的开发方法

面向组件的开发方法是一种以组件为中心思想的软件开发方法,它将现实世界中的实体抽象为组件,并通过组件的封装、复用、替换来描述软件系统中的各种功能和服务。以下是面向组件开发方法的主要特点和步骤:

特点:

  1. 组件化:将软件系统拆分为独立的组件,每个组件都有独立的功能和接口。
  2. 封装:将组件的实现细节隐藏在内部,只提供公共的接口,实现信息的保护和安全性。
  3. 复用:通过对现有的组件进行组合和复用,实现功能的快速开发和提高软件质量。
  4. 可替换性:组件的独立性和接口标准化,使得可以方便地进行组件的替换和升级。

步骤:

  1. 需求分析:明确系统的需求和目标,定义所需的功能和服务。
  2. 组件设计:根据需求分析的结果,确定所需的组件,设计组件的属性、接口和行为,并建立组件之间的关系。
  3. 组件实现:根据组件设计,编写具体的组件代码,实现组件的属性和方法。
  4. 测试与集成:对每个组件进行单元测试,确保组件的功能和接口符合设计要求。然后进行组件之间的集成测试。
  5. 调试和优化:对系统进行调试和性能优化,修复错误和改进效率。

面向组件的开发方法提供了一种更灵活、更可重用、更易于维护和升级的开发方式。它使得软件系统的实现更加模块化,提高了开发效率和可重用性,并可以降低开发成本和风险。同时,面向组件的开发方法也需要满足组件的标准化和协同化,需要考虑组件之间的接口和兼容性等问题。

目前,许多技术平台和框架支持面向组件的开发方法,比如.NET、Java EE和Spring等。它们提供了组件的标准化和支持,确保了组件之间的兼容性和协同性。

备注:

基于构建的开发,最重要的难点是,如何构建企业现有的组件库,构建企业的构建库需要消耗大量的时间和精力。组件库也需要版本管理,通常是由企业中间件或平台团队提供。

三、不同开发方法比较

3.1 结构化开发方法

结构化开发方法把大型系统看成是由多个小部分组成的,利用逐步细化、模块化和自顶向下的设计方法进行分治处理,使得每个模块相互独立、模块内部结构清晰、关注点分离,从而可以更好地管理和维护软件系统。

优点:

  1. 简单易学,适合小规模项目。
  2. 可以提高软件开发的效率并减少错误发生的可能。
  3. 容易理解和验证,更加规范化和可控。

缺点:

  1. 难以扩展,可维护性较低,难以适应大规模软件系统的开发。
  2. 需要大量文档和细致的设计,花费更多的时间和精力。
  3. 面向过程,面向需求可能不足。

3.2 面向对象(OOP)开发方法

面向对象开发方法通过将程序代码划分为对象,对代码进行分层和抽象,以实现程序模块化、代码重用和可维护性管理等特点,更加侧重于数据抽象、继承和多态性等概念。

优点:

  1. 软件重用性高,提高软件的维护性和可扩展性。
  2. 代码结构清晰,具有高内聚、低耦合等优点,便于代码管理。
  3. 面向对象这种编程范型更合理地体现了现实世界。

缺点:

  1. 对象之间关系难以理解,可移植性不强。
  2. 由于面向对象开发方法强调数据抽象、继承、多态等特性,因此程序可以变得过于复杂,增加了程序的难度。
  3. 学习成本较高,需要掌握面向对象开发方法的特殊语言和编程思想。

3.3 面向服务开发方法

面向服务开发方法将软件系统划分为多个独立、互相协调的服务单元,服务通过定义标准接口之间进行相互调用、通信和集成,以实现业务流程和目标。

优点:

  1. 可以提高软件系统的可重用性和可扩展性,降低软件开发成本和维护成本。
  2. 可以更加便于系统的扩展和管理,实现广泛的集成和互操作。
  3. 面向流程和业务需求的方法更加接近现实用户需求,增加了软件系统的可用性。

缺点:
1.

不同开发方法比较:结构化、面对对象、面向组件、面向服务

接上文:

缺点:

  1. 需要专业的人员来设计和实现服务架构,需要一定的技术和管理能力。
  2. 需要依赖于网络的通信和调用环节,可能存在延迟和错误等问题。
  3. 面向服务的开发方法要求对软件系统的模块化程度和架构思想有深刻理解,对开发人员的要求较高。

综上所述,不同的开发方法都有其优缺点和适用范围。在选择开发方法时,需要根据项目的规模、复杂度和需求等考虑因素来选择最适合自己的方法。常见的做法是采用不同方法的混合模式,根据实际需要选择使用不同的开发方法来开发软件系统,以最大限度地发挥其优势。

3.4 面向组件开发方法

面向组件开发方法是一种基于编写和使用独立模块化组件的方式进行软件开发,模块化程度更高,具有高度可重用性和可移植性,并且具有独立的接口和行为。

优点:

  1. 提高了软件的可重用性,降低了开发成本和编码量。
  2. 降低了软件的维护成本,使得程序更加的独立可扩展性更强,降低软件复杂度。
  3. 适用于大规模系统开发,更好地利用了现有的组件和资源。

缺点:

  1. 需要大量的组件库和组件配置,开发成本较高。
  2. 组件的互换性和兼容性可能受限,程序运行稳定性等因素需要加以考虑。
  3. 组件开发和管理需要专门的开发人员和产品经理进行设计和实施。

3.5 组件与服务,哪个的粒度更大

在软件开发中,组件和服务的粒度主要取决于其功能可复用性。一般情况下,组件的粒度比服务更大,因为组件通常是独立、可复用的模块,它们可以提供多种不同的功能。而服务则更多地关注于某种特定的功能或服务,其粒度相对较小。

例如,一个用户管理模块可以被视为一个组件,它可以包含用户信息管理、用户权限管理、用户组管理等多个子模块。而将修改用户密码的功能抽象出来作为一个服务,则更为合适。

另一方面,有些服务的粒度也可以很大,尤其是在分布式系统中,服务可能涉及多个模块或者包含多个子服务,其中每个子服务都可以被视为一个独立的服务

综上所述,组件和服务的粒度没有绝对的先后之分,它们的具体粒度取决于实际的需求和设计。在实际开发中,我们需要根据实际需求来判断何时将某个功能封装为组件,何时将其实现为服务,以及组件和服务之间的交互方式等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue中插槽slot

一、插槽-默认插槽 1.作用 让组件内部的一些 结构 支持 自定义 2.需求 将需要多次显示的对话框,封装成一个组件 3.问题 组件的内容部分,不希望写死,希望能使用的时候自定义。怎么办 4.插槽的基本语法 组件内需要定制的结构部分,改用&l…

Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审…

19 款Agent产品工具合集

原文:19 款Agent产品工具合集 什么是Agent? 你告诉GPT完成一项任务,它就会完成一项任务。 如果你不想为GPT提出所有任务怎么办?如果你想让GPT自己思考怎么办? 想象一下,你创建了一个AI,你可以给它一个…

Scala语言使用Selenium库编写网络爬虫

目录 一、引言 二、环境准备 三、爬虫程序设计 1、导入必要的库和包 2、启动浏览器驱动程序 3、抓取网页内容 4. 提取特定信息 5. 数据存储和处理 四、优化和扩展 五、结语 一、引言 网络爬虫是一种自动抓取互联网信息的程序。它们按照一定的规则和算法,…

基于ruoyi框架项目-部署到服务器上

基于ruoyi框架项目-部署到服务器上 文章目录 基于ruoyi框架项目-部署到服务器上1.前端vue编译,后的dist下内容打包(前后端分离版本需要)2.后端打包成jar包(如果是thymeleaf仅需打包jar)3.上传到服务器目录下4. docker部…

linux的美化工具 oh-my-zsh的安装与使用 神器工具

目录 1 安装zsh的环境2 安装 Oh My Zsh3 主题设置重新启动终端:关闭连接 在重新链接一下附加 -插件管理案例讲解看效果 Oh My Zsh 是一款基于 Zsh 的开源命令行工具,它提供了丰富的主题和插件,可以帮助用户更加高效地使用终端。本文将详细介绍 Oh My Zsh…

【Redis】Redis与SSM整合Redis注解式缓存Redis解决缓存问题

一&#xff0c;Redis与ssm整合 1.1 pom.xml配置 在pom.xml中配置相关的redis文件 redis文件&#xff1a; <redis.version>2.9.0</redis.version> <redis.spring.version>1.7.1.RELEASE</redis.spring.version><dependency><groupId>red…

第三章:人工智能深度学习教程-基础神经网络(第二节-ANN 和 BNN 的区别)

在本文中&#xff0c;我们将了解单层感知器及其使用 TensorFlow 库在Python中的实现。神经网络的工作方式与我们的生物神经元的工作方式相同。 生物神经元的结构 生物神经元具有三个基本功能 接收外部信号。 处理信号并增强是否需要发送信息。 将信号传递给目标细胞&#x…

Fourier分析导论——第4章——Fourier级数的一些应用(E.M. Stein R. Shakarchi)

第 4 章 傅里叶级数的一些应用 Fourier series and analogous expansions intervene very naturally in the general theory of curves and surfaces. In effect, this theory, conceived from the point of view of analysis, deals obviously with the study of arbitra…

ActiveMq学习⑦__ActiveMq协议

问题一、默认的61616端口如何更改&#xff1f; 问题二、你生产上的链接协议如何配置的&#xff1f;使用tcp吗&#xff1f; ActiveMQ 支持的client-broker 通讯协议有&#xff1a;TVP、NIO、UDP、SSL、Http(s)、VM。 其中配置TransportConnector 的文件在ActiveMQ 安装目录的co…

04【保姆级】-GO语言指针

之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&#xff0c;然后know why。先做出来&#xff0c;然后再去一点点研究&#xff0c;才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…

二蛋赠书七期:《云原生数据中台:架构、方法论与实践》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(简单支持发起人与审批人的流程)续

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 之前生产的xml&#xff0c;在bpmn设计里编辑有些内容不正确&#xff0c;包括审批人&#xff0c;关联表单等…

【蓝桥杯选拔赛真题13】C++最短距离 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

C/C++最短距离 第十二届青少组蓝桥杯C++选拔赛真题 一、题目要求 1、编程实现 有一个居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 1,2,3……,当排满一行时,从下一行相邻的楼往反方向排号。 例如:小区为 3 行 6 列,矩阵排列方式: 要求:已知小区…

vue:如何实现通过判断数组中每个对象的其中一个属性,从而更改另一个属性的值

1、假设一个box为一个包含多个对象的数组&#xff0c;这个box数组可以在方法中定义也可以在data域中定义 let box [{ id: 1, status: 审批中 },{ id: 2, status: 已通过 },{ id: 3, status: 未通过 } ];2、在methods域中写一个方法遍历这个box数组判断每个对象中的status属性是…

Linux 服务器监控

服务器几乎与任何 IT 基础设施密不可分&#xff0c;Linux 是服务器兼容性最强的开源操作系统&#xff0c;因为它具有灵活性、一致性和安全性。大多数 Linux 服务器都设置了以下 Linux 操作系统的任何变体&#xff1a;Red Hat Enterprise Linux &#xff08;RHEL&#xff09;、D…

clickhouse安装与远程访问

安装&#xff08;本文以ubuntu系统为例&#xff09; 单节点设置​ 为了延迟演示分布式环境的复杂性&#xff0c;我们将首先在单个服务器或虚拟机上部署ClickHouse。ClickHouse通常是从deb或rpm包安装&#xff0c;但对于不支持它们的操作系统也有其他方法。 例如&#xff0c;…

Markdown写作应用推荐

MWeb Pro 是一款适用于macOS的专业Markdown写作、笔记本应用软件。喜欢写博客的朋友&#xff0c;那你一定会需要 MWeb Pro 这款软件。为您提供最佳的写作体验。 Markdown 语法支持&#xff1a; 使用 Github Flavored Markdown 语法&#xff0c;简称 GFM 语法。支持表格、TOC、…

吴恩达《机器学习》6-4->6-7:代价函数、简化代价函数与梯度下降、高级优化、多元分类:一对多

一、代价函数 逻辑回归的代价函数是用来度量模型预测与实际结果之间的差异的。与线性回归使用均方误差不同&#xff0c;逻辑回归使用的代价函数在数学上更为复杂。为了理解逻辑回归的代价函数&#xff0c;首先要明白逻辑回归的假设函数&#xff1a; ℎ&#x1d703;(&#x1…

消息代理与事件代理:何时使用它们

选择正确的工具来满足异步处理需求的技术指南 作为后端开发人员&#xff0c;有一天你需要回答这个问题&#xff1a; 我需要构建一个使用分布式队列的异步应用程序&#xff0c;我应该使用哪个代理&#xff1f; 作为工程师&#xff0c;我们的本能是列出我们了解或希望熟悉的工具&…