软件工程基础知识(1) -- 软件评测师(十)

1 软件工程概述

1.1 软件工程

    软件工程是指应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来解决软件问题的工程,其目的是提高软件生产率、提高软件质量、降低软件成本。软件工程的三要素如下:

    (1)方法:指完成软件开发的各项任务的技术方法。

    (2)工具:指为运用方法而提供的软件工程支撑环境。

    (3)过程:指为获得高质量的软件所需要完成的一系列任务的框架。

    美国著名的软件工程专家B.W.Boehm于1983年提出了软件工程的7条基本原理:

    (1)用分阶段的生命周期计划严格管理。

    (2)坚持进行阶段评审。

    (3)实现严格的产品控制。

    (4)采用现代程序设计技术。

    (5)结果应能清楚地审查。

    (6)开发小组的人员应少而精。

    (7)承认不断改进软件工程实践的必要性。

1.2 软件生存周期

    一个软件产品或软件系统要经历许多阶段,一般称为软件生存周期。软件生存周期包括如下几个阶段:

    (1)可行性分析与项目开发计划:这个阶段主要确定软件的开发目标及其可行性,需要进行问题定义、可行性分析,制订项目开发计划。可行性分析与项目计划阶段的参加人员有用户、项目负责人和系统分析师。该阶段产生的主要文档包括:可行性分析报告和项目开发计划等。

    (2)需求分析:该阶段的任务不是具体地解决问题,而是准确地确定软件系统必须做什么,确定软件系统的功能、性能、数据和界面等要求,从而确定系统的逻辑模型。软件需求包括如下3个方面的内容:

    1)功能需求:所开发的软件必须具备什么样的功能。

    2)非功能需求:指产品必须具备的属性或品质,如可靠性、性能、容错性和扩展性等。

    3)设计约束:也称为限制条件、补充规约,这通常是对解决方案的一些约束说明。

    需求阶段的参加人员有用户、项目负责人和系统分析师。该阶段产生的主要文档包括软件需求说明书,也称为软件需求规格说明书

    (3)概要设计:在该阶段开发人员要把确定的各项功能需求转换成需要的体系结构。在该体系结构中,每个成分都是意义明确的模块,即每个模块都和某些功能需求相对应,因此,概要设计就是设计软件的结构,明确软件由哪些模块组成。通过还要设计该项目的应用系统的总体数据结构和数据库结构。软件概要设计的基本任务如下:

    1)设计软件系统总体结构。

    2)数据结构及数据库设计。

    3)编写概要设计文档。

    4)评审。

    概要设计阶段的参加人员有系统分析师和软件设计师。该阶段产生的主要文档包括概要设计说明书、数据库设计说明书等。

    (4)详细设计:该阶段的根本目标是确定应该怎样具体地实现所要求的系统,即经过这个阶段的设计工作,应该得出对目标系统的精确描述。详细设计阶段的主要任务如下:

    1)对每个模块进行详细的算法设计。

    2)对模块内的数据结构进行设计。

    3)对数据库进行物理设计,即确定数据库的物理结构。

    4)其他设计:包括代码设计、输入输出设计和用户界面设计等。

    5)编写详细设计说明书。

    6)评审。

    详细设计阶段的参加人员有软件设计师和程序员。该阶段产生的主要文档包括详细设计说明书。软件设计的原则如下:

    1)抽象:抽象是认识复杂现象过程中使用的思维工具,即抽出事物本质的共同特性而暂不考虑它的细节。

    2)模块化:模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。

    3)信息隐蔽:指在设计和确定模块时,使得一个模块内包含的信息对于不需要这些信息的其他模块来说,是不能访问的。

    4)模块独立:指模块完成系统要求的独立的子功能,并且与其他模块的接口简单,模块间关联和依赖程度尽可能小。衡量模块独立性的标准是内聚度和耦合度。

    (5)软件编码:该阶段就是把每个模块的控制结构转换成计算机可接受的程序代码,即写成某种特定程序设计语言表示的源程序清单。编码阶段的参加人员通常是软件开发人员。该阶段产生的主要文档包括开发进度月报、项目开发总结报告等。

    (6)软件测试:测试是保证软件质量的重要手段,其主要方式是在设计测试用例的基础上检查软件的各个组成部分。测试阶段的参加人员通常是软件测试人员、软件开发人员、用户。该阶段产生的主要文档包括软件测试计划、软件测试用例和软件测试报告

    (7)软件维护:是软件生存周期中时间最长的阶段。已交付的软件投入正式使用后,便进入软件维护阶段,它可以持续几年甚至几十年。软件维护可以分为如下4种类型:

    1)正确性维护:又称为改正性维护,是指改正在系统开发阶段已产生而系统测试阶段尚未发现的错误。

    2)适应性维护:指使应用软件适应信息技术变化和管理需求变化而进行的修改。

    3)完善性维护:又称为改善性维护,这是为扩充功能和改善性能而进行的修改,主要是指对已有的软件系统增加一些在系统分析和设计阶段中没有规定的功能与性能特征。

    4)预防性维护:为了改进应用软件的可靠性和可维护性,为了适应未来的软/硬件环境的变化,应主动增加预防性的新的功能,以使应用系统适应各类变化而不被淘汰。

