CN106708492A - 一种软件设计质量的评价和强制实行 - Google Patents
一种软件设计质量的评价和强制实行 Download PDFInfo
- Publication number
- CN106708492A CN106708492A CN201510795016.0A CN201510795016A CN106708492A CN 106708492 A CN106708492 A CN 106708492A CN 201510795016 A CN201510795016 A CN 201510795016A CN 106708492 A CN106708492 A CN 106708492A
- Authority
- CN
- China
- Prior art keywords
- design
- designing quality
- attribute
- rule
- violation
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明涉及软件设计质量的评价和强制实行,其中,一种系统向软件应用的设计应用设计质量规则以检测违反,并提供描述所检测的对设计质量规则的一个或多个违反的输出。基于该输出,系统接收用户输入以解决对设计质量规则的一个或多个违反,以及在接收用户输入之后,针对对设计质量规则的违反来评价为软件应用开发的代码,以便基于该软件应用设计来评估为该软件应用开发的代码质量。
Description
技术领域
本公开总体上涉及软件设计质量的评价和强制实行。
背景技术
应用可以提供一种建模和开发环境,其利用统一建模语言(UML)来设计软件应用和web服务的架构。应用可以包括这样的能力,即利用UML来关注架构代码分析和模型驱动的开发,以创建有复原能力的应用和web服务。
发明内容
在一方面,一种系统,包括至少一个计算机,以及耦合至该至少一个计算机的至少一个计算机可读介质,其具有存储于其上的指令,当该指令由该至少一个计算机执行时,导致该至少一个计算机执行操作。操作包括:在开发软件应用的代码之前,访问该软件应用的设计;以及访问被限定用于评价该软件应用的设计质量的设计质量规则。操作还包括:向所访问的软件应用设计应用所访问的设计质量规则,以检测对所访问设计质量规则的违反;以及提供描述所检测的对所访问设计质量规则的一个或多个违反的输出。操作进一步包括:基于该输出,接收用以解决对所访问设计质量规则的一个或多个违反的用户输入;以及在接收用以解决对所访问设计质量规则的一个或多个违反的用户输入之后,针对所访问设计质量规则的违反而评价为该软件应用开发的代码,以便基于该软件应用的设计来评估为该软件应用而开发的代码的质量。
实现可以包括以下一个或多个特征。例如,操作可以包括:通过对为软件应用而开发的代码进行逆向工程来获得恢复的软件设计;以及向恢复的软件设计应用所访问设计质量规则,以检测对所访问设计质量规则的违反。在此示例中,操作可以包括:将恢复的软件设计与接收用以解决对所访问设计质量规则的一个或多个违反的用户输入之后存储的软件应用的设计版本进行比较;以及基于比较结果来检测恢复的软件设计与接收用以解决对所访问设计质量规则的一个或多个违反的用户输入之后存储的软件应用的设计版本之间的不一致。可以提供输出,其描述恢复的软件设计与接收用以解决对所访问设计质量规则的一个或多个违反的用户输入之后存储的软件应用的设计版本之间的不一致。
在某些实现中,操作可以包括:接收限定新设计质量规则的用户输入以便向所访问的软件应用设计应用;以及向所访问的软件应用设计应用新设计质量规则,以检测所访问的软件应用设计是否违反新的设计质量规则。操作还可以包括:接收限定对所访问设计质量规则的优先次序的用户输入;以及基于所限定的所访问设计质量规则的优先次序,向所访问的软件应用设计应用所访问设计质量规则。
操作可进一步包括:接收限定所访问设计质量规则针对软件应用的特定适用准则的用户输入;基于所限定的特定适用准则,识别将要向所访问的软件应用设计应用的、所访问设计质量规则的子集;以及向所访问的软件应用设计应用所访问设计质量规则的该子集。此外,操作可以包括:接收限定所访问设计质量规则针对软件应用的排除准则的用户输入;基于该排除标准识别要向所访问的软件应用设计应用的、所访问设计质量规则的子集;以及向所访问的软件应用设计应用所访问设计质量规则的子集。在某些示例中,操作可以包括:初始化针对所访问的软件应用设计以及针对所访问设计质量规则中每个规则的违反列表;识别被应用以规则的设计元素的类型;以及在所访问的软件应用设计中识别所识别类型的设计元素。对于每个所识别设计元素,操作可以包括:向所识别设计元素应用规则;基于向所识别设计元素应用规则来确定所识别设计元素是否违反该规则;以及在确定所识别设计元素违反该规则的情况下,基于该规则和所识别设计元素向违反列表添加违反对于每个所识别设计元素,可以确定所识别设计元素是否被识别为排除在设计质量分析之外;以及在确定所识别设计元素未被识别为排除在设计质量分析之外的情况下,向所识别设计元素应用规则以及确定该规则是否被违反。此外,对于每个所识别设计元素,可以确定规则是否已被应用于所识别设计元素;以及在确定规则尚未应用于所识别设计元素的情况下,向所识别设计元素应用规则以及确定该规则是否被违反。
在某些实现中,操作可以包括:从数据库访问与所检测的对所访问设计质量规则的违反相关的帮助信息;基于所访问帮助信息,生成针对所检测的对所访问设计质量规则的违反的上下文特定帮助消息;以及基于所生成的针对所检测的违反的上下文特定帮助消息而提供输出。操作还可包括:从数据库访问与所检测的对所访问设计质量规则的违反相关的重构(refactoring)信息;基于所访问重构信息,生成针对所检测的对所访问设计质量规则的违反的上下文特定重构建议;以及基于所生成的针对所检测的违反的上下文特定重构建议而提供输出。所生成的上下文特定重构建议可以描述用于纠正所检测的对所访问设计质量规则的违反的建议。操作可以包括:接收更新所访问的软件应用设计以纠正所检测的对所访问设计质量规则的违反的用户输入。
在某些示例中,操作可以包括:接收用以忽略所检测的对所访问设计质量规则的违反的用户输入。在这些示例中,操作可以包括要求忽略所检测的违反以允许所检测的违反被忽略的理由的用户输入;接收描述忽略所检测的违反的理由的用户输入;以及在忽略所检测的违反时记录忽略所检测的违反的理由。此外,在这些示例中,操作可以包括:向活动日志添加指示所检测的违反已被忽略以及忽略所检测的违反的理由的条目;以及允许查看者查看活动日志,其包括指示所检测的违反已被忽略以及忽略所检测的违反的理由的条目。
此外,操作可以包括:访问软件应用的部分设计;以及向软件应用的部分设计应用所访问设计质量规则,以检测对所访问设计质量规则的违反。操作还可包括:在接收用以解决对所访问设计质量规则的一个或多个违反的用户输入之后,生成未解决违反报告,其指定软件应用的设计中尚未纠正的至少一个已检测的违反;以及向查看者提供未解决违反报告。
在另一方面,一种方法,包括:在开发软件应用的代码之前,访问该软件应用的设计;以及访问被限定用于评价该软件应用的设计质量的设计质量规则。该方法还包括:向所访问的软件应用设计应用所访问设计质量规则,以检测对所访问设计质量规则的违反;以及提供描述所检测的对所访问设计质量规则的一个或多个违反的输出。该方法进一步包括:基于该输出,接收用以解决对所访问设计质量规则的一个或多个违反的用户输入;在接收用以解决对所访问设计质量规则的一个或多个违反的用户输入之后,针对所访问设计质量规则的违反而评价为该软件应用开发的代码,以便基于该软件应用的设计来评估为该软件应用而开发的代码的质量。
在又一方面,编码有可执行指令的至少一个计算机可读存储介质,当该可执行指令由至少一个处理器执行时,致使该至少一个处理器执行操作。操作包括:在开发软件应用的代码之前,访问该软件应用的设计;以及访问被限定用于评价该软件应用的设计质量的设计质量规则。操作还包括:向所访问的软件应用设计应用所访问设计质量规则,以检测对所访问设计质量规则的违反;以及提供描述所检测的对所访问设计质量规则的一个或多个违反的输出。操作进一步包括:基于该输出,接收用以解决对所访问设计质量规则的一个或多个违反的用户输入;以及在接收用以解决对所访问设计质量规则的一个或多个违反的用户输入之后,针对所访问设计质量规则的违反而评价为该软件应用开发的代码,以便基于该软件应用的设计来评估为该软件应用而开发的代码的质量。
在另一方面,一种系统,包括至少一个处理器,以及耦合至该至少一个处理器的存储器,其具有存储于其上的指令,当该指令由该至少一个处理器执行时,致使该至少一个处理器执行操作。操作包括:访问软件应用的设计;以及访问与至少一个设计质量属性相关联的设计质量规则。所访问的设计质量规则被限定用于从至少一个设计质量属性方面评价软件应用的设计质量。操作还包括:向所访问的软件应用设计应用所访问设计质量规则,以检测对所访问设计质量规则的违反;以及针对至少一个设计质量属性,累积通过向所访问的软件应用设计应用所访问设计质量规则而检测的违反。操作进一步包括:基于所累积的违反计算针对所访问软件应用设计的设计质量指标;以及基于所计算的设计质量指标提供与软件应用的设计质量相关的输出。
实现可以包括以下一个或多个特征。例如,操作可以包括:识别被分类为涉及至少一个设计质量属性的设计质量规则的子集;向所访问的软件应用设计应用所识别设计质量规则,以检测对所识别设计质量规则的违反;以及累积通过向所访问的软件应用设计应用所识别设计质量规则而检测的所有违反。在另一示例中,操作可以包括:访问被限定用于评价软件应用的设计质量的所有设计质量规则;识别涉及至少一个设计质量属性的所检测的违反;以及累积涉及至少一个设计质量属性的所识别违反。
此外,操作可以包括:针对至少一个设计质量属性,跨所访问的软件应用设计中包括的每个类而聚集所检测的违反;以及针对至少一个设计质量属性,使用针对所访问的软件应用设计中包括的每个类的聚集违反,跨软件应用的设计来累积所检测违反。操作还可以包括:对涉及至少一个设计质量属性的所检测违反进行计数。
在某些实现中,操作可以包括:访问涉及多个不同设计质量属性的设计质量规则;以及针对多个不同设计质量属性的每一个,累积涉及相应设计质量属性的所检测违反。在这些实现中,操作可以包括:针对多个不同设计质量属性的每一个,并且基于针对相应的设计质量属性而累积的违反,计算从相应的设计质量属性方面反映软件设计质量的度量;以及基于针对多个不同设计质量属性中每一个而计算的度量,计算设计质量复合指标。此外,在这些实现中,操作可以包括访问涉及系统所评价的所有设计质量属性的设计质量规则。
在某些示例中,操作可以包括:访问涉及性能设计质量属性、安全设计质量属性以及僵化度(rigidity)设计质量属性的设计质量规则。在这些示例中,操作可以包括:针对性能设计质量属性,累积涉及性能设计质量属性的所检测违反;针对安全设计质量属性,累积涉及安全设计质量属性的所检测违反;以及针对僵化度设计质量属性,累积涉及僵化度设计质量属性的所检测违反。而且,在这些示例中,操作可以包括:针对性能设计质量属性,并且基于针对性能设计质量属性而累积的违反,计算从性能设计质量属性方面反映软件设计质量的性能度量;针对安全设计质量属性,并且基于针对安全设计质量属性而累积的违反,计算从安全设计质量属性方面反映软件设计质量的安全度量;以及针对僵化度设计质量属性,并且基于针对僵化度设计质量属性而累积的违反,计算从僵化度设计质量属性方面反映软件设计质量的僵化度度量。操作可以包括:通过结合性能度量、安全度量和僵化度度量,计算设计质量复合指标。
此外,操作可以包括:访问性能加权因子、安全加权因子和僵化度加权因子;将性能度量与性能加权因子相乘以确定性能值;将安全度量与安全加权因子相乘以确定安全值;将僵化度度量与僵化度加权因子相乘以确定僵化度值。操作还可以包括:对性能值、安全值和僵化度值求和,以确定设计质量复合指标。
在某些实现中,操作可以包括:访问涉及性能设计质量属性的设计质量规则;针对性能设计质量属性,累积涉及性能设计质量属性的所检测违反;以及基于涉及性能设计质量属性的所累积违反,计算针对所访问的软件应用设计的性能度量。性能度量可以从性能方面反映软件设计质量。
另外,操作可以包括:访问涉及安全设计质量属性的设计质量规则;针对安全设计质量属性,累积涉及安全设计质量属性的所检测违反;以及基于涉及安全设计质量属性的所累积违反,计算针对所访问的软件应用设计的安全度量。安全度量可以从安全方面反映软件设计质量。
具体实施方式
用于评价和强制实行软件设计质量的示例系统。模型处理器可以评价软件应用的设计。例如,模型处理器可以评价针对从UML(统一建模语言)设计库访问的模型的UML设计。可以例如在开发用于相关软件应用的代码之前评价UML模型。
作为另一示例,可以评价经逆向工程的模型。例如,如果对于模型的UML设计不存在,则可以根据代码库中的代码来创建UML模型。例如,可以使用提取器组件从代码中提取类、接口和包信息,并且可以使用依赖关系定位器组件来识别类、包和其他设计元素之间的依赖关系。模型创建器可以使用提取的类、接口和包信息以及识别出的依赖关系来创建模型。恢复的设计可以存储在UML设计库中或者在UML模型库中。
模型处理器可以处理原始设计或者经逆向工程的设计,以产生诸如度量、签名元数据和注解之类的模型信息,这些模型信息可以存储在模型信息库中。此外,用户可以创建一个或更多包注解,其亦可存储在模型信息库中。包注解例如可以包括关于类、包和其他软件元素的设计的注释。
规则引擎可以访问来自规则库的设计质量规则。规则库可以包括预定规则并且还可以包括由用户使用规则/规则集定制组件定制的规则。可以定义设计质量规则来评价软件应用的设计质量。
规则引擎可以处理来自模型信息库的模型信息,对设计应用获取自规则库的规则以检测对设计质量规则的违反。如果发现对规则的违反,则可以将违反存储在违反数据库中。还可以使用可视化和报告组件将违反报告给用户。可视化和报告组件可以向用户显示重构建议。重构建议可以通过上下文重构组件来确定,该上下文重构组件可以基于获取自设计质量知识库的信息来提供建议。用户可以提供用户输入,以解决对设计质量规则的一个或更多违反。例如,用户可以使用建模应用来提供输入,从而更新设计以纠正检测到的对设计质量规则的一个或更多的违反。作为另一示例,用户可以提供输入以忽略检测到的违反,并且可以提供对于为什么可以忽略该违反的理由。
用于分析软件设计的过程200。可将过程200的操作一般地描述为由系统来执行。过程200的操作可以由系统的组件之一(例如,模型处理器)来执行,或者可以由系统的组件组合来执行。在一些实现中,过程200的操作可以由包含在一个或更多电子设备中的一个或更多处理器来执行。
当过程200开始时(202),系统确定是否有用于模型的代码存在(204)。例如,参考,模型处理器可以确定在代码库中是否存在用于模型的代码。
执行。过程300的操作可以由系统的组件之一(例如,模型处理器)来执行,或者可以由系统的组件组合来执行。在一些实现中,过程300的操作可以由包含于一个或更多电子设备中的一个或更多处理器来执行。
系统读取设计模型(302)。举例而言并且参考,模型处理器可以访问来自UML设计库的设计模型。
系统向用户显示可用的注解(304)。例如,可以在建模应用中显示设计模型,并且可以在建模应用中显示包含于设计中的注解。
系统确定是否存在新的注解(306)。例如,系统可以接收来自用户的、表示向设计添加新注解的请求的用户输入。
如果存在新的注解,则系统接收定义一个或更多新注解的用户输入(308)。例如,用户可以提供关于注解的详情(例如,文本注释)。
系统接收向模型应用注解的用户输入(310)。例如,用户可以识别与一个或更多注解相关的一个或更多软件元素(例如,类、包)。
系统向用户显示设计质量规则(312)。例如,可以在用户界面中向用户显示现有设计质量规则。用户界面可以显示每条规则的名称、作用域和解释。可以从规则库(例如,的库)中获取设计质量规则。
系统确定是否有新的设计质量规则(314)。例如,用户可以提供指示出对于添加新规则的请求的用户输入。
如果有新的设计质量规则,则系统接收定义一个或更多新规则的用户输入(316)。例如,用户可以为规则提供名称、描述、适用的作用域(例如,包、类、序列图、接口),以及定义规则的条件(例如,基于软件元素的一个或更多属性的条件,诸如类或接口的操作数量、子代数量、包中类的数量或者任何其他属性)。
系统接收将规则优先的用户输入(318)。例如,用户可以使用用户界面来将规则列表排列在代表期望的规则优先权的顺序之中(例如,置于优先列表的顶部附近的规则可以具有比置于优先列表的底部附近的规则更高的优先权)。
系统接收指定针对规则执行的适用准则和排除准则的用户输入(320)。例如,用户可以指定要从规则执行中排除的一个或更多规则或者一个或更多规则类型。作为另一示例,用户可以指定要从评价中排除的多设计元素(例如,类、包)。
系统在模型上运行规则(322)。在下文中关于更为详细地描述了规则在模型上的运行。示出了用于在软件模型上运行规则的过程400。过程400的操作大体被描述为由系统执行。过程400的操作可以由系统的组件之一(例如,模型处理器)来执行,或者可以由系统的组件组合来执行。在一些实现中,过程400的操作可以由包含于一个或更多电子设备中的一个或更多处理器来执行。
系统初始化违反列表(402)。例如,可以将违反列表表示为一个或更多数据结构或者软件对象,或者表示为数据库系统中的一个或更多数据元素。
系统识别规则(404)。例如,可以从获取自规则库(例如,以上关于描述的设计质量规则库)的规则列表中识别规则。
系统识别将向其应用规则的设计元素的类型(406)。例如,规则可能适用于诸如类、接口、包或者序列图之类的设计元素。
系统识别已识别类型的设计元素(408)。例如,如果设计元素类型为类,则系统识别出包含于软件设计中的类。
系统确定设计元素是否位于针对该规则的排除列表中(410)。例如,可能存在用户指定的排除列表,而用户指定的设计元素可能包含于在应用设计质量规则时要排除的排除列表之中。如果设计元素在排除列表中,则不向该设计元素应用规则。
如果设计元素不在规则的排除列表中,则系统确定是否已向该设计元素应用了规则(412),并且如果尚未向该设计元素应用规则,则系统在该设计元素上应用规则(414)。对于一些规则而言,可以为设计元素确定与规则相关的一个或更多度量(例如,操作数量、祖代数量)。如果已向设计元素应用规则,则系统不再向该设计元素应用规则。系统确定规则是否被违反(416)。例如,可以将用于设计元素的一个或更多度量与某一阈值相比较。例如,如果由一个接口所限定的操作数量超过20这一阈值,则可能违反“神圣的接口”规则(例如,的规则614)。作为另一示例,如果一个序列图中的远程调用数量超过3这一阈值,则可能违反过度远离规则(例如,的规则628)。
对于某些规则而言,如果设计元素具有特定特征,则可能违反该规则。例如,如果类包括私有构造函数,则可能违反在类中找到的私有构造函数的规则(例如中的规则612)。又例如,如果类具有不从该类的包外访问的公有方法,则可能违反非API(应用编程接口)方法访问规则(例如中的规则610)。再例如,如果包仅具有实体类而不具有接口,则可能违反面向契约设计的规则(例如中的规则620)。
如果违反了规则,则系统产生违反并向违反列表添加该违反(418)。例如,添加至该违反列表的违反可包括关于下述内容的信息:规则类型、规则优先级、由规则违反影响的非功能属性以及引起该规则违反的设计元素的标识符。
系统确定是否存在更多的设计元素(420)。例如,如果与规则相关的设计元素种类是类,则系统确定在所述规则尚未应用的设计模型中是否包括其他类。
如果存在有更多的设计元素,则系统识别已识别类型的下一个设计元素(408),并将该规则的应用重复至下一个设计元素。例如,如果该设计元素类型是类,则系统识别在所述规则尚未应用的设计模型中所包括的类,并将该规则应用至已识别的类。如果不存在更多的设计元素,则系统确定是否存在更多的规则(422)。例如,系统可以确定从规则库中获取的所有规则是否已被应用至该设计。如果存在更多规则,则系统使用已识别的规则来重复步骤404至步骤420。如果不存在更多规则,则系统识别违反列表中的违反(424)。例如,可使用迭代器对象来对违反列表中的违反对象集进行迭代。又例如,可使用数据库指针来对从数据库中获取的违反数据库记录进行迭代。系统使用帮助数据库来创建通用上下文帮助(426)。例如,可从帮助数据库来访问与已访问设计质量规则的已检测的违反相关的帮助信息(例如上文参考描述的设计质量知识库)。基于已访问的帮助信息,可以生成上下文特定帮助信息,该上下文特定帮助信息用于已访问的设计质量规则的已检测的违反,并且该帮助信息可向用户显示。系统使用重构数据库来创建一个或多个上下文重构建议(428)。例如,可以从数据库访问与已访问的设计质量规则的已检测的违反相关的重构信息(例如上文参考描述的设计质量知识库)。基于已访问的重构信息,可以生成上下文特定的重构建议,该上下文特定的重构建议用于已访问的设计质量规则的已检测的违反。所生成的上下文特定的重构建议可以描述一种建议,该建议用于纠正已访问的设计质量规则的已检测的违反。可向用户显示所述重构建议。
系统确定是否忽略违反(430)。例如,如果用户指示他们希望忽略违反或者该违反是包括在用户排除列表中的违反类型,则系统可确定忽略违反。
如果违反被忽略,则系统接收该违反删除的理由(432)。例如,当用户详细说明他们希望忽略该违反时,用户可以提供忽略的理由。系统可以要求用户提供忽略违反的理由,使得留存理由并可在后期审核。
系统向活动日志添加条目(434)。例如,可以向活动日志添加条目以指示检测的违反已被忽略和指示忽略检测的违反的理由。
系统确定是否存在更多违反(436)。例如,系统可以确定违反列表中是否存在未处理的违反。如果存在更多违反,则系统识别违反列表中的下一个违反(424)并对识别的违反重复步骤426至步骤434。
返回到,系统接收用户输入以对模型进行重构(324)。例如,可接收用户输入以通过更新设计来处理已访问的设计质量规则的一个或多个违反。
系统确定用户是否对分析满意(326)。例如,设计审核者可指示该设计是否可接受。如果用户对该设计满意,则系统生成报告(328)。例如,可以生成设计审核问题报告。又例如,可生成未解决的违反报告,例如用于审核的输入。如果用户对于设计不满意,则系统可能在重构模型之后,对模型重新运行规则(322)。
示出了规则类别500的示例。例如,规则可以包括功能组件相关规则502、基于技术的规则504、基于架构的规则506、基于模式的规则508和基于度量的规则510。例如,功能组件相关的规则502可以是项目专用的,而非通用的。例如,用于特定项目的功能组件规则可以说明订单管理组件不应与工资表组件互动。功能组件相关规则502可以包括用户指定的规则,例如,使用规则自定义框架或设计注解框架来限定的规则。
基于技术的规则504可以包括属于使用特定技术或特定框架来最佳地实行的规则,例如特定web技术或电子商务技术框架。又例如,基于技术的规则504可以包括可与在特定环境中改进性能相关的规则。例如,用于网络环境的基于技术的规则可以基于限制在系统组件之间远程调用。
基于度量的规则510可包括主要基于或单独基于从软件代码或软件设计模型(例如UML模型)导出的度量的规则。基于度量的规则可用于评估设计的结构质量。规则可以基于一个或多个复合度量(例如,基于一个或多个其他度量的度量)。一个或多个复合度量可用作获取诸如组件可测试性之类的目标的基础。例如,可测试性规则可基于一个或多个度量,所述一个或多个度量指示类或包中公有操作的数量。基于度量的规则可基于自定义阈值。例如,在某些环境中,用于继承树的最大推荐深度的阈值可以是2,而在其他某些环境中,承树的最大推荐深度可以是3。
基于模式的规则508可基于比基于度量的规则510更高级别的抽象。例如,基于模式的规则508可包括基于“四元组(gang offour)”模式(在“设计模式:可重复使用的面向对象软件的元素”中描述的设计模式,该书由Gamma、Helm、Johnson和Vlissides撰写)、或在其他文献中建议的其他模式、或由用户指定的自定义模式的规则。例如,通过分析设计元素之间的依赖关系或通过分析设计元素的签名,可识别模式。基于模式的规则508的示例包括面向契约设计和面向接口程序的模式(将在下文中更详细地描述)。
基于架构的规则506可以包括具有比基于模式的规则508更高抽象的规则。例如,基于架构的规则506可以基于架构组件的结构和架构组件之间的关系。基于架构的规则506可以包括基于预定结构和关系指南的规则,以及基于组织专用或用户专用指南的规则。基于架构的规则506可被模板化,并可基于知识库中所包含的其他结构规则和基于关系规则。
示出了示例规则602至630的表600。表600包括作用域栏601,该作用域栏指示了每个示例规则602至603的可应用的作用域,例如类、接口、包或顺序图。例如,规则602至630以及例如由用户定义的自定义规则之类的其他规则可由规则引擎()使用。例如,如果过量的类(例如相比于阈值)基于特定的类,则可能违反过度扇入度量规则602。例如,如果对类使用了过度继承(例如相比于阈值),则可能违反过度继承规则604。例如,具有高级别继承的类可成为扩展性的瓶颈,并且对该类的改变可影响该类的子类。例如,如果具有非常大量的行为(例如相比于阈值),则可能违反“神圣的类(godly class)”规则606。具有大量行为的类(例如功能类)可考虑用于重构。
例如,如果类具有许多向内的依赖关系和高级别继承(例如,相比于阈值),则可能违反高耦合、高继承和高依赖关系出规则608。这种类可表示“脆弱”类,并且,如果这种类失效(例如在测试过程中失效),则从属类可能被影响。例如,如果类具有公有方法但是该类不被该类包外的其他类访问,则可能违反非API方法访问规则610。理想地,仅当由公有方法暴露的特定功能是由其他类访问(特别是来自该类的包外的类)时,类才具有公有方法。如果类具有不被其他包中类访问的公有方法,则类中所暴露的公有方法可最终导致功能的错误使用并破坏系统的API。
例如,如果在类定义的内部找到私有构造函数,则可能违反在类中找到的私有构造函数的规则612。私有构造函数可用于阻止类的实例化。然而,私有构造函数并非某些语言的默认值。因此,私有构造函数可被标记用于进一步的评价。例如,如果接口具有大量的行为(例如相比于阈值),则可能违反“神圣的接口(godly interface)”的规则614。具有大量行为的接口可被考虑用于重构。由于接口的每个客户端都依赖于所暴露的类接口,所以在类的每个客户端之间具有无意的耦合。如果一个客户端需要向单类接口添加额外的功能,则当这种功能被添加至所述接口时,每个其他客户端可能需要改变以支持所添加的功能,尽管许多类可能不需要该功能。因此,一个客户端的一个改变可能迫使在整个系统内将改变传播到许多客户端类,这可导致耗时的代码维护并难于定位软件漏洞。
例如,如果包通过实体类而非通过接口被耦合至所述系统的剩余部分,则可能违反PIF(面向接口编程的因素)规则616。理想地,包仅通过接口耦合。使用实体类而非接口可导致低扩展性的包。例如,如果包包括多于阈值数量的类和/或接口,则可能违反“神圣的包”的规则618。具有较大数量的类和/或接口的包可以包括太多的功能,并因此可作为重构的候选。
例如,如果包的类与接口的比例过高或过低(例如相对于阈值),则可能违反面向契约设计的规则620。例如,仅具有类的包可以是绝对实体的并且不可被扩展。然而,仅具有接口的包可以是绝对抽象的,并且如果该包未被标记作为框架包,则它可视为被错误标记。例如,如果低级别模块依赖于高级别模块,则可能违反依赖关系反转规则622。理想地,高级别模块不依赖于低级别模块,并且高级别模块和低级别模块仅依赖于抽象。例如,如果包通过耦合链接至系统中的大量包(例如相对于阈值),则可能违反全向存在包的规则624。通常,全向存在包是包括系统的工具类或核心组件的包。如果存在太多全向存在包,则可以考虑重构所述系统。
例如,如果软件实体不对扩展开放并对修改封闭,则可能违反开放封闭的规则626。一般而言,开放封闭原理可应用于类、模块或函数。对扩展开放但对修改封闭可以阻止对系统不利的改变。如果顺序图包括大量的远程调用(例如相比于阈值),则可能违反过度远程规则628。大量的远程调用可以影响性能。例如,如果类具有多重构造函数,则可能违反工厂规则630。对于类而言,具有多重构造函数可使得在研发期间难于确定调用哪个构造函数。在具有非公有构造函数的类层级中具有所有的类,以及创建客户端可用于直接实例化类的工厂类可能是有用的,该被实例化的类驻留于一个包中并实现共用接口。
可能违反其他规则。例如,如果在类之间存在过度耦合,则可能违反过度耦合规则。如果包的抽象不与其稳定性成比例(例如,如果稳定包不是抽象的或是不稳定的包不是实体的),则可能违反缺乏稳定抽象规则。如果包依赖于另一较不稳定的包,则可能违反稳定的依赖关系规则。如果方法涉及其他类的数据多过涉及自身类的数据,则可能违反“特征依恋(feature-envy)”规则。如果方法包括多于阈值数量的代码行(长的方法可能难于理解、调试和重复使用),则可能违反“长方法(long-method)”规则。如果类具有多于阈值数量的公有访问器方法,则可能违反数据-类规则(触发进一步查询)。
示例度量702至744的表700。表700包括作用域栏701,该作用域栏指示每个示例度量702至744的可应用的作用域,例如类、接口、包或顺序图。例如,可与一个或多个基于度量的规则510()结合来使用度量702至744。
NOC(子类数量)度量702指示类的子类(例如UML概括)的数量。“Opslnh”(继承的操作)度量704指示类的继承操作的数量,而“Attrlnh”(继承的属性)指示类的继承属性的数量。“DIT”(继承树的深度)度量708指示继承层级中类的深度,并且可以表明从所述类到继承树的根的最长路径。
“NumDesc”(后代的数量)度量710指示了类的后代数量(例如类的子类数量、类的子类的子类的数量,等等)。“NumAnc”(祖先的数量)度量712指示了类的祖先的数量。“Dep_In”(依赖关系指示符)度量714指示了基于类的元素的数量,并且可以包括传入UML依赖关系(例如UML图上的虚箭头)、方法调用或参数类型依赖关系。
“NumAssEl”(相关元素的数量)度量716指示了作为类的相同作用域(例如,命名空间、包)中的相关元素的数量。鼓励在相同作用域中的元素关联,因为它们不跨越作用域界限并有助于包或命名空间内的内聚。关联可包括合并、组合以及UML关联,并且可包括传入、传出和双向关联。
“NumOps”(操作的数量)度量718指示了类中操作的数量。例如,可包括被明确建模的所有操作,无论其可视性、所有者作用域以及抽象程度。然而,可能不包括继承操作。“取得器(getter)”度量720可指示具有以“取得”、“是”、“具有”开头的名称的类的操作数量。“设置器”度量722指示具有以“设置”开头的名称的类的操作数量。连接符度量724指示由类所拥有的连接符的数量。
[0]“NumOps”(操作的数量)度量726类似于NumOps度量718,但是指示的是接口的继操作数量而非类的操作数量。“Assoc”(关联)度量728指示了接口关联的元素的数量。“NumAnc”(祖先的数量)度量730类似于NumAnc度量712,但是它指示的是接口的祖先数量而非类的祖先数量。“NumlndClients”(间接客户端的数量)度量732指示了实现接口后代的元素数量,而“NumDirClients”(直接客户端的数量)度量734指示了直接实现接口的元素数量。
“NumOpsCls”(类中操作的数量)度量736指示了包的类中操作的数量,而“NumClsRec”(递归的类的数量)度量738指示了包以及该包的子包中的类的数量。嵌套度量740指示了包层级中包的嵌套级别。NumCls(类的数量)度量742指示了包中类的数量,以及“Numlnterf”(接口的数量)度量744指示了包中接口的数量。
至0分别示出了示例用户接口800至2000,其示出了在软件设计上运行设计质量规则的迭代过程的多个方面。例如,示出了示例用户接口800。用户接口800包括正在显示示例违反804-814的违反视02。违反视02可以列出当向软件设计应用设计质量规则时发现的零个或多个违反,并且可以显示针对每个所示违反的各种信息。违反804-814可以应用于包括在模型视16中显示的模型815中的软件设计元素。例如,如分别在列820和822中指示的,违反804是可应用于PackageDiagram包的“强制实行依赖关系反转”违反(例如,PackageDiagram包的内容可以显示在模型视16中)。如分别在列824、826和828中所示,违反804与“高直接耦合”,其会影响非功能的可扩展性属性,并且是中等优先级。
描述了多种实现。但是,应当理解,可以在不脱离所公开精神和范围的前提下做出各种修改。因此,其他实现也落入所附权利要求的范围内。
Claims (10)
1.一种用于评价和强制实行软件设计质量的系统,包括:
用于访问软件应用的设计的装置;用于访问与至少一个设计质量属性相关联的设计质量规则的装置,所访问设计质量规则被限定用于从所述至少一个设计质量属性的方面来评价软件应用的设计的质量;用于向所访问的所述软件应用的设计应用所述所访问设计质量规则以检测对所述所访问设计质量规则的违反的装置;用于针对所述至少一个设计质量属性而累积通过向所访问的所述软件应用的设计应用所述所访问设计质量规则而检测的违反的装置;用于基于所累积的违反计算针对所访问的所述软件应用的设计的设计质量指标的装置;以及用于基于所计算的设计质量指标,提供与所述软件应用的设计质量相关的输出的装置。
2.根据权利要求1所述的系统,其中用于访问与至少一个设计质量属性相关联的设计质量规则的装置包括:用于识别被分类为涉及所述至少一个设计质量属性的设计质量规则的子集的装置;其中用于向所访问的所述软件应用的设计应用所述所访问设计质量规则以检测对所述所访问设计质量规则的违反的装置包括:用于向所访问的所述软件应用的设计应用所识别的设计质量规则,以检测对所述所识别设计质量规则的违反的装置;以及其中用于针对所述至少一个设计质量属性而累积通过向所访问的所述软件应用的设计应用所述所访问设计质量规则而检测的违反的装置包括:用于累积通过向所访问的所述软件应用的设计应用所述所识别设计质量规则而检测的所有违反的装置。
3.根据权利要求1所述的系统:其中用于访问与至少一个设计质量属性相关联的设计质量规则的装置包括:用于访问被限定用于评价软件应用的设计质量的所有设计质量规则的装置;以及其中用于针对所述至少一个设计质量属性而累积通过向所访问的所述软件应用的设计应用所述所访问设计质量规则而检测的违反的装置包括:用于识别涉及所述至少一个设计质量属性的所检测违反的装置;以及用于累积涉及所述至少一个设计质量属性的所识别的违反的装置。
4.根据权利要求1所述的系统,其中用于针对所述至少一个设计质量属性累积通过向所访问的所述软件应用的设计应用所述所访问设计质量规则而检测的违反的装置包括:用于针对所述至少一个设计质量属性跨所访问的所述软件应用的设计中包括的每个类而聚集所检测的违反的装置;以及用于针对所述至少一个设计质量属性使用针对所访问的所述软件应用的设计中包括的每个类的聚集违反,跨所述软件应用的设计来累积所检测的违反的装置。
5.根据权利要求1所述的系统,其中用于针对所述至少一个设计质量属性累积通过向所访问的所述软件应用的设计应用所述所访问设计质量规则而检测的违反的装置包括:用于对涉及所述至少一个设计质量属性的所检测违反进行计数的装置。
6.根据权利要求1所述的系统,其中用于访问与至少一个设计质量属性相关联的设计质量规则的装置包括用于访问
涉及多个不同设计质量属性的设计质量规则的装置;其中用于针对所述至少一个设计质量属性累积通过向所访问的所述软件应用的设计应用所述所访问设计质量规则而检测的违反的装置包括:用于针对所述多个不同设计质量属性的每一个而累积涉及相应设计质量属性的所检测违反的装置;以及其中用于基于所累积的违反计算针对所访问的所述软件应用的设计的设计质量指标的装置包括:用于针对所述多个不同设计质量属性的每一个并且基于针对相应的设计质量属性而累积的违反计算从所述相应的设计质量属性方面反映软件设计质量的度量的装置;以及用于基于针对所述多个不同设计质量属性中每一个而计算的所述度量而计算设计质量复合指标的装置。
7.根据权利要求6所述的系统,其中用于访问涉及多个不同设计质量属性的设计质量规则的装置包括用于访问涉及所述系统所评价的所有设计质量属性的设计质量规则的装置。
8.根据权利要求6所述的系统:其中用于访问涉及多个不同设计质量属性的设计质量规则的装置包括:用于访问涉及
性能设计质量属性、安全设计质量属性以及僵化度设计质量属性的设计质量规则的装置;其中用于针对所述多个不同设计质量属性的每一个而累积涉及相应设计质量属性的所检测违反的装置包括:用于针对所述性能设计质量属性而累积涉及所述性能设计质量属性的已检测违反的装置;用于针对所述安全设计质量属性而累积涉及所述安全设计质量属性的已检测违反的装置;以及用于针对所述僵化度设计质量属性而累积涉及所述僵化度设计质量属性的已检测违反的装置;其中用于针对所述多个不同设计质量属性的每一个并且基于针对相应的设计质量属性而累积的违反计算从所述相应的设计质量属性方面反映软件设计质量的度量的装置包括:用于针对所述性能设计质量属性并且基于针对所述性能设计质量属性而累积的违反来计算从所述性能设计质量属性方面反映软件设计质量的性能度量的装置;用于针对所述安全设计质量属性并且基于针对所述安全设计质量属性而累积的违反来计算从安全设计质量属性方面反映软件设计质量的安全度量的装置;以及用于针对所述僵化度设计质量属性并且基于针对所述僵化度设计质量属性而累积的违反来计算从僵化度设计质量属性方面反映软件设计质量的僵化度度量的装置;以及其中用于基于针对所述多个不同设计质量属性中每一个而计算的所述度量而计算设计质量复合指标的装置包括:用于通过结合所述性能度量、所述安全度量和所述僵化度度量而计算设计质量复合指标的装置。
9.根据权利要求8所述的系统,其中用于结合所述性能度量、所述安全度量和所述僵化度度量的装置包括:用于访问性能加权因子、安全加权因子和僵化度加权因子的装置;用于将所述性能度量与所述性能加权因子相乘以确定性能值的装置;用于将所述安全度量与所述安全加权因子相乘以确定安全值的装置;用于将所述僵化度度量与所述僵化度加权因子相乘以确定僵化度值的装置;以及用于对所述性能值、所述安全值和所述僵化度值求和以确定所述设计质量复合指标的装置。
10.根据权利要求1所述的系统:其中用于访问与至少一个设计质量属性相关联的设计质量规则的装置包括用于访问涉及性能设计质量属性的设计质量规则的装置;其中用于针对所述至少一个设计质量属性而累积通过向所访问的所述软件应用的设计应用所述所访问设计质量规则而检测的违反的装置包括:用于针对所述性能设计质量属性而累积涉及所述性能设计质量属性的已检测违反的装置;以及其中用于基于所累积的违反计算针对所访问的所述软件应用的设计的设计质量指标的装置包括:用于基于涉及所述性能设计质量属性的已累积违反来计算针对所访问的所述软件应用的设计的性能度量的装置,所述性能度量从性能方面反映软件设计质量。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510795016.0A CN106708492A (zh) | 2015-11-18 | 2015-11-18 | 一种软件设计质量的评价和强制实行 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510795016.0A CN106708492A (zh) | 2015-11-18 | 2015-11-18 | 一种软件设计质量的评价和强制实行 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106708492A true CN106708492A (zh) | 2017-05-24 |
Family
ID=58932262
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510795016.0A Pending CN106708492A (zh) | 2015-11-18 | 2015-11-18 | 一种软件设计质量的评价和强制实行 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106708492A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111190780A (zh) * | 2019-12-30 | 2020-05-22 | 杭州涂鸦信息技术有限公司 | 一种支持多平台的产测方法、产测设备及产测系统 |
-
2015
- 2015-11-18 CN CN201510795016.0A patent/CN106708492A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111190780A (zh) * | 2019-12-30 | 2020-05-22 | 杭州涂鸦信息技术有限公司 | 一种支持多平台的产测方法、产测设备及产测系统 |
CN111190780B (zh) * | 2019-12-30 | 2023-10-20 | 杭州涂鸦信息技术有限公司 | 一种支持多平台的产测方法、产测设备及产测系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102193797B (zh) | 软件设计质量的评价和强制实行 | |
Almorsy et al. | Automated software architecture security risk analysis using formalized signatures | |
US8494832B2 (en) | Method and apparatus for software simulation | |
Díaz et al. | Static analysis of source code security: Assessment of tools against SAMATE tests | |
Dillig et al. | Static error detection using semantic inconsistency inference | |
CN112256271A (zh) | 一种基于静态分析的区块链智能合约安全检测系统 | |
Briand et al. | Automated, contract-based user testing of commercial-off-the-shelf components | |
Ahmad et al. | Don't cweat it: Toward cwe analysis techniques in early stages of hardware design | |
Kundu et al. | A UML model-based approach to detect infeasible paths | |
CN106708492A (zh) | 一种软件设计质量的评价和强制实行 | |
CN105630660A (zh) | 一种软件设计质量的评价和强制实行 | |
Schoenboeck et al. | Catch me if you can–debugging support for model transformations | |
Turnquist et al. | Python testing cookbook | |
Panahandeh et al. | MUPPIT: A method for using proper patterns in model transformations | |
Willmor et al. | Testing the implementation of business rules using intensional database tests | |
Sen et al. | State‐Model‐Based Regression Test Reduction for Component‐Based Software | |
Pires et al. | UML-based design test generation | |
Le Noir et al. | Operation based model representation: experiences on inconsistency detection | |
Sneed et al. | A process for assessing data quality | |
Hammad et al. | An approach to automatically enforce object-oriented constraints | |
Abushark et al. | A framework for automatically ensuring the conformance of agent designs | |
Casaluce et al. | White-box validation of quantitative product lines by statistical model checking and process mining | |
White et al. | An early detection tool in Eclipse to support secure coding practices | |
Hessellund et al. | Interfaces and metainterfaces for models and metamodels | |
Lefticaru et al. | X-Machine based testing for cloud services |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20170524 |
|
WD01 | Invention patent application deemed withdrawn after publication |