第一部分软件工程基础1_第1页
第一部分软件工程基础1_第2页
第一部分软件工程基础1_第3页
第一部分软件工程基础1_第4页
第一部分软件工程基础1_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、软件工程方法与实践(第3版)窦万峰计算机科学与技术学院南京师范大学2016年12月 第一部分:软件工程基础什么是软件工程?什么是软件危机?如何解决?什么是软件过程?有哪些过程模型?如何选择与建立过程模型?什么是统一过程?什么是敏捷过程?有哪些方法?什么是结对编程?有何优缺点?第1章 软件工程概述(内容提要)什么是软件?软件的要素有哪些?什么是软件工程?其要素有哪些?软件危机与工程化思想软件工程基本原理与基本原则软件工程方法学什么是软件?三要素:软件=程序+文档+数据特性:复杂性一致性退化性易变性移植性高成本软件技术演化第一阶段:程序设计阶段。1946年到60年代初:个体手工方式。 第二阶段:程

2、序系统阶段。60年代初到70年代初:小组化生产,出现软件危机。第三阶段:传统软件工程阶段。20世纪70年代中期至80年代中期:把工程化的思想引入到软件开发中,结构化方法的发展,规模化软件开发。第四阶段:面向对象阶段。20世纪80年代中期至今:面向对象方法学发展,软件定制和满足客户需求。发展趋势软件服务:云服务、大数据服务多样性:中间件开放性:新型中间件平台软件危机两个方面的问题:如何开发软件如何维护软件表现:规模大、复杂度增加供需差增大价格昂贵开发速度慢质量难以保证软件危机解决途径重视需求分析,明确与确切表达需求重视与客户沟通与交流统一的、公认的方法论和规范指导重视设计和实现过程的资料充分的检

3、测工作软件工程定义软件工程运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必须的相关文件资料。软件工程是为了经济地获得能够在实际机器上有效运行的可靠软件而建立和使用的一系列完善的工程化原则。软件工程是开发、运行、维护和修复软件的系统方法。软件工程三要素工程化思想把软件看作是一个工程产品两个方面:软件开发技术软件工程管理原因:缺乏软件过程控制能力能力成熟模型(Capability Maturity Model)体现:工程化管理软件工程管理软件工程基本原理推迟实现原理逐步求精原理分解与抽象原理信息隐蔽原理质量保证原理软件工程基本原则分阶段的软件生存周期坚持进行阶段评审实行严

4、格的产品控制采用现代程序设计技术明确职责开发小组的人员应少而精不断改进开发过程软件工程两大范型结构化开发范型特征:结构化技术要么面向行为,要么面向数据构成结构化开发范型的技术包括:结构化分析结构化设计结构化编程结构化测试结构化维护软件工程两大范型面向对象范型特征:将对象视作一个融合了数据及在其上操作的行为的、统一的软件组件。技术包括:面向对象分析面向对象设计面向对象编程面向对象测试面向对象维护优势:对象的概念符合业务或领域的客观实际维护容易重型与轻型软件工程重型软件工程文档齐全规范化和程式化周期长推迟实现轻型软件工程非正式交流重视代码重视测试响应需求变化小结软件工程的是主旨以工程化的思想进行软

5、件开发,以生产高质量和高效率的软件。软件工程化思想的核心是,把软件看作是一个工程产品。软件工程方法学分别是传统结构化范型和面向对象范型。第2章 软件过程(内容提要)什么是软件过程?软件产品与过程软件生存周期软件工程活动软件过程定义:软件过程是为了开发出软件产品,或者是为了完成软件工程项目而需要完成的有关软件工程的活动通常使用生存周期模型简洁地描述软件过程层次:软件工程是一门建立在以质量焦点为基础的层次化综合技术过程:定义阶段和管理方法:技术支持工具:自动化实施支持软件过程框架定义:框架是实现整个软件开发活动的基础,并且那些与过程有关的角色、职责的定义以及实现也都离不开框架的支持两个方面的内容组