1.3 模块内聚和耦合

    (1)模块内聚:内聚是一个模块内部各个元素彼此结合的紧密程度的度量。一个内聚程度高的模块应当只做一件事,模块的内聚度越高,则独立性越强。一般模块的内聚度分为7种类型:

    1)偶然(巧合)内聚:模块完成的动作之间没有任何关系,或者仅仅是一种非常松散的关系。

    2)逻辑内聚:指模块内执行若干个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。

    3)时间(瞬时)内聚:模块内部的各个组成部分所包含的处理动作必须在同一时间间隔内执行,例如初始化模块。

    4)过程内聚:指一个模块完成多个任务,这些任务必须按指定的过程执行。

    5)通信(信息)内聚:指模块内的所有处理元素都在同一个数据结构上操作,或者各处理使用相同的输入数据或者产生相同的输出数据。

    6)顺序内聚:指一个模块中的各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素的输出就是下一功能的输入。

    7)功能内聚:指模块内的所有元素共同作用完成一个功能,缺一不可,这是最强的内聚。

    (2)模块耦合:耦合是模块之间的相对独立性的度量。耦合取决于各个模块之间接口的复杂程度、调用模块的方式以及通过接口的信息类型等模块的耦合度越高,则独立性越弱。一般模块的耦合度分为7种类型:

    1)无直接耦合(非直接耦合):两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,它们之间不传递任何信息,因此模块间的耦合性最弱,模块独立性最高。

    2)数据耦合:指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言中的值传递。

    3)标记耦合:指两个模块之间通过参数表(数据结构)传递记录信息。

    4)控制耦合:指一个模块调用另一个模块时,传递的是控制变量,被调用模块通过该控制变量的值有选择地执行模块内的某一功能。也就是说一个模块通过传递开关、标志、名字等控制信息,明显地控制选择另一模块的功能。

    5)外部耦合:模块间通过软件之外的环境联结(如I/O将模块耦合到特定的设备、格式、通信协议上)。

    6)公共耦合:指通过一个公共数据环境相互作用的那些模块间的耦合。

    7)内容耦合:一个模块直接访问另一个模块的内部数据,或者通过非正常入口转入另一个模块内部,或者两个模块有一部分程序代码重叠,又或者一个模块又多种入口。

2 结构化开发方法

    结构化分析与设计方法是一种面向数据流的传统软件开发方法,它以数据流为中心构建软件的分析模型和设计模型。完整的结构化方法包括三部分:结构化分析、结构化设计、结构化程序设计

