软件的程序代码的生成方法及装置
技术领域
本发明涉及计算机领域,具体而言,涉及一种软件的程序代码的生成方法及装置。
背景技术
依赖属性是软件开发中应用的重要手段之一,设计依赖属性的目的就是根据多个不同的输入动态计算出属性值,这些不同的输入包括:资源文件、绑定、动画、属性继承等,现有技术对于依赖属性的定义通常采取如下部分代码:
从上述代码可知,定义依赖属性非常较为繁琐,每次定义都要手动输入大量内容,但是从中可以发现规律,即除了上述斜体字,其他的字符都是固定不变的,现有技术中解决的方案比如visual studio或Resharper等工具都可以在界面上自动生成上述固定不变的字符串,即在IsSpinning或bool等依赖属性的属性值上采用斜体等特殊方式标识。用户只需针对有标识的属性特征值进行输入,以解决上述输入繁琐的问题。
这里需要说明的是,上述代码中多次重复出现依赖属性名称,例如,IsSpinning,用户每次修改依赖属性的时候都要多次进行重复的输入,最后生成依赖属性的代码,代码生成效率较低。
针对现有技术在生成具有重复部分的代码时,要针对重复的部分手动依次输入,导致生成代码效率低的问题,目前尚未提出有效的解决方案。
发明内容
本发明的主要目的在于提供一种软件的程序代码的生成方法及装置,以解决现有技术在生成具有重复部分的代码时,需要针对重复的部分手动依次输入,导致生成代码效率低的问题。
为了实现上述目的,根据本发明实施例的一个方面,提供了一种软件的程序代码的生成方法。该方法包括:添加XML文件,其中,XML文件用于标记目标类的属性特征,目标类为实现目标功能的程序代码;获取XML文件中至少一个对象的属性值并通过XML文件中至少一个对象的属性值生成目标代码;将目标代码输出到XML文件中标记的目标类中。
为了实现上述目的,根据本发明实施例的另一方面,提供了一种软件的程序代码的生成装置。该装置包括:添加单元,用于添加XML文件,其中,XML文件用于标记目标类的属性特征,目标类为实现目标功能的程序代码;获取单元,用于获取XML文件中至少一个对象的属性值并通过XML文件中至少一个对象的属性值生成目标代码;输出单元,用于将目标代码输出到XML文件中标记的目标类中。
根据发明实施例,通过添加XML文件,其中,XML文件用于标记目标类的属性特征,目标类为实现目标功能的程序代码;获取XML文件中至少一个对象的属性值并通过XML文件中至少一个对象的属性值生成目标代码;将目标代码输出到XML文件中标记的目标类中,本发明解决了现有技术在生成具有重复部分的代码时,需要要针对重复的部分手动依次输入,导致生成代码效率低的问题。
附图说明
构成本申请的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的一的软件的程序代码的生成方法流程图;
图2是根据本发明实施例二的软件的程序代码的生成装置的结构示意图;
图3是根据本发明实施例二的优选的软件的程序代码的生成装置的结构示意图;以及
图4是根据本发明实施例二的优选的软件的程序代码的生成装置的结构示意图。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
本申请应用术语解释如下:
1.Visual Studio:是微软为开发人员提供的开发工具。
2.Resharper:是Visual Studio的一个插件,主要是提供很多便利的功能,提高开发效率。
3.T4模板:集成在Visual Studio中代码生成工具,主要用于自动生成代码。
4.分部类:就是将类拆分到多个文件中,每个文件是类的一部分,编译时将所有部分组合起来。
5.分部方法:类似于分部类,就是将方法拆分到多个文件中,一个文件中给出方法定义,一个文件中给出方法实现。
6.Attribute(特性):在.NET中定义的类、方法都是有元数据的,以类为例,类的名称、类型、命名空间,访问修饰符(public、private)这些都相当于元数据信息,编译好的程序集包含这些元数据信息。特性也是一种元数据信息,编译后程序集中保存了每个类应用的特性。
7.反射:就是读取程序集的元数据,运行时创建类的实例,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了特性,可以利用反射来访问它们。
8.工程:代码组织方式,可以理解为存放代码容器,可以包含文件夹、代码文件、XML文件、文本文件等。
9.解决方案:同样是一种代码组织方式,比工程范围更广,一个解决方案包含多个工程,还可以包含虚拟文件夹(因为解决方案中的文件夹不是真实存在的,不对应具体真实文件路径,工程中的文件夹是对应真实的文件路径的)。
10.DTE,开发环境,其实就是Visual Studio提供的编程接口,使用这些接口可以针对Visual Studio进行编程,扩展Visual Studio的功能。
实施例1
本发明实施例提供了一种软件的程序代码的生成方法,如图1所示,该方法可以包括:
步骤S101,添加XML文件,其中,XML文件用于标记目标类的属性特征,目标类为实现目标功能的程序代码。
具体的,本实施例可以以生成依赖属性的模板的代码为例进行描述,本实施例提供方法首先添加XML文件,上述XML文件可以包含多个控件定义的依赖属性,上述目标类可以是需要生成依赖属性的类。
步骤S103,获取XML文件中至少一个对象的属性值并通过XML文件中至少一个对象的属性值生成目标代码。
具体的,本实施例提供的方法可以获取上述XML文件中的多个属性值并根据上述多个属性值生成目标代码,上述多个属性值可以是生成依赖属性所需要的:RangeControl、Maximum、Minimum、double等。可选的,上述目标代码可以是依赖属性模板的代码。
步骤S105,将目标代码输出到XML文件中标记的目标类中。
具体的,可选的,在新的程序集中生成依赖属性代码之后,如果要修改依赖属性的话,只需要修改XML中的多个属性值即可,不需要多处修改。
本实施例通过添加XML文件,并获取上述XML文件中的多个属性值,生成目标代码,上述目标代码中包含重复的部分。本实施例解决了现有技术在生成具有重复部分的代码时,需要要针对重复的部分手动依次输入,导致生成代码效率低的问题。
可选的,步骤S101中添加XML文件的步骤可以包括:
步骤S1011,定义XML文件的对象,其中,XML文件包括以下至少一个对象:目标类名称、目标类属性。
具体的,上述XML文件如下面的代码所示:
<?xml version="1.0"encoding="utf-8"?>
<dependencyObjects
xmlns="http://www.scottlogic.co.uk/DependencyObject"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dependencyObject name=”RangeControl”>
<dependencyPropertyname="Maximum"type="double"defaultValue="0.0"/>
<dependencyPropertyname="Minimum"type="double"defaultValue="0.0"/>
</dependencyObject>
</dependencyObjects>
在上述代码中,dependencyObjects为上述XML的文件根节点,dependencyObject是定义依赖属性的控件,RangeControl是控件名称即上述目标类名称,dependencyProperty是控件定义的依赖属性,Maximum为依赖属性的名称即上述目标类属性,type指定依赖属性的类型,defaultValue为依赖属性的默认值,上述属性分别对应目标类中的各个属性。
可选的,步骤S103中获取XML文件中至少一个对象的属性值并通过XML文件中至少一个对象的属性值生成目标代码的步骤还可以包括:
步骤S1031,使用T4模板分别读取目标类名称和目标类属性,获取XML文件中的至少一个对象的属性值。
具体的,本发明实施例可以使用T4模板来将上述XML文件转换成依赖属性的代码文件,可以首先使用T4模板读取上述XML文件中的目标类名称,结合上述XML代码,上述目标类名称可以是dependencyObject,然后读取目标类属性,结合上述XML代码,上述目标类名称可以是dependencyProperty,上述XML文件中的RangeControl、Maximum、Minimum、double等为dependencyProperty的不同属性值。
步骤S1032,将XML文件中的属性值替换目标代码模板中的占位符,生成目标代码,其中,目标代码模板为预先定义的模板。
具体的,上述目标代码模板可以为生成依赖属性的模板,例如下面的代码:
在上述代码中,占位符0、1、2、3可以对应上述XML文件中的多个属性。从上述模板中可以看到第零个占位符为依赖属性的名称,第一个占位符为依赖属性的类型,第二个占位符为依赖属性的拥有者,第三个占位符为依赖属性的默认值。读取到上述XML中多个属性值后,直接将上述四个占位符中替换即可。
可选的,步骤S103中获取XML文件中至少一个对象的属性值并通过XML文件中至少一个对象的属性值生成目标代码的步骤还可以包括:
步骤S1033,使用XSLT来定义匹配模板,上述匹配模板用于匹配XML文件。
具体的,本发明实施例可以使用述XSLT匹配上述XML文件的模板Template,这里需要说明的是,在XSLT中Template,就是模板的意思,主要包含如下两部分的定义:
1.match属性:定义匹配的路径,如果匹配到指定的路径的话,就为这个路径下的内容应用模板
2.输出内容:输出内容中可以引用配置到路径中的XML元素及其属性,还可以为这个路径下的元素继续应用其他模板。
步骤S1034,使用XSLT获取XML文个属性值,并应用到匹配XML文件的模板中,生成目标代码。
具体的,首先,在定义匹配XML根元素的Template之后,可以在上述Template中输出命名空间定义。
然后,定义匹配dependencyObject的Template,在该Template中输出类定义。
最后,定义匹配DependencyProperty的Template,在该Template中访问dependencyProperty元素的各个属性,填充到上述模板即匹配XML文件的模板中,从而输出每个依赖属性的定义。
上述步骤S1033至步骤S1034具体如下:
可选的,步骤S101中添加XML文件之前,本发明实施例提供的方法还可以包括:
步骤S100,定义目标代码模板,其中,目标代码模板中包含至少一个属性:其中,至少一个属性在目标代码模板中使用不同的占位符替换。
可选的,本实施例相对于旧的技术方案,为修改依赖属性提供了便利,说明了如何简化依赖属性的生成和修改,但是该解决方案并不局限于依赖属性,比如下面的例子也可以使用该解决方案解决:
这个例子中CustomerId属性的生成,和依赖属性的生成同属一类问题,即需要输入许多内容,但是这些内容大部分都是重复的,只有一小部分内容是不一样的。这个属性的生成也可以通过Visual Studio和Resharper提供的功能实现,但是问题和依赖属性的问题是一样的,即不支持修改。使用该解决方案,也可以解决类似于这样的属性的生成。
下面本申请结合具体场景进行描述:
1.添加XML文件,该文件描述所有控件定义的依赖属性,如下所示的实例:
<?xml version="1.0"encoding="uff-8"?>
<dependencyObjects
xmlns="http://www.scottlogic.co.uk/DependencyObject"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dependencyObject name="RangeControl">
<dependencyProperty name="Maximum"type="double"defaultValue="0.0"/>
<dependencyProperty name="Minimum"type="double"defaultValue="0.0"/>
</dependencyObject>
</dependencyObjects>
1)dependencyObjects是文件根节点。
2)dependencyObject是定义依赖属性的控件,name是控件名称。
3)dependencyProperty是控件定义的依赖属性,name为依赖属性的名称,Wpe指定依赖属性的类型,defaultValue为依赖属性的默认值。
2.将XML转化为代码文件,有两种方式:T4模板和XSLT。
1)T4模板
i.读取dependencyObject,下面模板中第2个占位符为其name属性值。
ii.读取dependencyProperty,第0个占位符为其name属性值,第1个占位符为其type属性值,第3个占位符为其defaultValue属性值。
Iii.使用上面解析的内容填充下面的依赖属性模板,上述依赖属性的模板如下:
2)使用XSLT
i.定义匹配根元素的Template,在该Template中输出命名空间定义,并为根元素下dependencyObjects节下dependencyObject节应用第二步定义的Template
ii.定义匹配dependencyObject的Template,在该Template中输出类定义,并为dependencyProperty节应用第三步定义Template
iii.定义匹配DependencyProperty的Template,在该Template中访问dependencyProperty元素的各个属性,填充到模板中,从而输出每个依赖属性的定义
这里需要说明的是,在XSLT中Template,就是模板的意思,主要包含两部分的定义。
第一,match属性:定义匹配的路径,如果匹配到指定的路径的话,就为这个路径下的内容应用模板
第二,输出内容:输出内容中可以引用配置到路径中的XML元素及其属性,还可以为这个路径下的元素继续应用其他模板
下面是使用上述XSLT将上述XML文件转化成代码的完整过程:
实施例2
本发明实施例还提供了一种软件的程序代码的生成装置。如图2所示,该装置可以包括:
添加单元200,用于添加XML文件,其中,XML文件用于标记目标类的属性特征,目标类为实现目标功能的程序代码。
具体的,本实施例可以以生成依赖属性的模板的代码为例进行描述,本实施例提供方法可以首先添加XML文件,上述XML文件可以包含多个控件定义的依赖属性,上述目标类可以是需要生成依赖属性的类。
获取单元202,用于获取XML文件中至少一个对象的属性值并通过XML文件中至少一个对象的属性值生成目标代码。
具体的,本实施例提供的方法可以获取上述XML文件中的多个属性值并根据上述多个属性值生成目标代码,上述多个属性值可以是生成依赖属性所需要的:RangeControl、Maximum、Minimum、double等。可选的,上述目标代码可以是依赖属性模板的代码。
输出单元204,用于将目标代码输出到XML文件中标记的目标类中。
具体的,可选的,在新的程序集中生成依赖属性代码之后,如果要修改依赖属性的话,只需要修改XML中的的多个属性值即可,不需要多处修改。
本实施例通过添加XML文件,并获取上述XML文件中的多个属性值,生成目标代码,上述目标代码中包含重复的部分。本实施例解决了现有技术要生成具有重复部分的代码要针对重复的部分手动依次输入,生成代码效率低的问题。
可选的,如图3所示,上述添加单元200可以包括:
第一定义模块2002,用于定义XML文件的对象,其中,XML文件包括以下至少一个对象:目标类名称、目标类属性。
具体的,上述XML文件如下面的代码所示:
<?xml version="1.0"encoding="utf-8"?>
<dependencyObjects
xmlns="http://www.scottlogic.co.uk/DependencyObject"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dependencyObject name=”RangeControl”>
<dependencyPropertyname="Maximum"type="double"defaultValue="0.0"/>
<dependencyPropertyname="Minimum"type="double"defaultValue="0.0"/>
</dependencyObject>
</dependencyObjects>
在上述代码中,dependencyObjects为上述XML的文件根节点,dependencyObject是定义依赖属性的控件,RangeControl是控件名称即上述目标类名称,dependencyProperty是控件定义的依赖属性,Maximum为依赖属性的名称即上述目标类属性,type指定依赖属性的类型,defaultValue为依赖属性的默认值,上述属性分别对应目标类中的各个属性。
可选的,如图4所示,上述获取202单元可以包括:
读取模块2022,用于使用T4模板分别读取目标类名称和目标类属性,获取XML文件中的至少一个对象的属性值。
具体的,本发明实施例可以使用T4模板来将上述XML文件转换成依赖属性的代码文件,可以首先使用T4模板读取上述XML文件中的目标类名称,结合上述XML代码,上述目标类名称可以是dependencyObject,然后读取目标类属性,结合上述XML代码,上述目标类名称可以是dependencyProperty,上述XML文件中的RangeControl、Maximum、Minimum、double等为dependencyProperty的不同属性值。
替换模块2024,用于将XML文件中的属性值替换目标代码模板中的占位符,生成目标代码,其中,目标代码模板为预先定义的模板。
具体的,上述目标代码模板可以为依赖属性的模板,例如下面的代码:
在上述代码中,占位符0、1、2、3可以对应上述XML文件中的多个属性。从上述模板中可以看到第零个占位符为依赖属性的名称,第一个占位符为依赖属性的类型,第二个占位符为依赖属性的拥有者,第三个占位符为依赖属性的默认值。读取到上述XML中多个属性值后,直接将上述四个占位符中替换即可。
可选的,上述获取单元202还可以包括:
第二定义模块2026,使用XSLT来定义匹配模板,上述匹配模板用于匹配XML文件。
具体的,本发明实施例可以使用述XSLT匹配上述XML文件的模板Template,这里需要说明的是,在XSLT中Template,就是模板的意思,主要包含如下两部分的定义:
1.match属性:定义匹配的路径,如果匹配到指定的路径的话,就为这个路径下的内容应用模板。
2.输出内容:输出内容中可以引用配置到路径中的XML元素及其属性,还可以为这个路径下的元素继续应用其他模板。
生成模块2028,用于使用XSLT获取XML文件中至少一个属性值,并应用到XML文件的模板中,生成目标代码。
具体的,首先,在定义匹配XML根元素的Template之后,可以在上述Template中输出命名空间定义,并为上述XML文件中dependencyobjecs下面的dependencyobject应用T应用第二步定义的Template。
然后,定义匹配dependencyObject的Template,在该Template中输出类定义。
最后,定义匹配DependencyProperty的Template,在该Template中访问dependencyProperty元素的各个属性,填充到上述模板即匹配XML文件的模板中,从而输出每个依赖属性的定义。
上述步骤S1033至步骤S1034具体如下:
可选的,本发明实施例提供的装置还可以包括:
定义单元206,用于定义目标代码模板,其中,目标代码模板中包含至少一个属性:其中,至少一个属性在目标代码模板中使用不同的占位符替换。
可选的,本实施例相对于旧的技术方案,为修改依赖属性提供了便利,说明了如何简化依赖属性的生成和修改,但是该解决方案并不局限于依赖属性,比如下面的例子也可以使用该解决方案解决:
这个例子中CustomerId属性的生成,和依赖属性的生成同属一类问题,即需要输入许多内容,但是这些内容大部分都是重复的,只有一小部分内容是不一样的。这个属性的生成也可以通过Visual Studio和Resharper提供的功能实现,但是问题和依赖属性的问题是一样的,即不支持修改。使用该解决方案,也可以解决类似于这样的属性的生成。
下面本申请结合具体场景进行描述:
1.添加XML文件,该文件描述所有控件定义的依赖属性,如下所示的实例:
<?xml version=″1.0″encoding=″utf-8″?>
<dependencyObjects
xmlns="http://www.scottlogic.co.uk/DependencyObject″
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dependencyObject name=”RangeControl">
<dependencyProperty name="Maximum″type="double″defaultValue=″0.0″/>
<dependencyProperty name="Minimum″type="double″defaultValue=″0.0″/>
</dependencyObject>
</dependencyObjects>
1)dependencyObjects是文件根节点。
2)dependencyObject是定义依赖属性的控件,name是控件名称。
3)dependencyProperty是控件定义的依赖属性,name为依赖属性的名称,type指定依赖属性的类型,defaultValue为依赖属性的默认值。
2.将XML转化为代码文件,有两种方式:T4模板和XSLT。
1)T4模板
i.读取dependencyObject,下面模板中第2个占位符为其name属性值。
ii.读取dependencyProperty,第0个占位符为其name属性值,第1个占位符为其type属性值,第3个占位符为其defaultValue属性值。
Iii.使用上面解析的内容填充下面的依赖属性模板,上述依赖属性的模板如下:
2)使用XSLT
i.定义匹配根元素的Template,在该Template中输出命名空间定义,并为根元素下dependencyObjects节下dependencyObject节应用第二步定义的Template
ii.定义匹配dependencyObject的Template,在该Template中输出类定义,并为dependencyProperty节应用第三步定义Template
iii.定义匹配DependencyProperty的Template,在该Template中访问dependencyProperty元素的各个属性,填充到模板中,从而输出每个依赖属性的定义
这里需要说明的是,在XSLT中Template,就是模板的意思,主要包含两部分的定义。
第一,match属性:定义匹配的路径,如果匹配到指定的路径的话,就为这个路径下的内容应用模板
第二,输出内容:输出内容中可以引用配置到路径中的XML元素及其属性,还可以为这个路径下的元素继续应用其他模板
下面是使用上述XSLT将上述XML文件转化成代码的完整过程:
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置,可通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、移动终端、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read‐Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。