6、织及管理框架技术及工具框架软件过程环境组织、管理的角色和职责技术环境软件过程框架组织与管理框架:过程改进活动及角色与职责技术与工具框架:技术及自动化活动工具框架活动:沟通策划建模构建部署软件生存周期过程(表2-1)系统语境的过程协议过程组(2个过程,13个活动,52个任务)项目过程组(7个过程,23个活动,72个任务)技术过程组(11个过程,26个活动,64个任务)组织上项目使能过程组(5个过程,15个活动,48个任务)针对软件开发的过程软件实现过程组(7个过程,7个活动,39个任务)软件支持过程组(8个过程,25个活动,68个任务)软件复用过程组(3个过程,14个活动,62个任务)软件产品与

7、过程把软件看成产品,必然注重软件的质量,决定了软件过程、周期和成本。产品依赖过程,其就是过程定义的一系列活动和任务的结果。软件产品越复杂,其开发周期也越长,开发成本越高。软件过程评估产品与过程选择软件过程过程评估CMMI/CMMISO9001:2000个人软件过程(PSP)团队软件过程(TSP)个人软件过程(PSP)内容PSP0是PSP的个人度量过程,其目的是建立个体过程基线。PSP1是个人规划过程,引入了基于估计的计划方法PROBE,用自己的历史数据来预测新程序大小和开发时间,并使用线性回归方法估计参数,确定置信区间以评价预测的可信程度。PSP2是个人质量管理,根据程序的缺陷建立检测表,按照

8、检测表进行设计复查和代码复查,以便及早发现缺陷,使修复缺陷的代价最小。PSP3的目标是把个体开发小程序所能达到的生产效率和生产质量,延伸到大型程序。团队软件过程(TSP)TSP 采用了循环递增的开发策略,整个软件生产过程由多个循环出现的开发周期组成,每个开发周期划分出若干个相对独立的阶段。TSP 提供了如下方法:计划评审设计和编码标准设计和代码评审方法缺陷评审质量分析软件生存周期软件也有一个从生到死的过程,这个过程一般称之为软件的软件生存周期或生命周期(Software Development Life Cycle)软件生存周期可划分为定义、开发和运行三个时期,每个时期又细分为若干个阶段。把整

9、个软件生存周期划分为若干阶段,使得每个阶段有明确的任务,使规模大,结构复杂和管理复杂的软件开发变的容易控制和管理。软件生存周期包括可行性分析、项目计划、需求分析、软件设计、编码与测试、维护等阶段,每个阶段有包含一系列的活动。软件过程活动沟通活动计划活动建模活动实现活动部署活动维护活动管理活动过程改进活动小结大多数软件开发过程都有一个共同的软件过程框架,即沟通、策划、建模、构建和部署的过程。每个过程有包含一系列小的任务或活动。对于开发大型复杂的软件,建议采用重型软件过程模型,如螺旋模型、统一过程模型等;对于需求稳定或简单的软件,建议采用轻型软件过程模型,如极限编程、瀑布模型等。软件工程活动包括沟

10、通活动、计划活动、建模活动、构造活动、部署活动、维护活动、管理活动和过程改进活动。第3章 软件过程模型(内容提要)瀑布模型增量模型螺旋模型构建集成模型统一过程模型软件过程模型把软件生命周期中各项开发活动的流程用一个合理的框架开发模型来规范描述,这就是软件过程模型,也称为软件生命周期模型.软件过程模型是一种就是软件过程抽象.软件过程模型是从一个特定的角度表现一个过程,一般使用直观的图形标识软件开发的过程,主要根据软件的类型、规模,特别是软件的开发方法、开发环境等多种因素确立过程模型。瀑布模型瀑布模型将软件生命周期划分为软件计划、需求分析和定义、设计、实现、测试、运行和维护这6个阶段,规定了它们自