2.1 结构化分析

    结构化分析简称SA。基本思想是将系统开发看成工程项目,有计划、有步骤地进行工作,适用于分析大型信息系统。结构化分析方法采用“自顶向下,逐层分解”的开发策略。只要将复杂的系统适当分层,每层的复杂程度即可降低。结构化分析的结果由以下几部分组成:

    (1)数据流图:简称DFD,是结构化方法中用于表示系统逻辑模型的一种工具,描述系统的输入数据流如何经过一系列的加工,逐步变换成系统的输出数据流。这些数据流的加工实际上反映了系统的某种功能或子功能。数据流图的基本成分如下:

    1)数据流:由一组固定成分的数据组成,表示数据的流向。一般用箭头“”表示。在DFD中,数据流的流向可以有以下几种:

    ①从一个加工流向另一个加工。

    ②从加工流向数据存储()。

    ③从数据存储流向加工()。

    ④从外部实体流向加工(输入)。

    ⑤从加工流向外部实体(输出)。

    DFD中的每个数据流用一个定义明确的名字表示。除了流向数据存储或从数据存储流出的数据流不必命名外,每个数据流都必须有一个合适的名字,以反映该数据流的含义。值得注意的是,DFD中描述的是数据流,而不是控制流。

    2)加工:描述输入数据流到输出数据流之间的变换,也就是输入数据流经什么处理后变成了输出数据流。一般用圆圈“\bigcirc”或者圆角矩形“”表示。每个加工都有一个名字和编号,编号能反映出该加工位于分层DFD中的哪个层次和哪张图中,也能够看成它是哪个加工分解出来的子加工。一个加工可以有多个输入数据流和多个输出数据流,但至少有一个输入数据流和一个输出数据流。数据流图中加工常见的3种错误有以下几种:

    ①加工有输入但是没有输出。

    ②加工有输出但没有输入。

    ③加工中输入不足以产生输出。

    3)数据存储:也称为文件,用来表示存储数据,每个数据存储都有一个名字。一般用平行线“ ”或者右边缺边的方框“”表示。可以有数据流流入数据存储,表示数据的写入操作;也可以有数据流从数据存储流出,表示数据的读操作;还可以用双向箭头的数据流指向数据存储,表示对数据的修改。

    4)外部实体:也称为源/宿、外部主体等,是指存在于软件系统之外的人员、组织或其他系统。外部实体指出系统所需数据的发源地和系统所产生的数据的归宿地。一般用直角矩形“”表示。源和宿采用相同的图形符号表示,当数据流从该符号流出时,表示它是源;当数据流流向该符号时,表示它是宿,当两者皆有时,表示它既是源又是宿

    (2)数据字典:DFD仅描述了系统的“分解”,并没有对各个数据流、加工、数据存储进行详细说明。数据字典就是用来定义DFD中各个成分的具体含义的,它以一种准确的、无二义性的说明方法为系统的分析、设计及维护提供了有关元素一致的定义和详细的描述。数据字典有以下4类条目:

    1)数据流条目:给出了DFD中数据流的定义,通常列出该数据流的各组数据项。

    2)数据项条目:是组成数据流和数据存储的最小元素,是不可再分解的数据单位。

    3)数据存储条目:是对DFD中数据存储的定义。

    4)基本加工条目:用来说明DFD中基本加工的处理逻辑。

    (3)加工逻辑:也称为“小说明”,一般用以下3种工具描述加工逻辑:

    1)结构化语言:介于自然语言和形式语言之间的一种半形式语言,它的结构可分为外层和内层两层。

    2)判定表:能够清楚地表示复杂的条件组合与应做的动作之间的对应关系。判定表由条件说明、动作说明、条件项和动作项组成。

    3)判定树:也称为决策树,适合描述问题处理中具有多个判断,而且每个决策与若干条件有关,是判定表的变形。

2.2 结构化设计

    结构化设计简称SD。SD是将结构化分析得到的DFD映射成软件体系结构的一种设计方法,强调模块化、自顶向下逐步求精、信息隐蔽、高内聚、低耦合等设计原则。结构化设计方法中使用结构图来描述软件系统的体系结构,指出一个软件系统由哪些模块组成,以及模块之间的调用关系。结构图的基本成分有五部分:

    (1)模块:指具有某一定功能并可以用模块名调用的一组程序语句,如函数、子程序等,它们是组成程序的基本单元。在结构图中,模块用矩形“”标识,并用名字标识该模块,名字应体现该模块的功能。模块的四要素是:输入和输出、处理功能、内部数据、程序代码。

    (2)调用:结构图中模块之间的调用关系,用一个模块指向另一个模块的箭头“”来标识,其含义是前者调用了后者。

    (3)数据:在模块之间传送的数据,使用“”表示,并在旁边标上数据名。

    (4)控制信息:使用“”表示,并在旁边标上控制信息名。

    (5)转接符号:当模块结构图在一张纸上画不下,需要转接到另一张纸上,或者为了避免图上线条交叉时,都可以使用转接符号,圆圈内加上标号,例如“①”。

    结构图的形态特征如下所示:

    1)深度:指结构图控制的层次,也就是模块的层数。

    2)宽度:指一层中最大的模块个数。

    3)扇出:指一个模块的直接下属模块的个数。

    4)扇入:指一个模块的直接上属模块的个数。

