admin 管理员组文章数量: 887039
2024年2月6日发(作者:javaweb电子书下载)
软件工程知识(软考备考要点汇总)
1.1概述
软件由计算机程序、数据及文档组成,同时与硬件、数据库人、过程等共同构成计算机系统。
软件工程是1968年在德国的NATO会议上提出的,希望用工程化的原则和方法来克服软件危机;而软件危机就是软件开发和维护过程中的各种问题,由于软件开发阶段缺乏好的方法的指导和好的工具的辅助,而且缺少有关的文档,使得大量的软件难以维护。
软件工程是指应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来解决软件问题的工程。其目的是提高软件生产率、提高软件质量、减低软件成本。软件工程包括三个要素:方法、工具和过程。
软件工程基本原理(7个):
n 按软件生存周期分阶段指定计划并认真实施;
n 坚持进行阶段评审;
n 坚持严格的产品控制;
n 使用现代程序设计技术;
n 明确责任,使得工作结果能够得到清楚的审查;
n 用人少而精;
n 不断改进开发过程;
软件生命周期是指由软件定义、软件开发和软件维护等阶段组成的全过程,反映软件生存期内各种工作得组织以及各个阶段如何衔接。下表归纳了软件生存周期各个阶段的任务、参与人员和产生文档。
阶段 任务 参与人员 产生文档
软件定义阶段——待开发软件要“做什么”
系统分析 确定待开发软件的总体要求和适用范围,用户、项目负责人、以及与之有关的硬件、支撑软件的要求
软件项目计划
确定待开发软件的目标,对其进行可行性分析,并对资源分配、进度安排等做出合理的计划
需求分析 确定待开发软件的功能、性能、界面等要求,从而确定系统的逻辑模型
用户、项目负责人、系统分析员
需求规格说明书
系统分析员
用户、项目负责人、系统分析员
可行性分析报告、项目计划书
可合并项目计划书中
软件开发阶段——待开发软件“怎么做”
概要模块分解,确定软件的结构,模块的功能系统分析员、高级程序员
设计说明书、数据说明书、模块开发卷宗 设计 和模块间的接口,以及全局数据结构的设软件设计
详细设计
编码
软件测试
设计每个模块的实现细节和局部数据结构的设计
用某种程序语言为每个模块编写程序
发现软件中的错误,并加以纠正
计
高级程序员、程序员
高级程序员、程序员
高级程序员或系统分析员(另一部门或单位)
程序清单
软件测试计划、软件测试用例说明,软件测试报告
软件维护阶段—开发后交付使用的软件的维护
软件维护 使软件适应外界环境的变化、实现功能的扩充和质量的改善而修改软件
维护人员 维护计划、维护报告
生命周期法:生命周期法认为:每一个软件系统都有一定的生命周期。软件的生命周期是指一个软件系统从其提出、调查到分析、设计和有效使用,直至被淘汰或取代的整个期间。软件生命周期法就是按软件生命周期的各个阶段划分任务,按一定的规则和步骤,有效地进行软件开发的方法。
通常一个软件系统的生命周期可分为五个阶段:可行性分析、分析阶段、设计阶段、实施阶段、运行与维护阶段
原型法:原型法是先根据用户的最主要要求,开发出能实现系统最基本功能的一个原型,再根据用户对原型使用与评价的意见,反复修改完善原型,直到等到用户满意的最终系统为止。
原型法分4个阶段:确定用户需求;设计原型;使用、评价原型;修改、完善原型。
1.2软件维护和软件管理
软件开发项目管理基础知识(时间管理、成本管理、质量管理、人力资源管理、风险管理等)及其常用管理工具
软件管理工作涉及到软件开发工作的方方面面,其直接对象包括人、财、物,简单地说,人就是指软件开发人员,财就是指项目经费,物就是指软件项目。也许还没有关于这方面的专门理论,但在工商管理领域已经有十分成熟的管理学理论,他山之石,可以攻玉,所以我们完全可以引进到软件项目方面的管理。
作为软件管理人员,应该站在高处来俯瞰整个项目,如果有不识庐山真面目的感觉就不太好了。有了俯瞰全局的意识这一前提,采用适当的管理技术,项目开展就容易罗。软件项
目的管理工作可以分位四个方面:软件项目的计划、软件项目的组织、软件项目的领导和软件项目的控制.
1 软件项目的计划
软件开发项目的计划包括定义项目的目标,以及达到目标的方法。他涉及到项目实施的各个环节,带有全局的性质,是战略性的。计划应力求完备,要考虑到一些未知因素和不确定因素,考虑到可能的修改。计划应力求准确,尽可能提高所依据的数据的可靠程度。主要工作集中在软件项目的估算、软件开发成本的估算和软件项目进度安排。软件项目计划的目标是提供一个能使项目管理人员对资源、成本和进度做出合理估算的框架。这些估算应在软件项目开始时的一段有限时间内作出,并随着项目的进展进行更新。
2 软件项目的估算
软件项目管理过程开始于项目的计划,在做项目计划时,第一项活动是估算。现在已经使用的使用技术是时间和工作量的估算。因为估算是其他项目计划活动的基石,而且项目计划又未软件工程过程提供了工作方向,所以我们不能没有计划就着手开发,否则就会陷入盲目性。
估算本身带有风险,估算资源、成本和项目进度时需要经验、有用的历史信息、足够的定量数据和作定量度量的勇气。估算的精确程度受到多方面的影响。首先,项目的复杂性对于增加软件计划的不确定性影响很大,复杂性越高,估算的风险就越高。复杂性是相对度量的,他与项目参加人员的经验有关,比如如果让搞MIS的项目组去搞操作系统设计显然增加了复杂性。其次,项目的规模对于估算的精确性和功效的影响也比较大,因为随着软件规模的扩大,软件相同元素之间的相互依赖、相互影响也迅速增加,因而估算时进行问题分解也会变得更加困难。还有项目的结构化程度也影响项目估算的风险,这里的结构性是指功能分解的简便性和处理信息的层次性,结构化程度提高,进行精确估算的能力就提高,相应风险将减少。此外,历史信息的有效性也影响估算的风险,在对过去的项目进行这综合的软件度量之后,就可以借用来比较准确地进行估算。影响估算的因素远不止这些,比如用户需求的频繁变更给估算带来非常大的影响。
估算的依据是软件的范围,包括功能,性能、限制、接口和可靠性。在估算开始之前,应对软件的功能进行评价,并对其进行适当的细化以便提供更详细的细节。由于成本和进度的估算都与功能有关,因此常常采用功能分解的办法。性能的考虑主要包括处理和响应时间的需求。约束条件则标识外部硬件、可用存储和其他现有系统对软件的限制。
另外软件项目计划还要完成资源估算,包括人力资源、硬件资源和软件资源。在考虑各种软件开发资源时最重要的是人,必须考虑人员的技术水平、专业、人数以及在开发过程各阶段对各种人员的需要。硬件资源作为一种工具投入。软件资源包括各种帮助开发的软件工具,比如编程工具、管理工具、测试工具,还有操作系统和数据库等。
1.3软件开发工具与环境(CASE)
用来辅助软件开发、运行、维护、管理和支持等过程中的活动的软件称为软件工具,通常也称为CASE(计算机辅助软件工程)工具。
整个软件开发过程要使用很多开发工具,其中包括分析工具、设计工具、编程工具、测试工具、维护工具等等。
软件开发工具是指支持软件产品开发的软件系统,它由软件工具集和环境集成机智构成。工具集包括支持软件开发相关过程、活动、任务的软件工具;环境集成机智为工具集成和软件开发、维护和管理提供统一的支持。
软件开发环境是把一组相关的工具集成在环境中,提供数据集成、控制集成和界面集成等机制。其中:
Ø 数据集成机制:提供统一的数据模式和数据接口规范,需要相互协同的工具通过这种统一的规范交换数据。数据集成可由共享文件、共享数据结构或共享信息库等不同的层次;
Ø 控制集成机制:支持各工具或各开发活动之间的通信、切换、调度和协同工作,并且支持软件开发过程的描述、执行和转接;通常消息传送的方式实现控制的集成。
Ø 界面集成机制使这些工具具有统一的界面风格,从而为软件开发、维护、管理等过程的各项活动提供连续的、一致的全方位支持。
集成型软件开发环境由工具集和环境集成机制组成,这种环境应该具有开放性和可剪裁性;
环境集成机制的核心是环境数据库。
1.4软件分析
可行性分析的任务是从技术上、经济上、使用上、法律上分析需解决的问题是否存在可行的解。
需求分析是软件生存周期中相当重要的一个阶段。需求分析主要是确定待开发软件的功能、性能、数据、界面等要求。具体有以下几点:
Ø 确定软件系统的综合要求
Ø 分析软件系统的数据要求
Ø 导出系统的逻辑模型
Ø 修正项目开发计划
Ø 如有必要,可开发一个原型系统
需求分析的基本原则是能够表达和理解问题的信息域和功能域;以层次化的方式进行分解和不断细化;要给出系统的逻辑视图和物理视图;
描述软件需求的方法:
功能层次模型:一般来讲就是系统的功能图,模块分布图等描述整个系统的功能的分布和功能的层次结构;
数据流模型:就是以数据流为着眼点的分析方法得到的模型,主要通过数据在整个系统的流动情况来确定系统的主要功能主线和流程;
控制流模型:通过了解和界定系统中控制线,通过控制流的走向和控制的对象来确定系统的功能分布和控制与被控制的关系;
结构化分析(SA)方法是一种面向数据流的需求分析方法,它适用于分析大型数据处理系统。结构化分析方法的基本思想是自顶向下逐层分解,这样做可以把一个大问题分解成若干个小问题,经过多次逐层分解,每个最底层的问题都是足够简单、容易解决的,这个过程就是分解的过程。
结构化方法的分析结果由数据流图DFD、数据词典和加工逻辑说明几个部分组成。其中,DFD的基本成分有数据流(data flow)、加工(process)、文件(file)和源/宿(source/sink)。
n 画数据流图的基本步骤:自外向内、自顶向下、逐层细化、完善求精;
n 数据流图的父图与子图要平衡, 即输入和输出的数据流一致;
n 数据流图中的每个加工至少有一个输入数据流和一个输出数据流;
n 局部的数据存储不画出来,只有当局部数据存储作为某些数据加工之间的数据接口才画出,这有利于信息隐蔽;
n 画数据流的时候不画控制流,两者的区别就是控制流中没有数据;
n 一个加工的数据流与输出流不应该同名;
n 允许一个加工有多条数据流流向另一个加工,也允许一个加工有两个相同的输出流向两个不同的加工;
n 保持数据守恒:一个加工的所有输出数据必须能从该加工的所有的输入流中获得;
n 在整套数据流图中,每个文件都必须既有读文件的数据流也有写文件的数据流;
1.5软件设计
软件设计原则: 软件设计的原则对提高软件的设计质量有很大的帮助。
◆ 抽象
抽象是指忽视一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。过程抽象和数据抽象是常用的两种主要抽象手段。
◆ 模块化
模块化是指将一个待开发的软件分解成若干个小的简单的部分——模块,每个模块可独立地开发、测试、最后组装成完整的软件。这是一种复杂问题的“分而治之”的原则。
模块是指执行某一特定任务的数据结构和程序代码。一个模块有它的外部特征和内部特征。
◆ 信息隐蔽、数据封装
信息隐蔽是开发整体程序结构时使用的法则,即将每个程序的成分隐蔽或封装在一个单一的设计模块中,定义每一个模块时尽可能少地显露其内部的处理。信息隐蔽原则对提高软件的可修改性、可测试性和可移植性都有重要的作用。
◆ 模块独立
模块独立是指每个模块完成一个相对独立的子功能,并且与其他模块之间的联系简单。衡量模块独立程度的度量标准有两个:耦合和内聚。
耦合是指模块之间联系的紧密程度。耦合度越高则模块的独立性越差。按耦合度从低到高依次有7种耦合方式。
Ø 非直接耦合(独立运行)
Ø 数据耦合(用参数表传递简单数据)
Ø 标记耦合(传递数据结构或者一部分)
Ø 控制耦合(传递的信息包括控制模块的信息)
Ø 外部耦合(模块与软件之外的环境有关)
Ø 公共耦合(多个模块引用同一全局的数据区)
Ø 内容耦合(访问内部数据,代码重叠或者多个入口)
内聚是指模块内部各元素之间联系的紧密程度内聚度越低模块的独立性越差。按内聚度从低到高依次有7种内聚种类。
Ø 偶然内聚(模块完成的多个任务,任务之间的关系松散)
Ø 逻辑内聚(模块完成逻辑相关的一组任务)
Ø 瞬时内聚(模块的所有任务必须在同一时间间隔内执行)
Ø 过程内聚(模块的处理元素相关而且按照特定的次序执行)
Ø 通信内聚(模块的所有元素集中在一个数据结构区域上)
Ø 顺序内聚(模块的处理元素相关,必须顺序执行)
Ø 功能内聚(模块完成单一的功能,各个部分协调工作,而且不可缺少)
模块分解原则:
Ø 满足信息隐蔽;
Ø 尽量内聚度高,模块间偶合度低;
Ø 模块大小在(50-100语句);
Ø 模块调用深度不能过大;
Ø 模块的扇入(直接调用该模块)应尽量大,扇出(直接调用下级模块数)不宜过大;
Ø 设计单入口和单出口的模块;
Ø 模块的作用域应在控制域之内:
作用域:受模块内一个判定影响的所有的模块的集合;
控制域:该模块本身和被该模块直接或间接调用的所有的模块的集合;
Ø 模块的功能应是可以预测的,相同输入得到相同输出
结构化设计方法
结构化设计(SD)方法是一种面向数据流的设计方法,它可以与SA方法衔接。
结构化设计采用结构图(SC)来描述程序的结构。其基本成分有模块、调用和输入/输出数据。
结构图:
在需求分析阶段用SA方法产生了数据流图(DFD)。面向数据流的设计可以方便的将DFD转换成程序结构图。DFD从系统的输入数据流到系统的输出数据流的一连串连续变换形成一条信息流。DFD的信息流大体可分为两种类型:变换流和事务流。与之对应的也存在两种分析,变换分析和事务分析。变换分析是从变换流型的DFD导出程序结构图,而事务分析则是从事务流行型的DFD导出程序结构图。
SD方法的具体设计步骤为:
Ø 复查并精化数据流图
Ø 确定DFD的信息流类型
Ø 根据信息流类型分别将变换流或事务流转换成程序结构图
Ø 根据软件设计的原则对程序结构图作改进
结构化程序设计
结构化程序(SP)设计采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。
结构化程序设计的描述工具主要有图形描述工具、语言描述工具和表格描述工具。常用的图形描述工具有程序流程图、盒图(NS图)和问题分析图(PAD)。典型的语言描述工具是PDL(program design language)。典型的表格描述工具是判定表和判定树。
面向数据结构的Jackson方法也十分常用:
Jackson方法是以数据结构为设计基础,设计目标是得出对程序处理过程的描述,其设计过程是从描绘数据结构的Jackson图推导出描绘程序结构的Jackson图。这种方法最适合于详细设计阶段使用。
Jackson方法的具体设计步骤为:
Ø 分析并确定输入和输出的数据的逻辑结构,并用Jackson图表示
Ø 找出输入数据结构与输出数据结构间有对应关系的数据单元
Ø 从描述数据结构的Jackson图导出描述程序结构的Jackson图
软件编码:
根据详细设计说明书编写程序,为开发项目选择程序设计语言需要考虑的因素有应用领域、算法和计算的复杂性、软件运行环境、用户需求、数据结构和开发人员的水平。软件的设计质量与程序设计语言的技术性能无关,但在程序设计转向程序代码时,转化的质量受语言性能的影响。
好的程序应该具有模块化结构,系统应该有较高的模块独立性。
从应用领域看,COBOL适合商业领域;FORTRAN适合科学计算;PROLOG和LISP适合人工智能领域;SMALLTALK、C++、JAVA是面向对象语言;C是开发系统的程序设计语言;
1.6软件测试
对源程序最基本的质量要求是正确性和可靠性,此外还很注重软件的易使用性、易维护性和易移植性。软件测试的工作量约占软件开发总工作量的40%以上,其目的是尽可能多的发现软件产品(主要是指程序)中的错误和缺陷。
软件测试是自底向上,逐步集成的过程,低一级测试为上一级测试准备条件;
测试的关键是测试用例的设计,其方法可分为两类。
白盒测试:
白盒测试是根据程序的内部逻辑来设计测试用例,常用的技术是逻辑覆盖,即考察用例测试数据运行被测程序时对程序逻辑的覆盖程度。主要的覆盖标准有6种:
I. 语句覆盖
指选择足够的测试用例,使被测语句的每个语句至少执行一次。
II.判定覆盖
指选择足够的测试用例,使每个判定的所有可能结果至少出现一次。
III.条件覆盖
指选择足够的测试用例,使判定中的每个条件的所有可能结果至少出现一次。
IV. 判定/条件覆盖
指选择足够的测试用例,使判定中的每个条件的所有可能结果至少出现一次,并且每个判定中条件结果的所有可能组合也至少出现一次。
V. 条件组合覆盖
指选择足够的测试用例,使每个判定中条件结果的所有可能组合至少出现一次。
VI. 路径覆盖
指选择足够的测试用例,使流程图中的每条路径至少经过一次。
黑盒测试:
黑盒测试时根据规格说明所规定的功能来设计测试用例,它不考虑程序的内部结构和处理过程。常用的黑盒测试技术有:
Ø 等价类划分
Ø 边值划分
Ø 错误猜测
软件测试的主要步骤有单元测试、集成测试和确认测试。
单元测试:
主要用来发现编码和详细设计中产生的错误,一般在编码阶段,采用白盒测试。
集成测试(也称组装测试):
主要用来发现设计阶段产生的错误,是对各模块组装而成的程序进行测试,主要检查模块间的接口和通信,采用黑盒测试。
集成测试按集成方式又可分成非渐增式集成和渐增式集成,而渐增式集成又可分成自顶向下集成和自底向上集成。
确认测试:
检查软件的功能、性能和其他特征是否与用户需求一致,它以需求规格说明书作测试为依据,采用黑盒测试
Alpha测试是在开发者的现场由客户来实施的,从用户角度和环境下进行;
Beta测试是在开发者不在现场下测试,由软件最终用户实施;
使用各种测试方法的综合策略:
n 在任何情况下都必须使用边界值分析方法,用这种方法设计出测试用例发现程序错误的能力最强;
n 必要时用等价类划分方法补充一些测试用例;
n 用错误推测法再追加一些测试用例
n 对照程序逻辑,检查已有测试用例的逻辑覆盖程度
n 如果程序的功能说明中含有输入条件的组合情况,则选用因果图法
1.7面向对象技术
1.7.1面向对象的基本概念
面向对象(object-oriented,OO)方法是以客观世界中的对象为中心,其分析和设计思想符合人们的思维方式,分析和设计的结果与客观世界的实际比较接近,容易被人们所接受。下面列举几个面向对象设计方法中的重要术语,它们构成面向对象的程序设计语言的核心。
◆对象(Object)
对象是和有数据及可对这些数据施加的操作结合在一起所构成的独立单位的总称。一个对象通常可由对象名、属性和操作三部分组成。
对象的划分判定标准:
1、 子对象之间独立性要高,即耦合度尽量达到最低,(理想的情况是达到组件化的程度);
2、 子对象相对其他划分方法,更易于处理。所以对于复杂的大系统,一般都要经过多次的尝试,以尽量能找到较优的划分方案。对于比较简单的系统,E-R转换也能的到较为满意的划分。
◆实例(Instance)
实例是由某个特定类所描述的一个对象。
◆类(Class)
类是一组具有相同属性和相同操作的对象的集合。类是面向对象的程序设计语言提供的可再用软件成分。
◆方法(Method)
对象所能执行的操作称为方法。方法是类中定义的函数,描述对象执行操作的算法。
◆消息(Message)
消息是要求某个对象执行类中定义的某个操作的规格说明。一个消息通常包括接受对象名、调用的操作名和适当的参数(如有必要)。
主要特点:
◆封装性
封装性是一种信息隐蔽技术,它使系统分析员能够清晰地标明他们所提供的服务界面,用户和应用程序员则只看得见对象提供的操作功能(即封装面上的信息),看不到其中的数据或操作代码细节。
◆多态性
多态性是指同一个操作作用于不同的对象可以有不同的解释,产生不同的执行结果。
◆继承性
继承是指在某个类的层次关联中,不同的类共享属性和操作的一种机制。一个父类可以有多个子类。父类描述了这些子类的公共属性和操作,子类中还可以定义其自己的属性和操作。如果一个子类只有唯一的一个父类,这种继承称为单一继承。如果一个子类有多个父类,可以从多个父类中继承特性,这种继承称为多重继承。
◆分布式对象Distributed Object
在发布实施角度上看,对象可分为三种:本地对象,远地对象,虚拟对象。
本地对象Local Object :指分布在同一个系统中的对象,互称为本地对象
远地对象Remote Object :指分布在不同系统中的对象(同一个群体系统)。
虚拟对象Virtual Object :不同于本地和远地对象,虚拟对象不属于真实的对象,而是一个虚设的类型。真正的操作不在虚拟对象本身,只是远地对象在本地的映射。
本地和远地对象是相互的关系。而虚拟对象只是一种映射,用于关联本地和远地对象,起到分布和负载均衡的作用。
面向对象数据库技术:是面向对象技术和数据库技术的有机的结合,它有着关系数据库没有的优点。
面向对象数据库(OODB) +关系数据库(RDB)→对象-关系数据库(ORDB)
面向对象的特征:类和继承性,对象及对象标识、封装性、信息/实现隐蔽、状态保持,消息,多态性,一般性。
u 面向对象技术的出现正是弥补了前述关系模型的固有局限性。
u 对象数据模型是有很强的描述复杂对象的能力,能包含更多的数据语义信息。
u 面向对象方法可很方便的表示嵌套对象,因而很容易表达层次数据,这点与RDB形成鲜明的对比,RDB强迫用户用多个关系的元组表达层次数据。
u 面向对象方法可方便的构造各种类型、而RDB不提供增加用户定义数据类型的手段。
1.7.2面向对象的分析方法
面向对象的系统分析设计,看起来其实也很简单,步骤大概如下:
(1) 从项目开始,进行步骤(2)。
(2) 对系统进行分析,如果它在一定的要求下可解决,则停止分析,进行设计;如果它在一定的要求下不可解决,则对它进行划分。
(3) 步骤(2)如果有分析结果,则对其中每一个子对象,进行步骤(2)。
边界条件(也即上面提到的“一定要求”,对象划分的原则):
u 子对象之间独立性要高,即耦合度尽量达到最低,(理想的情况是达到组件化的程度);
u 子对象相对其他划分方法,更易于处理(如实现,维护等)。
当前常见的面向对象的方法很多,下面简单介绍三种:
Peter Coard和Edward Yourdon的OOA和OOD方法
OOA(面向对象分析)模型由5个层次和5个活动组成:
5个层次:主题层、对象类层、结构层、属性层、服务层
5个活动:标识对象类、标识结构、定义主题、定义属性、定义服务
在这种方法中定义两种对象类之间的结构:
分类结构——反映了一般与特殊的关系
组装结构——反映了对象之间整体与部分的关系
OOA中的5个层次和5个活动继续贯穿在OOD(面向对象设计)过程中。OOD模型由4个部分,即:
Ø 问题域
Ø 人机交互
Ø 任务管理
Ø 数据管理
Booth的OOD方法
Booth认为软件开发是一个螺旋上升的过程。在螺旋上升的每个周期中,有4个步骤:
Ø 标识类和对象
Ø 确定它们的含义
Ø 标识它们之间的关系
Ø 说明每一个类的界面和实现
OMT方法
OMT(对象建模技术)定义了3种模型:
Ø 对象模型
描述系统中对象的静态结构、对象之间的关系、对象的属性、对象的操作。它为动态模型和功能模型提供了基本的框架。用对象图表示。
Ø 动态模型:
描述与时间和操作顺序有关的系统特征——激发事件、事件序列、确定事件先后关系的状态以及事件和状态的组织。用状态图表示。
Ø 功能模型:
描述与值的变换有关的系统特征——功能、映射、约束和函数依赖。用数据流图表示。
OMT方法有4个步骤
分析:这是OMT方法的第一步,其目的是建立可理解的现实世界模型。
系统设计:确定整个系统的体系结构,形成求解问题和建立解答的高层次策略。
对象设计:在分析的基础上,对象设计阶段建立基于分析模型的设计模型,考虑实现的细节。
实现:将对象设计阶段开发的对象类及其关系转换成特定的程序设计语言、数据库或硬件的实现。
版权声明:本文标题:软件工程知识(软考备考要点汇总) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1707168805h511259.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论