11、上而下、相互衔接的固定次序,如同瀑布流水逐级下落。从本质来讲,它是一个软件开发架构,开发过程是通过一系列阶段顺序展开的,从系统需求分析开始直到产品发布和维护,每个阶段都会产生循环反馈.瀑布模型示意图瀑布模型它是一个软件开发架构,开发过程是通过一系列阶段顺序展开的。每个阶段都会产生循环反馈各个阶段产生的文档是维护软件产品时必不可少的,没有文档的软件几乎是不可能维护的。瀑布模型是一种文档驱动的过程模型瀑布模型特点顺序性和依赖性推迟实现质量保证的观点是一种线性模型强调文档的作用增量模型增量模型(Incremental Model)也称为渐增模型,是在项目的开发过程中以一系列的增量方式开发系统。软件被

12、作为一系列的增量构件来设计、实现、集成和测试,每一个构件是由多种相互作用的模块所形成的提供特定功能的代码片段构成.增量方式包括:增量开发:以一定的时间间隔开发部分工作软件增量提交:以一定的时间间隔增量方式向用户提交工作软件及相应文档增量模型融合了线性顺序模型的基本成份和原型实现模型的迭代特征。增量模型分为渐增模型和原型模型渐增模型是瀑布模型的变种,有两类渐增模型:增量构造模型:它在瀑布模型基础上,对一些阶段进行整体开发,对另一些阶段进行增量开发。前面的开发阶段按瀑布模型进行整体开发,后面的开发阶段按增量提交。演化提交模型:它在瀑布模型的基础上,所有阶段都进行增量开发,也就是说不仅是增量开发,也

13、是增量提交。增量构造模型需求分析设计编码1测试1测试2编码2编码3测试3螺旋模型螺旋模型(Spiral Model)是结合了瀑布模型和快速原型模型的迭代开发模型强调了其他模型均忽略了的风险分析:风险识别风险分析风险控制特别适合于大型复杂的系统每一个周期都包括需求定义、风险分析、工程实现和评审螺旋模型示意图螺旋模型活动四个象限分别代表了以下活动:制定计划:确定软件目标,选定实施方案,确定项目开发的限制条件; 风险分析:分析评估所选方案,考虑如何识别和消除风险;实施工程:实施软件开发和验证;客户评估:评价开发工作,提出修正建议,制定下一步计划。螺旋模型是风险驱动的模型面向对象过程模型面向对象是一种

14、的程序设计方法,或者说它是一种程序设计范型。基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。面向对象的要素: 抽象:强调实体的本质、内在的属性,忽略一些无关紧要的属性。类实现了对象的数据(即状态)和行为的抽象,是对象的共性的抽象。封装性:指所有软件部件内部都有明确的范围以及清楚的外部边界。 共享性:面向对象的特征:对象惟一性;分类性;继承性;多态性(多形性)。构件集成模型构件集成模型是基于构件的开发模型构件集成模型:整个系统模块化复用构件库中的软件构件构件集成模型是演化形的,开发过程是迭代的5个阶段:软件的需求分析和定义体系结构设计构件库建立应用软件构建测试和发布构件集成模型

15、需求分析和定义体系结构设计构件库建立测试和发布应用软件构建1:N统一过程A software development process:是一个将用户需求转化为软件系统所需要的活动的集合。A process framework:一个简单的过程,也是一个通用的过程框架。Component-based:软件构件+接口The standard - employing the UML(Unified Modeling Language)use-case drivenarchitecture-centriciterative and incrementalThe Evolution of the Unifi

16、ed Process1967: a predecessorof Objectory1976-80: formalization &generalization1997: Objectory 4.11987-95: Objectory 1.0-3.8SDLA book: The Unified ProcessA product: The Rational Unified Process1998: Unified ProcessOMTBoochRationals best practices: Kruchten Royce and many othersThe Next Industry Stan

17、dardA Software Development ProcessSoftware development is the process of developing software from requirements.New or changedrequirementsNew or changed systemSoftware DevelopmentProcess统一过程是用况驱动的用况模型(use case model)要素:用户(user)用况(use case)动作(action)用况驱动(use-case driven):用况可以驱动开发过程:用况不只是确定系统需求的工具,还能驱动