2.3 结构化程序设计(编程)

    结构化程序设计(编程)简称SP。结构化程序设计方法的基本要点如下:

    (1)采用自顶向下、逐步求精的程序设计方法,可以把逐步求精看作一项把一个时期内必须解决的种种问题按优先级排序的技术,确保每个问题都被解决,而且每个问题都在适当的时候被解决。

    (2)使用3种基本控制结构构造程序。任何程序都可以由顺序、选择和重复(循环)3种基本控制结构构造,这3种基本结构的共同点是单入口、单出口。

3 面向对象开发方法

    面向对象开发方法将问题和问题的解决方案组织为离散对象的集合,数据结构和行为都包含在对象的表示中。面向对象开发方法包括三方面:面向对象分析、面向对象设计、面向对象程序设计。

3.1 UML

    统一建模语言简称UML。UML的词汇表包含3种构造块:事物、关系、图。

    (1)事物:是对模型中最具有代表性的成分的抽象。UML中有以下4种事物:

    1)结构事物:是UML模型中的名词。它们通常是模型的静态部分,描述概念或物理元素结构事物包括类、接口、协作、用例、主动类、构件、制品和节点

    2)行为事物:是UML模型中的动词。它们通常是模型的动态部分,描述了跨越时间和空间的行为行为事物包括交互、状态机和活动

    3)分组事物:是UML模型的组织部分,是一些由模型分解成的“盒子”。在所有的分组事物中,最主要的分组事物是包包是把元素组织成组的机制,这种机制具有多种用途。结构事物、行为事物甚至其他分组事物都可以放进包内。

    4)注释事物:是UML模型的解释部分。这些注释事物用来描述、说明和标注模型的任何元素。

    (2)关系:UML常见的关系有6种:泛化、实现、组合、聚合、关联、依赖。各种关系的强弱顺序是:泛化=实现>组合>聚合>关联>依赖

    1)泛化:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。

    2)实现:是一种类与接口的关系,表示类是接口所有特征和行为的实现。

    3)组合:是整体与部分的关系,但部分不能离开整体而单独存在。组合关系是关联关系的一种,是比聚合关系还要强的关系。

    4)聚合:是整体与部分的关系,且部分可以离开整体而单独存在。 

    5)关联:是一种拥有的关系,它使一个类知道另一个类的属性和方法。

    6)依赖:是一种使用的关系,即一个类的实现需要另一个类的协助,所以尽量不使用双向的互相依赖。

    依赖的变体有包含和扩展等。一般用于表示用例图中用例和用例之间的关系。

    1)包含关系:当两个或多个用例中共用一组相同的动作,这时可以将这组相同的动作抽出来作为一个独立的子用例,供多个基用例所共享。因为子用例被抽出,基用例并非一个完整的用例。

    2)扩展关系:是对基用例的扩展,基用例是一个完整的用例,即使没有子用例的参与,也可以完成一个完整的功能。 

    UML中的图:UML中的图有如下几种“

    1)类图:展现了一组对象、接口、协作和它们之间的关系。类图给出系统的静态设计视图,包含主动类的类图给出了系统的静态进程视图。

    2)对象图:展现了某一时刻一组对象以及它们之间的关系,描述了在类图中所建立的事物的实例的静态快照。

    3)用例图:展现了一组用例、参与者(Actor)以及它们之间的关系。

    4)交互图:用于对系统的动态方面进行建模。一张交互图表现的是一个交互,由一组对象和它们之间的关系组成,包含它们之间可能传递的消息。

    5)状态图:展现了一个状态机,它由状态、转换、事件和活动组成。状态图关注系统的动态视图,强调对象行为的事件顺序。

    6)活动图:是一种特殊的状态图,它展现了在系统内从一个活动到另一个活动的流程,活动图专注于系统的动态视图,它对于系统的功能建模特别重要,并强调对象间的控制流程。活动图一般包括活动状态和动作状态、转换和对象。

    7)构件图:展现了一组构件之间的组织和依赖。构件图专注于系统的静态实现视图,它与类图相关,通常把构件映射为一个或多个类、接口或协作。

    8)组合结构图:组合结构图是一种静态结构图,它用来描述系统中某一部分(即“组合结构” )的内部结构,包括该部分与系统其他部分的交互点,它能够展示该部分内容“内部”参与者的配置情况。

    9)部署图:是用来对面向对象系统的物理方面建模的方法,展现了运行时处理节点以及其中构件(制品)的配置。

    10)包图:是用于把模型本身组织成层次结构的通用机制,不能执行,展现由模型本身分解而成的组织单元以及其间的依赖关系。

