简介
本篇博客记录了我在软件工程学习过程中关于软件需求与面向对象基础知识的学习体会和要点总结。博客共分为三个关卡内容:第1关围绕“软件需求”的定义、分类及分析过程展开,让我清晰地理解了功能性需求、非功能性需求与约束条件的区别;第2关深入探讨了如何构思有创意的软件需求,包括技术、思想、素材和用户视角的多维思考;第3关则介绍了面向对象软件工程的基本思想、产生背景及核心概念,如类、对象、继承、多态、消息传递等。通过这三关的系统学习,我不仅夯实了软件开发中前期需求分析的基础,还初步理解了面向对象建模与设计的逻辑,对后续学习UML、用例建模等内容产生了浓厚兴趣。本文旨在梳理知识点,加深理解,供今后复习与项目实践参考。
第1关:软件需求
任务描述
本关任务:了解软件需求的内涵和软件需求分析的任务,掌握软件需求的分类,完成相应的选择题。
相关知识
何为软件需求
获取和分析软件需求是软件开发的前提,只有明确了软件需求,后续的软件设计与建模、代码编写与测试等软件开发活动才有基础和依据,因而需求获取和分析在整个软件开发过程中发挥着前导性、关键性的作用。
软件需求是指软件系统的利益相关者对软件系统的功能、质量等方面,以及软件系统在运行环境、资源消耗、提交进度等方面的期望和要求。具体表现为两个方面:
(1)功能性需求
用户对软件系统能够完成何种功能以及在某些场景下软件系统能够展现何种外部可见行为或效果的要求。
(2)非功能性需求
用户对软件系统的质量属性、运行环境、资源约束、外部接口等方面的要求,包括:运行性能、可靠性、易用性、安全性、对外接口、可维护性等等。
软件需求通常来自于软件系统的利益相关者,在空巢老人智能看护系统中,利益相关者为老人及家属,他们提出了具体需求;但是软件工程师也可代表用户来构思和提出需求,比如微信、12306 等 app,是由软件工程师代表用户提出需求。
软件需求的类别
软件需求的类别可以分为三类:
功能(Functional)
能够完成的功能及在某些场景下可展现的外部可见行为或效果。示例:自主跟随老人、获取老人图像和视频信息、检测老人是否摔倒等;
非功能(Non-Functional)
软件系统在质量属性、运行环境、资源约束、外部接口等要求。示例:性能、可靠性、易用性、安全性、接口、可维护性等;
约束(Constraint)
成本、进度、技术选型、标准和规范等要求。示例:如成本不能超出 50 万元,要求半年内交付使用等等。
软件需求分析的任务和过程
软件需求获取和分析的任务是,通过与用户的沟通和交互,获得用户关于软件系统的期望和要求,即软件需求;在此基础上对软件需求进行建模和分析,产生准确、一致、直观、可视化的软件需求模型,并在此基础上形成规范化的软件需求文档。软件需求获取和分析的过程如图 1 所示,它包含以下三项软件开发活动。
图1 软件需求分析的过程
作答要求
根据相关知识,按照要求完成右侧选择题任务。作答完毕,通过点击“测评”,可以验证答案的正确性。
题目
1、
软件需求的类别不包含以下哪类?
A、功能性
B、可靠性
C、非功能性
D、约束
答案
B
思考
案例分析:12306订票系统的需求分类
功能性需求:用户可以注册、登录、查询车票、预订车票、在线支付、取消订单等。
非功能性需求:系统需支持高并发访问(春运期间)、提供良好的界面交互体验、安全性保障(如短信验证码、实名认证)、操作简单易懂。
约束性需求:系统必须接入国家支付平台、每天凌晨进行系统维护、部署在政府指定数据中心,开发周期不得超过6个月。
软件需求规格说明书(SRS)模板结构简要
引言:描述项目背景、目标、术语解释
总体描述:系统环境、用户特征、约束条件
功能需求:详细列出系统必须具备的功能模块
非功能需求:性能、安全性、可维护性等
外部接口:数据库、硬件、软件等接口描述
附录:相关参考资料、术语表等
第2关:软件需求构思和创意
任务描述
本关任务:了解构思软件需求的背景以及什么是有创意的软件需求,掌握如何构思有创意的软件需求,完成相应的选择题。
相关知识
构思软件需求
在软件开发时,常常会遇到这样的问题:
想开发一个软件系统,但是没有明确的利益相关者;
有明确利益相关者,但是找不到这样的用户能够提供需求。
比如微信、QQ 在开发时,虽然有明确的利益相关者,但是用户其实也不清楚自己的需求,不能够提出明确的需求。
这时候需要软件开发人员担任用户的角色,构思和导出待开发软件系统的需求,微信软件系统的需求就是由微信开发团队提出的。
正是在这样的背景下,产生了构思软件需求,具体内容为:明确软件系统欲解决的应用问题及其潜在的用户,通过对相关应用领域的调研和分析以及与软件系统目标用户的沟通和交流,明确用户的期望和要求,获取软件系统的需求。在某些情况下(如暂时找不到合适的目标用户),软件开发人员可代表用户来构思软件系统的需求。该活动的输出是用自然语言描述的软件需求。
构思有创意的软件需求
在构思软件需求时,需要有创意,才能带来价值:
创意带来新产品
创意带来用户
创意带来市场和利润
创意带来发展
那么什么样的需求才有创意?
创意基于欲解决的问题,产生基于计算机软件的解决方法,能够展示有价值、独特性、新颖性、有效性等特征。
有创意软件的特点通常有以下几点:
创意来自于欲解决的新颖问题(Needs)
创意来自于解决问题的独特方式(Approach)
创意来自于给用户带来的好处(Benefits)
创意来自于你强于对手(Competitors)
空巢老人智能看护系统属于有创意的软件需求,因为其符合以下两点特征:
欲解决的问题有价值。看护老人已经成为一个全社会迫切解决的问题,对老人、家属、医院等都有实际的需求;
解决方法的新颖性和独特性。传统上人们需要依靠保姆、家人等来看护老人,现在通过计算机软件以及相应的信息系统(包括机器人和智能手机等)来解决这一问题。
如何构思和创意软件需求
想要构思有创意的软件需求,可以从如下几个方面着手:
突发奇想,奇思妙想。根据用户的新期望或者不经意的讨论,发现新的问题和应用;
技术层面的创意。利用新技术,或者集成和综合多项技术来解决问题;
互联网大众的想法。根据开源社区中大众的建议和问题,拓展思路;
思想。思维活跃,思路开放,开阔视野,不拘泥于现实;
素材。既要留意当前学习、生活和工作中的方方面面,并从中寻找有意义、有价值的应用问题和需求,也要着眼于未来构思未来的问题及需求;
方法。既要了解和掌握现有问题的解决方法和手段,也要敢于现象如何借助于以计算机软件为核心的信息系统来解决问题;
开展调研分析,切忌拍脑袋凭空想问题。查询文献资料,了解状况需求,分析已有技术和产品,掌握现有方式方法,形成对问题及解决方法理解和判断,做到有理有据,进行缜密论证;
不断反复论证,切忌不切实际的想象。构思须进行反复的思考、推敲、研究和论证,放弃不现实不切实际问题,深化有价值、有意义、可实现的问题;
寻求有意义、有价值的问题。确保所提出的问题有现实意义,对用户有价值。
持续深化、改进和提高。进行反复讨论,寻求创意点,发现潜在问题,调整关注点,不断进行权衡和折中,分析可行性等等。
构思有创意的软件需求,最终产生的的软件制品为:
软件需求构思和创意文档(文档)
软件需求模型(模型)
软件需求规格说明书(文档)
作答要求
根据相关知识,按照要求完成右侧选择题任务。作答完毕,通过点击“测评”,可以验证答案的正确性。
题目
1、
有创意软件的特点通常有哪些?
A、创意来自于欲解决的新颖问题
B、创意来自于解决问题的独特方式
C、创意来自于给用户带来的好处
D、创意来自于你强于对手
答案
ABCD
思考
创意案例:校园跑腿服务平台
背景问题:学生经常忙于上课或天气不便出门
创意功能:拍照下单(上传代办清单)、地图智能派单、订单跟踪、微信通知提醒
受众用户:高校学生、宿舍管理员
非功能性亮点:支持微信小程序、实时定位追踪、评分机制增加信任度
用户调研与需求来源
设计一份调研问卷(可用问卷星):
“您是否经常因天气、课程原因需要他人帮忙代买物品?”
“您更倾向于通过什么方式发出代办请求?”
第3关:面向对象软件工程基础
任务描述
本关任务:了解面向对象软件工程的产生背景及基本思想,掌握面向对象的基本概念,完成相应的选择题。
相关知识
产生背景
在面向对象软件工程产生之前,人们通常采用结构化软件工程的方法来开发软件。结构软件工程包括结构化需求分析、结构化软件设计、结构化程序设计等。具体内容如下:
结构化需求分析采用诸如数据流图等技术来表示和分析软件需求;
结构化软件设计采用层次图、模块图等技术来描述软件设计模型;
结构化程序设计则借助于过程、函数等程序设计机制及相应的语言(如C、Pascal等)来编写程序代码。
结构化软件工程采用不同的模型、语言、机制等来描述软件需求、建立设计模型、构造程序代码,这就意味着软件开发的不同阶段需要采用不同的抽象来对软件系统进行建模,从而建立起基于不同抽象的软件模型,任何的软件开发活动(无论是需求分析、软件设计还是程序设计)都需要解决不同模型之间的转换和精化问题,无疑这极大增加了软件开发的复杂性,难以应对大规模、复杂软件系统的开发。存在的问题及局限如下:
问题模型(即需求模型,如数据流图)与现实世界不一致,导致需求模型不自然、不直观、难以理解;
解模型(即设计实现模型,如模块图)与问题模型不一致,导致需要进行转换,带来开发的复杂性;
模块粒度较小,封装程度不高,可重用性不好。
因此,对软件工程提出了新的要求:
用贴近现实世界的抽象来表示软件系统的需求,建立起更为自然和直观的需求模型。
采用相同的抽象来表示问题模型和解模型。减少从需求到设计的概念鸿沟,缩减问题空间与解空间的距离;实现自然、平稳过渡,简化在二者间架设“桥梁”的工作。
提供更大粒度的封装,以更好地支持软件重用,更好地体现模块化、高内聚度低耦合度、信息隐藏原则。
在这样的背景下,面向对象软件工程应运而生,以解决结构化软件工程的内在不足和存在的局限。
面向对象软件工程的基本思想
面向对象软件工程认为,无论是现实世界(应用问题)还是计算机世界(软件系统),它们都是由多样化的对象所构成的,这些对象之间通过一系列的交互来展示行为、实现功能和提供服务。软件开发人员可以面向对象软件工程所提供的对象、类、属性、操作、消息、继承等概念来表示现实世界的应用,从而建立起软件需求模型,描述软件系统的需求,也可来表示计算机世界的软件系统,从而建立起软件模型,描述软件系统的解决方案。
面向对象分析
将软件系统的需求,尤其是功能性需求,表征为问题域中对象的方法以及它们之间的协作,也即借助于面向对象软件工程所提供的核心概念来表示应用系统的组成、功能、行为等等,进而建立起软件系统的需求模型。
例如,通过对象、类等来描述和分析应用系统的构成,借助类的方法来描述和分析应用系统的行为,利用消息机制来分析多个对象之间如何通过协作来提供功能和服务。一般地,面向对象分析将产生若干基于面向对象概念的软件需求模型,如用例模型、交互模型、分析类模型等等。
面向对象设计
根据面向对象的需求模型,结合编程实现的约束与限制(如所采用的面向对象程序设计语言等),对目标软件系统进行设计,给出实现软件需求的解决方案。面向对象的软件设计仍然借助于面向对象核心概念,从不同层次、不同的视点描述软件设计模型。
例如,目标软件系统整体上由哪些子系统、构件和包等构成,每个子系统和构件内部包含哪些类、每个类封装了哪些属性和方法、不同对象之间如何通过消息传递来进行协同,从而来实现软件系统的功能等等。不同于结构化软件设计,面向对象设计是通过对面向对象需求模型进行不断精化(而非模型转换)而得到的。一般地,面向对象设计将产生若干软件设计模型,如软件体系结构模型、软构件模型、设计类模型、交互和协作模型、状态模型等等。
面向对象编码
根据软件设计模型,采用特定的面向对象程序设计语言(如 C++、Java、Python 等等),编写目标软件系统的程序代码。软件设计模型中的相关设计元素将直接用程序设计语言所提供的编程元素和机制来加以实现。
面向对象的基本概念
面向对象软件工程提供了一组有别于结构化软件工程的概念和抽象来支持系统的分析、建模、设计、实现和测试。具体地,这些概念描述如下。
对象(Object)
它是对现实世界和计算机世界中个体、事物或者实体的抽象表示。例如,可以用对象表示应用领域的一个事物(如NAO机器人),也可以用它来表示在计算机软件中的某个运行元素或单元(如运行实例)。每个对象都有其属性和操作。属性表示对象性质,属性的值定义了对象的状态;操作也称方法,表示对象所能提供的服务,它定义了对象的行为。一般地,对象的属性只能由该对象的操作来存取或修改。
类(Class)
顾名思义,类是一种分类和组织机制。它是对一组具有相同特征对象的抽象。通俗地讲,通过类可以对不同的对象进行分类,将具有相同特征的对象组织为一类。所谓的相同特征是指具有相同的属性和方法。每个类都封装了属性和方法。对象是类的实例,类是创建对象的模板,也即可以根据类模板来创建一个个具体、具有多样状态的对象。基于某个类创建一个对象后,那么该对象就具有这个类所封装的属性和方法。相比较而言,类是静态和抽象的,对象是动态和具体的。
消息(Message)
消息是对象间进行通信的手段,也是一个对象与另一个对象进行交互和协作的方式。一个对象通过向另一个对象发送消息,从而来请求相应的服务。当一个对象发送消息时,它需要描述清楚接收方对象的名称以及所请求方法的名称及参数。对象之间的消息可以是同步消息,即请求者对象需要等待响应者对象的处理结果;也可以是异步消息,即请求者对象发出消息后继续自己工作,无需等待响应者对象返回结果。
继承(Inheritance)
继承描述了类与类之间的一般与特殊关系。它本质上是对现实世界不同实体间遗传关系的一种直观表示,也是对计算机软件中不同类进行层次化组织的一种机制。一个类(称之为子类)可以通过继承关系来共享另一个类(称之为父类)的属性和方法,从而实现子类对父类属性和方法的重用。当然,子类在共享父类属性和方法的同时,也可以拥有自己独有的属性和方法。继承既可以表现为单重继承,即一个子类至多继承一个父类,也可以表现为多重继承,即一个子类可以继承多个父类。
多态(Polymorphism)
多态是针对方法而言的,它是指同一个方法作用于不同的对象上可以有不同的解释,并产生不同的执行结果。换句话说,同一个方法虽然其操作名称和接口定义形式相同,但是该方法在不同对象上的实现形态不一样。因此,当一个对象给若干个对象发送相同的消息时,每个消息接收方对象将根据自己所属类中定义的这个方法去执行,从而产生不同的结果。
覆盖(Override)
一个子类可以通过继承来获得父类的属性和方法。然而,子类也可以在自己的类中增加或者重新定义所继承的属性和方法,从而用新定义的属性和方法来覆盖所继承的、来自父类中的属性或方法。示例代码如下:
public class A{String name;public String getValue(){return “Value is:” + name;} }
public class B extends A {String address;public String getValue () {return “Value is:” + address; }}
可以看出,子类 B 重新定义所继承的方法 getValue。
重载(Overload)
一个类中允许有多个名称相同但是参数不同的方法。由于这些方法在具体的参数数目及类型上有所区别,因而系统将根据接收到消息的实参来引用不同的方法。示例代码如下:
Public class A {int age;String name;public void setValue(int agePara){age = agePara; }public void setValue(String namePara){name = namePara;}
}
关联(Association)
关联描述了类与类之间的关系,它具有多种形式,如聚合(Aggregation)、组合(Composition)等等。聚合和组合均刻画了类与类之间的部分-整体关系,即部分类的对象是整体类对象的组成部分,或者说整体类对象由部分类对象所组成。相比较而言,聚合描述的是一种简单的整体部分关系,而组合刻画的是一种更为特殊的整体部分特殊关系,它更加强调整体类对象和部分类对象之间的共生关系。
示例
聚合关系:老师与大学
组合关系:校长与大学
作答要求
根据相关知识,按照要求完成右侧选择题任务。作答完毕,通过点击“测评”,可以验证答案的正确性。
题目
1、
一个类(称之为子类)不可以通过继承关系来共享另一个类(称之为父类)的属性和方法。
A、对
B、错
答案
B
思考
UML类图实例:图书管理系统
类1:Book
属性:书名、作者、ISBN、库存量
方法:借出、归还、查看信息
类2:User
属性:用户名、学号、借阅记录
方法:借书、还书、查询借阅情况
类3:Admin
属性:账户、权限等级
方法:添加图书、删除图书、查看库存
类之间关系:
User → 借阅 → Book (关联)
Admin → 管理 → Book(聚合)
面向对象核心概念代码示例
class Book {String title;String author;void borrow() {System.out.println("已借出:" + title);}
}class Student extends User {@Overridevoid borrowBook(Book book) {System.out.println("学生借书:" + book.title);}
}
总结
通过本次关于软件需求与面向对象软件工程基础的学习,我深刻认识到“需求”是整个软件开发流程中的核心与起点。只有明确、规范地获取并分析用户需求,后续的设计、开发和测试才有明确的方向。特别是在第2关中,构思有创意的软件需求让我认识到,软件开发不仅仅是写代码,更是解决实际问题的过程,需要不断洞察用户的潜在需求。第3关的面向对象知识为我搭建了一个认识软件世界的新视角,理解了类与对象的映射关系,也逐渐明白了封装、继承、多态等原则在实际系统设计中的意义。整个学习过程内容结构清晰、逻辑紧密,为我后续学习软件工程建模方法、面向对象分析与设计等内容打下了坚实基础。同时,我也意识到,理论学习和实际应用需要相互结合,只有在项目中不断实践,才能真正掌握并应用这些知识。