18、系统设计、实现和测试的进行。不能孤立地选择用况统一过程是以构架为中心的软件构架包含了系统中最重要的静态和动态特征构架刻画了系统的整体设计,突出系统的重要特征构架的价值依赖于执行该任务的人的素质过程可以帮助构架设计师确定正确的目标用况和构架的关系:用况对应功能(function)构架对应表现形式(form)用况和构架相互影响,并必须进化统一过程是以构架为中心的构架设计师应遵循的四个步骤:针对通用用况,创建一个粗略的构架轮廓处理已经确定的重要用况子集用况完善继续上述过程统一过程是迭代和增量的划分为袖珍项目(mini-project):一个增量的迭代过程迭代是指工作流中的步骤,迭代过程必须是受控的目

19、标:处理一组过程,风险分析做法:标识与描述用况选定构架创建设计选择构件实现设计验证Phases in the Software LifecycleThe Unified Process has four phases:Inception Defining the scope of the projectElaboration Planning, specifying features and designing architectureConstruction Building the productTransition Transitioning the product into its u

20、ser communitytimeInceptionElaborationConstructionTransitionMajor milestones统一过程模型统一过程(Unified Process,UP) 是风险驱动的、基于用例技术的、以架构为中心的、迭代的、可配置的软件开发流程。统一过程是以用例驱动的,以架构为中心,迭代和增量的过程。统一过程是一个软件开发过程,是一个通用的过程框架:初始细化构造移交统一过程的四个阶段统一过程五个核心工作流需求(Requirements Capture):致力于开发正确的系统分析(Analysis):更精确地理解需求设计(Design):深入理解与非功能

21、性需求和约束相联系的问题实现(Implementation):实现系统与集成测试(Test):验证实现的结构核心工作流统一过程准则准则迭代的开发软件需求管理基于构件的体系结构可视化软件建模验证软件质量控制软件的变更统一过程主要的优点是提高了团队生产力工作流与模型RequirementsCaptureDesignImplementationTestAnalysisUse CaseModelDesignModelDeploymentModelImplementationModelAnalysisModelTestModelEach workflow is associated with one o

22、r more models.统一过程生命周期产品源代码各种手册相关交付品模型用况模型分析模型设计模型实现模型实施模型测试模型领域模型或业务模型统一过程生命周期里程碑和里程碑用途开发过程工作流:需求分析设计实现测试一个综合的过程软件开发的四个要素人员项目产品过程人员至关重要开发过程影响人员角色会发生变化角色实例项目创造产品三要素:一系列变化一系列迭代组织模式产品不仅仅是代码软件系统制品系统包含一组模型什么是模型?视图模型内部模型间的关系过程指导项目过程:一个模板过程过程实例软件开发过程工作流过程具体化过程的价值工具用况驱动过程统一过程的目标:指导开发人员有效地实现并实施满足客户需求的系统。效率:

23、成本、质量、交付时间用况驱动过程RequirementsAnalysis & DesignImplementationTestUse Cases bind these workflows together模型用况模型分析模型设计模型实现模型实施模型测试模型小结软件开发模型是指软件开发全部过程、活动和任务的结构框架,能清晰、直观地表达软件开发全过程,明确规定了要完成的主要活动和任务,用来作为软件项目工作的基础。瀑布模型是一种线性模型,文档驱动的模型。增量提交模型采用一系列的增量方式开发系统。螺旋模型结合瀑布模型和快速原型,是一种风险驱动的开发模型构件集成模型利用模块化方法将整个系统模块化,复用构

24、件库中的软件构件,通过组合手段提高应用软件系统过程的效率和质量。统一过程模型是以用例驱动的,以架构为中心,迭代和增量的过程。第4章 敏捷软件开发方法敏捷软件开发过程SCRUM开发过程极限编程结对编程敏捷过程敏捷不是一个过程,是一类过程的统称。敏捷方法的两大主要特征:对“适应性”的强调对“人”的关注做法:快速响应:引入迭代式的开发手段将整个软件生命周期分解为若干个小的迭代周期获取切实有效的客户反馈提出12条基本原则敏捷开发12条原则我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。即使到了开发的后期,也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。 经常性地交付可以工作的软