4 软件开发模型

    软件开发模型习惯上也称为软件过程模型或者软件生命周期模型,它是软件开发全部过程、活动和任务的结构框架。

4.1 瀑布模型

    将软件生存周期中的各个活动规定为依线性顺序连接的若干阶段的模型,包括需求分析、软件设计、软件编码、软件测试、软件维护。瀑布模型规定了由前至后、相互衔接的固定次序,如同瀑布流水逐级下落。

    瀑布模型以项目的阶段评审和文档控制位手段有效地对整个开发过程进行指导,所以它是以文档作为驱动、适合于软件需求很明确的软件项目的模型

4.2 原型模型

    原型模型又称为快速原型模型,是演化模型的一种,演化模型特别适用于对软件需求缺乏准确认识的情况。原型是预期系统的一个可执行版本,反映了系统性质的一个选定的子集。一个原型不必满足目标软件的所有约束,其目的是能快速、低成本地构建原型

    原型模型比较适合于:

    (1)需求不确定的项目。

    (2)整体规模不太大的项目。

4.3 螺旋模型 

    对于复杂的大型软件,开发一个原型往往达不到要求。螺旋模型将瀑布和原型模型结合起来,加入了两种模型均忽略的风险分析,弥补了这两种模型的不足。螺旋模型将开发过程分为几个螺旋周期,每个螺旋周期大致和瀑布模型相符合。

    每个螺旋周期分为如下4个工作步骤:

    (1) 制订计划

    (2)风险分析

    (3)实施工程

    (4)用户评价

    螺旋模型强调风险分析,使得开发人员和用户对每个演化层出现的风险有所了解,从而做出应有的反应。因此螺旋模型特别适用于庞大、复杂并且具有高风险的系统。

4.4 增量模型

    增量模型融合了瀑布模型的基本成分和原型实现的迭代特征,它假设可以将需求分段为一系列增量产品,每一增量可以分别开发。该模型采用随着日程时间的进展而交错的线性序列,每一个线性序列产生软件的一个可发布的增量,第1个增量往往是核心的产品。增量模型强调每一个增量均发布一个可操作的产品。

4.5 喷泉模型

     喷泉模型是一种以用户需求为动力,以对象作为驱动的模型,适合于面向对象的开发方法。喷泉模型克服了瀑布模型不支持软件重用和多项开发活动集成的局限性。喷泉模型使开发过程具有迭代性和无间隙性。

    (1)优点:可以提高软件项目的开发效率,节省开发时间

    (2)缺点:在开发过程中需要大量的开发人员,不利于项目的管理。此外这种模型要求严格管理文档,使得审核的难度加大。 

4.6 基于构件的模型

    基于构件的开发是指利用预先包装的构件来构造应用系统。构件可以是组织内部开发的构件,也可以是商品化成品软件构件。基于构件的开发模型具有许多螺旋模型的特定,它本质上是演化模型,需要以迭代方式构建软件。不同之处在于,基于构件的开发模型采用预先打包的软件开发应用系统。

4.7 快速应用开发模型

    快速应用开发简称RAD,该模型是一个增量型的软件开发过程模型,强调极短的开发周期。快速应用开发模型通过大量使用可复用构件,采用基于构件的建造方法赢得了快速开发。其流程从业务建模开始,随后是数据建模、过程建模、应用程序生存、测试及交付。

4.8 敏捷规程模型

     敏捷规程模型是指基于迭代开发的软件开发方法。敏捷方法将任务分解为较小的迭代,或者部分不直接涉及长期计划。每次迭代都被视为敏捷流程模型中的短时间“框架”,通常持续一至四个周期,每次迭代都涉及一个团队。在整个软件开发生命周期中进行工作,敏捷规程模型的阶段包括需求分析、设计需求、构建/迭代、测试、部署、反馈等,然后再向客户展示可运行的产品。常见的敏捷规程模型有4种:

    (1)极限编程:简称XP,是激发开发人员创造性、使得管理负担最小的一组技术,核心价值观是沟通、简单、反馈和勇气。五大原则是快速反馈、简单性假设、逐步修改、提倡更改和优质工作。12个最佳实践为:

    1)计划游戏(规划策略)。

    2)小型发布(小版本发布)。

    3)隐喻。

    4)简单设计。

    5)测试先行(测试驱动开发)。

    6)重构(Refactoring)。

    7)  结对编程。

    8)集体代码所有制。

    9)持续集成。

    10)每周工作40个小时。

    11)现场客户(客户测试)。

    12)编码标准。

    (2)水晶法:又称为Crystal方法。水晶法把开发看作是一系列的协作游戏,而写文档的目标是帮助团队在下一个游戏中取得胜利。与XP的高度纪律性不同,水晶法视图用最少纪律约束而仍能成功的方法,从而在产出效率与易于运作上达到一种平衡。

    (3)并列争球法:简称Scrum。使用迭代的方法,其中把每2~4周一次的迭代称为1个冲刺(Sprint),并按需求的优先级来实现产品多个自组织和自治小组并行地递增实现产品,协调是通过简单的日常情况会议进行。

    (4)自适应软件开发法:简称ASD,强调开发方法的适应性,不像其他方法那样有很多具体的实践做法,更侧重为ASD的重要性提高最根本的基础,并从更高的组织和管理层次来阐述开发方法为什么要具备适应性。

5 软件质量管理

5.1 软件质量概述

    软件质量是指反应软件系统或软件产品满足规定或隐含需求的能力的特征和特征全体。常见的模型有两种:

    (1)ISO/IEC 25000 软件质量模型:该模型中将软件与系统的质量特性分为使用质量和产品质量两个部分,其中又包含了其特性以及子特性,具体见下表:

使用质量模型
特性子特性
有效性有效性
效率效率
满意度有用性、可信性、愉悦性、舒适性
抗风险经济风险缓解性、健康和安全风险缓解性、环境风险缓解性
周境覆盖周境完备性、灵活性
产品质量
特性子特性
功能性功能完备性、功能正确性、功能实用性、功能性的依从性
性能效率时间特性、资源利用性、容量、性能效率的依从性
兼容性共存性、互操作性、兼容性的依从性
易用性可辨识性、易学性、易操作性、用户差错防御性、用户界面舒适性、易访问性、易用性的依从性
可靠性成熟性、可用性、容错性、易恢复性、可靠性的依从性
信息安全性保密性、完整性、抗抵赖性、可核查性、真实性、信息安全性的依从性
维护性模块化、可重用性、易分析性、易修改性、易测试性、维护性的依从性
可移植性适应性、易安装性、易替换性、可移植性的依从性

    (2)Mc Call 软件质量模型:该模型从软件产品的运行、修正和转移3个方面确定了11个质量特性,如下图:

5.2 软件质量管理体系

    软件质量管理是指对软件开发过程进行独立的检查活动是指为了实现质量目标而进行的所有质量性质的活动。软件质量管理体系由以下三部分组成:

    (1)质量规划:是识别软件及其可交付成果的质量要求和标准,并准备对策确保符合质量要求的过程。

    (2)质量保证:是为保证软件系统或软件产品充分满足用户要求的质量而进行的有计划、有组织的活动,其目的是生产高质量的软件。

    (3)质量控制:是监督并记录质量活动执行结果,以便评估绩效,并推荐必要的变更的过程。

    软件质量保证包括与7个主要活动相关的各种任务:

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值