25、件,交付的间隔可以从几个星期到几个月,交付的时间间隔越短越好。在整个项目开发期间,业务人员和开发人员必须天天都在一起工作。围绕被激励起来的个体来构建项目,给他们提供所需的环境和支持,并且信任他们能够完成工作。敏捷开发12条原则(续)在团队内部,最具有效果并富有效率的传递信息的方法,就是面对面的交谈。工作的软件是首要的进度度量标准。敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度。不断地关注优秀的技能和好的设计会增强敏捷能力。 简单是最根本的。 最好的构架、需求和设计出于自组织团队。 每隔一定时间,团队会在如何才能更有效地工作方面进行反省,然后相应地对自己

26、的行为进行调整。SCRUM开发过程Scrum 是一种迭代式增量软件开发过程,适合于敏捷软件开发。Scrum的基本假设:开发软件就像开发新产品,无法一开始就能定义软件产品最终的方案,过程中需要研发、创意、尝试错误,所以没有一种固定的流程可以保证方案成功。Scrum 有明确的最高目标,熟悉开发流程中所需具备的最佳典范与技术,具有高度自主权,紧密地沟通合作,以高度弹性解决各种挑战,确保每天、每个阶段都朝向目标有明确的推进。Scrum角色主管产品负责人开发团队Scrum术语订单backlog: 可以预知的所有任务, 包括功能性的和非功能性的所有任务。冲刺sprint:一次跌代开发的时间周期。冲刺订单s

27、print backlog:一个sprint周期内所需要完成的任务。主管scrumMaster: 负责监督整个Scrum进程,修订计划的一个团队成员。时间盒time-box: 一个用于开会时间段。冲刺计划会sprint planning会议每日立会Daily Scrum会议冲刺评审会Sprint review会议冲刺反思会Sprint retrospective会议实施Scrum的过程分解产品订单成冲刺订单召开冲刺计划会议进入冲刺开发周期,每天需要召开立会整个冲刺周期结束,召开冲刺评审会团队召开冲刺反思会以上循环进行Scrum文档产品订单文档冲刺订单文档燃尽图极限编程极限编程(eXtreme

28、Programming,XP)是一种软件工程方法学,是敏捷开发中最富有成效的方法学之一由KentBeck在1996年提出具有强沟通、简化设计、迅速反馈等特点适合于规模小、进度紧、需求不稳定、开发小项目的小团队。极限编程特点:XP模型是“轻量型”或“灵活”的软件过程模型与面向对象语言结合的开发方案“专家协作”的开发方式,解决难点问题重视客户反馈核心有四个要点:交流简单反馈勇气交流开发人员与客户的交流开发人员之间的交流使用结对编程开发人员与管理人员的交流简单设计的简单编码的简单注释的简单测试的简单反馈客户对软件的反馈测试代码对功能代码的反馈先测试,后编程勇气接受任务的勇气XP常见问题XP适合于小型

29、项目(10人左右)?结对编程,搭档如何安排?实施结对编程、集体代码所有权之后,如何考核单个开发人员?87Pair Programming( 结对编程 )结对编程结对编程(Pair-Programming) 是XP中非常重要的实践之一。定义:两个人坐在同一台计算机前面,使用相同的键盘和鼠标来开发同样的一个模块,一个称为驾驶者(Driver),负责代码的键入,另外一个称为领航员(Navigator),负责监看与决策,包括低级错误和方向性的错误。当出现的一个问题对其中一个人来说,难以解决,而恰好是另外一个人的强项的时候,那么角色就会发生转换。Pair Programming的角色(Role)Driv

30、er The one who typesNavigator The one who watches the back角色可以互换的疑问: 一个程序两个人写是不是一种浪费(可是两份工资,双倍资源哦)? 编程从来是一个人的活动。学校里这么教的,一直以来也是做么做的。 我不喜欢被人盯着工作,这样我不自在,无法工作。 这个笨家伙老是问问题,他/她不会看书么?我都无法专心工作了。 另一方面: Pair Programming被很多的大师级程序员推崇;不少大学都展开对Pair Programming的研究,并得到正面的结论; 很多尝试过的Developer都开始喜欢Pair Programming。Pai

31、r Programming的疑问Pair Programming和Solo Programming的比较一些研究数据:1999年,University of Uath.两组学生,一组独自工作,一组Pair Programming。不间断的Code Review1. Peer Code Review,即程序员之间的互相Review缺乏Design Review不能持久,定时Code Review对需求和设计的不了解导致无法实现有效的Review2. Team Code Review什么时候开会做Review?不可能Team天天开会无法对所有的设计和Code进行Review面子问题效率低传统开发过

32、程的Review(例如印度的InfoSys公司)的问题:不间断的Code Review提供不间断的Design review,Unit Test Review,Code Review,Document Review,避免了效果差的Team Code Review,也比抽查式的Peer Code Review有更好的质量。Pair Programming中,任何一段代码都至少被两双眼睛看过,两个脑袋思考过。代码被不断的Review。编程方式避免cow boy式的编程好代码的衡量标准:可读性和可维护性对大部分的商业项目来说,更主要的顾虑是成本。好的代码可以减少修改的成本。互相督促可以提高代码的可读

33、性。以人为本同伴的潜在压力( Peer Pressure )。Pair Programming的过程也是一个互相督促的过程。由于这种督促的压力,使得程序员更认真的工作。每个人每天的有效工作时段不超过3-4个小时。Pair Programming中Driver和Navigator的互换可以让程序员轮流工作,从而避免出现过度思考而导致观察力和判断力出现偏差。潜意识的有利竞争。当人在一个团队中工作,总是下意识的努力展现自己的优点。工作及时得到同伴的肯定,自信心和成就感(Self-Satisfaction)增强。觉得工作是一件愉快( Enjoyable )的事情。结对建议Extreme Program

34、ming对实施的程序员提出了更高的要求。这种要求不是技术水平,也不是学历水平也不是工作经验。这种要求是对一个人的心智,道德,修养的更高要求。程序员的四怕: 1) 怕自己看上去傻 2) 怕被认为是没用的 3) 怕自己变的不重要(过时) 4) 怕自己不够好Pair Programming中,编码不再是私人的工作,而是一种公开的“表演”。程序员的代码,工作方式,技术水平都变得公开和透明。XP开发人员素质 一个XP开发人员具备这样一些基本素质:诚实,公正,开明,勇敢和谦卑!在这些素质的基础之上,才是对技术水平,能力和天分等的要求。诚实 公正开明 勇气 谦卑 具备这些素质才能克服“四怕”,才能成为一个成

35、熟和专业的Developer。如何结对编程Driver 写设计文档(Class diagram等),进行编码(Unit Test and Business Object)等XP开发流程。Navigator 审阅Driver的文档、Driver对编码等开发流程的执行;考虑Unit Test的覆盖程度;是否需要和如何Refactoring;帮助Driver解决具体的技术问题。Driver和Navigator不断轮换角色,不要连续工作超过一小时,每一小时休息15分钟。Navigator要控制开发时间。99没有结对编程就没有XPPair Programming是XP所有的Practices中最被争议和

36、被认为是最难接受。Pair Programming是获得XP最大价值的关键。没有Pair Programming,无法实现有效的Continuous Code Review,代码质量下降。没有Peer Pressure,流程的执行很容易出现偏差。没有Pair Programming,Communication很容易弱化,进而影响Team work。Pair Programming象XP流程中的粘合剂,把各个环节连接起来实现最大的价值。100没有结对编程就没有XP这是引进XP时最难被接受的规则。但如果在采用其它XP的惯例和规则时,抛弃Pair Programming,那么会面对以下问题:如何进行有效的Design Review如何进行有效的Code Review如何保证代码质量如何保证流程的执行如何增进Communication如何进行Cross-Training如何增强TeamworkDistributed Pair Programming分布式的Pair Programming:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论