CN113778388A - 程序开发方法和装置 - Google Patents

程序开发方法和装置 Download PDF

Info

Publication number
CN113778388A
CN113778388A CN202010603603.6A CN202010603603A CN113778388A CN 113778388 A CN113778388 A CN 113778388A CN 202010603603 A CN202010603603 A CN 202010603603A CN 113778388 A CN113778388 A CN 113778388A
Authority
CN
China
Prior art keywords
class
annotation
strategy
policy
classes
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
Application number
CN202010603603.6A
Other languages
English (en)
Inventor
宋振亮
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Jingdong Tuoxian Technology Co Ltd
Original Assignee
Beijing Jingdong Tuoxian Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Jingdong Tuoxian Technology Co Ltd filed Critical Beijing Jingdong Tuoxian Technology Co Ltd
Priority to CN202010603603.6A priority Critical patent/CN113778388A/zh
Publication of CN113778388A publication Critical patent/CN113778388A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种程序开发方法和装置,涉及计算机技术领域。该方法的一具体实施方式包括:在应用程序源代码中,利用自定义注解标注实现同一功能接口的多个策略类;每一自定义注解包括注解名称和枚举值;在应用程序启动时,实例化多个策略类;通过注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系加载到内存;在接收到客户端请求时,利用请求携带的参数确定枚举值,依据内存中的映射关系获取该枚举值对应的策略类实例,执行该策略类实例中的方法。该实施方式能够在系统功能扩展时避免对原有模块代码造成污染。

Description

程序开发方法和装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种程序开发方法和装置。
背景技术
在计算机程序开发过程中,经常遇到对系统原有模块进行变更、扩展,或者在原有模块上挂载新模块的场景,常规的解决办法是直接在原有模块上增加if(如果)判断,堆积新的业务代码,或者利用工厂、代理、模板等设计模式或开源框架来编码。
在实现本发明的过程中,发明人发现现有技术至少存在以下问题:直接在原有模块上增加if判断的方法违背了程序开发中的开闭原则,即对调用开放、对修改关闭,会增加代码后续的读取和维护成本,同时也会对原有业务代码造成污染,极容易在原有业务上引入新的bug(漏洞),导致测试人员必须对原有业务回归测试,从而影响整个业务的排期,造成人力和财力成本的浪费。基于工厂等设计模式的方法只是将硬编码问题提出来放到工厂类中,并没有解决根本问题,当现有业务扩展或变更时,需要在工厂类中增加状态字段和if判断的代码块,代码依然无法达到“高内聚、低耦合”的目标。
发明内容
有鉴于此,本发明实施例提供一种程序开发方法和装置,能够在系统功能扩展时避免对原有模块代码造成污染。
为实现上述目的,根据本发明的一个方面,提供了一种程序开发方法。
本发明实施例的程序开发方法包括:在应用程序源代码中,利用自定义注解标注预先创建、并且实现同一功能接口的多个策略类;其中,每一自定义注解包括注解名称和作为注解类型元素数据的预设枚举值,标注在任意两个策略类的自定义注解具有同一注解名称和不同的枚举值;在所述应用程序启动时,实例化所述多个策略类;通过所述注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系加载到内存;在接收到调用所述功能接口的客户端请求时,利用客户端请求携带的参数确定客户端请求对应的枚举值,依据内存中的所述映射关系获取该枚举值对应的策略类实例,执行该策略类实例中的预设方法。
可选地,所述程序开发方法进一步包括:在利用所述自定义注解标注所述策略类之前,创建枚举类,并在该枚举类中定义每一自定义注解中的枚举值。
可选地,所述将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系加载到内存,包括:将所述映射关系存储到预先创建的map集合。
可选地,每一策略类用于实现所述功能接口下的一种业务类型;以及,所述程序开发方法进一步包括:当需要扩展所述功能接口下的一种新业务类型时:在应用程序源代码中创建新业务类型对应的、并且实现所述功能接口的新策略类,在所述枚举类中增加新枚举值;利用含有新枚举值的自定义注解标注新策略类;其中,该自定义注解与实现所述功能接口的其它策略类的自定义注解具有相同的注解名称;在所述应用程序启动时,实例化实现所述功能接口的每一策略类;通过所述注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系存储到预先创建的map集合。
可选地,所述多个策略类实现所述功能接口,包括:所述多个策略类直接实现所述功能接口;或者,所述多个策略类通过预先创建的抽象类实现所述功能接口;其中,所述抽象类直接实现所述功能接口,所述多个策略类继承所述抽象类。
可选地,所述程序开发方法进一步包括:当需要在所述多个策略类中的第一策略类实现第一方法、并且不需要在所述多个策略类中的其它策略类实现第一方法时,在所述抽象类定义第一方法或者第一方法对应的抽象方法。
为实现上述目的,根据本发明的另一方面,提供了一种程序开发装置。
本发明实施例的程序开发装置可以包括:标注单元,用于:在应用程序源代码中,利用自定义注解标注预先创建、并且实现同一功能接口的多个策略类;其中,每一自定义注解包括注解名称和作为注解类型元素数据的预设枚举值,标注在任意两个策略类的自定义注解具有同一注解名称和不同的枚举值;映射加载单元,用于:在所述应用程序启动时,实例化所述多个策略类;通过所述注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系加载到内存;请求处理单元,用于:在接收到调用所述功能接口的客户端请求时,利用客户端请求携带的参数确定客户端请求对应的枚举值,依据内存中的所述映射关系获取该枚举值对应的策略类实例,执行该策略类实例中的预设方法。
可选地,每一自定义注解中的枚举值在预先创建的枚举类中定义,每一策略类用于实现所述功能接口下的一种业务类型;所述程序开发装置可进一步包括业务扩展单元,其用于:当需要扩展所述功能接口下的一种新业务类型时:在应用程序源代码中创建新业务类型对应的、并且实现所述功能接口的新策略类,在所述枚举类中增加新枚举值;利用含有新枚举值的自定义注解标注新策略类;其中,该自定义注解与实现所述功能接口的其它策略类的自定义注解具有相同的注解名称;在所述应用程序启动时,实例化实现所述功能接口的每一策略类;通过所述注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系存储到预先创建的map集合。
为实现上述目的,根据本发明的又一方面,提供了一种电子设备。
本发明的一种电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明所提供的程序开发方法。
为实现上述目的,根据本发明的再一方面,提供了一种计算机可读存储介质。
本发明的一种计算机可读存储介质,其上存储有计算机程序,所述程序被处理器执行时实现本发明所提供的程序开发方法。
根据本发明的技术方案,上述发明中的实施例具有如下优点或有益效果:在应用程序源代码中,使用自定义注解标注实现同一功能接口的多个策略类,每一策略类的自定义注解中具有唯一的、由枚举类定义的枚举值;当应用程序启动时,通过扫描自定义注解的注解名称即可获取每一策略类实例,此时可将策略类实例与相应的枚举值之间的映射关系存储在map集合。这样,当客户端请求调用功能接口时,即可根据请求参数确定相应的枚举值,进而确定相应的策略类实例以执行策略类实例中的方法。上述程序开发方法严格遵循开闭原则,各模块代码具有高内聚、低耦合的优点,当需要新增功能模块或业务类型时,只需要创建实现功能接口的新策略类,在枚举类中增加新枚举值,并使用含有新枚举值的自定义注解标注新策略类即可,原有策略类代码不需要进行改动,由此避免了硬编码问题和原有代码污染问题,增强了代码的健壮性、可维护性和可扩展性,也克服了因编码人员在对原有业务理解不透彻的情况下改动原有代码而造成的原有功能受到影响的缺陷,还能够解决因相关文档不明晰等原因造成的工作交接时需花费大量精力梳理旧业务的问题。
上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。
附图说明
附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
图1是本发明实施例中程序开发方法的主要步骤示意图;
图2是本发明实施例中程序开发方法的具体实现示意图;
图3是本发明实施例中程序开发装置的组成部分示意图;
图4是根据本发明实施例可以应用于其中的示例性系统架构图;
图5是用来实现本发明实施例中程序开发方法的电子设备结构示意图。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
需要指出的是,在不冲突的情况下,本发明的实施例以及实施例中的技术特征可以相互结合。
图1是根据本发明实施例中程序开发方法的主要步骤示意图。
如图1所示,本发明实施例的程序开发方法可具体按照如下步骤执行:
步骤S101:在应用程序源代码中,利用自定义注解标注预先创建、并且实现同一功能接口的多个策略类。
在JAVA等编程语言中,注解(annotation)是一种应用于类、方法、参数、变量、构造器或包声明中的特殊修饰符,是用来描述元数据的一种工具。自定义注解为系统内置注解之外的、由开发人员利用元注解自行编写的注解。具体应用中,系统提供以下四种元注解:
@Documented–用于确定定义的注解是否将包含在JAVA文档中;
@Retention–用于确定什么时候使用定义的注解;
@Target–用于确定注解用于什么地方;
@Inherited–用于确定是否允许子类继承定义的注解。
需要说明的是,上述注解完全不同于注释。一般地,注释用于告知开发人员代码的逻辑、说明、特点等,可以无限制的随意编写;编译时,注释会被编译器完全忽略。注解是通过标注类、方法、参数、变量、构造器或包等元素,告知JAVA虚拟机这些元素的元数据,其一般以“@”起始,对于位置、语法、内容都有严格的限制,如果有任何错误,编译过程中就会显示异常。
以下将以JAVA中的示例展示自定义注解的定义方式:
Figure BDA0002560052980000061
其中,第一行代码表示定义的注解可用于描述类、接口或声明;第二行代码表示定义的注解始终不会丢弃,运行时也会保留;第三行代码使用关键字@interface定义注解类LoadProcessor,LoadProcessor即为自定义注解的注解名称;第四行代码设置注解类型元素(annotation type element),在上例中,注解类型元素只有value,其类型为枚举(DictEnum)。自定义注解定义完成之后,可在应用程序源代码中利用自定义注解标注目标类。
一般地,可以在目标类定义上方书写@LoadProcessor(……)实现标注,可以看到,标注在目标类上方的自定义注解包括注解名称LoadProcessor和(……),括号中的数据即为注解类型元素及其对应的值。在本发明实施例中,将上述括号中注解类型元素对应的值(例如value元素对应的值。在只有value一个元素时,value本身可以省略)称为注解类型元素数据。在本发明实施例中,可以在使用不同的常量作为注解类型元素数据来修饰不同的策略类(策略类的概念将在下文说明),这些常量可以是预先创建的枚举类的枚举值。具体应用中,可以是用enum关键字来创建枚举类。
在本发明实施例中,可以按照不同的业务类型创建同一功能接口下的多个策略类,每一策略类用于实现一种业务类型。这些策略类需要实现上述功能接口,上述功能接口作为这些策略类的封装,可以将业务调用者与策略类隔离,使策略类对业务调用者不透明。在一些实施例中,策略类可以使用implements关键字直接实现上述功能接口。在步骤S101中,可以利用上述自定义注解标注实现上述功能接口的策略类,每一自定义注解包括注解名称和作为注解类型元素数据的枚举值,每一自定义注解都具有同一注解名称用于体现这些策略类实现了同一功能接口、都具有不同的作为注解类型元素数据的枚举值来彼此区分。也就是说,标注在任意两个策略类的自定义注解具有同一注解名称和不同的枚举值。
例如,可以使用以下代码定义一个策略类、使该策略类实现功能接口并使用自定义注解对该策略类进行标注:
@LoadProcessor("first")
public class StrategyFirstImpl implements StrategyExcuteInterface
其中,LoadProcessor为自定义注解的注解名称,括号中的first为枚举类中定义的一个枚举值,public是公有修饰符,class是类关键字,StrategyFirstImpl为该策略类名称,StrategyExcuteInterface为预先创建的功能接口的名称。
较佳地,可以使用与策略类相同或相近的字符串作为其自定义注解中的枚举值,例如,在上例中,可以使用与策略类名称StrategyFirstI mpl相近的字符串Strategy_First_Impl作为枚举值,这样能够直接从枚举值中确定策略类名称。
步骤S102:在应用程序启动时,实例化多个策略类;通过注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系加载到内存。
实际应用中,当已执行步骤S101的应用程序启动时,服务端首先对基础的组件化功能进行实例化,包括实例化上述多个策略类。此后,服务端检测自定义注解中的注解名称从而获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系加载到内存,以供后续使用。例如,可以将上述映射关系存储在预先创建的map集合(map是JAVA中用于盛装数据的容器类),以枚举值为key(键),以相应的策略类实例为value(值)。
在使用Spring(一种为了解决企业应用程序开发复杂性而创建的Ja va开源框架)进行程序开发时,可以创建实现InitializingBean接口的工厂类,InitializingBean接口为Bean(Spring中构成应用程序主干并由Spr ing IoC容器管理的对象,IoC表示控制反转)提供了属性初始化后的处理方法,其包括afterPropertiesSet方法,凡是继承InitializingBean接口的类,在Bean的属性初始化后都会执行上述方法。在上述方法的方法体中可以编写根据注解名称获取策略类实例、将策略类实例与枚举值的映射关系存储在map集合的相应代码。这样,在Spring启动之后,即可自动执行自定义注解的扫描以及策略类与枚举值映射关系的装配。
步骤S103:在接收到调用功能接口的客户端请求时,利用客户端请求携带的参数确定客户端请求对应的枚举值,依据内存中的映射关系获取该枚举值对应的策略类实例,执行该策略类实例中的预设方法。
经过步骤S102,枚举值与策略类实例的映射关系已经存储在map集合中。此后,当客户端向服务端发起调用上述功能接口的请求时,服务端接收客户端请求,并根据客户端请求中携带的各种参数来确定其对应的枚举值。可以理解,客户端请求发出之前,需要根据功能接口的要求携带所需参数。上述客户端指的是向上述服务端调用服务或接口的业务调用端,其可以包括用户终端或其它任何服务端。功能接口所在的服务端获得客户端请求对应的枚举值之后,即可依据map集合中的映射关系获取该枚举值对应的策略类实例,并基于JAVA反射机制执行该策略类实例中的所需方法,从而实现相应的业务功能。获得相应数据之后,服务端可以将该数据向客户端返回,作为调用功能接口的响应。
这样,即可实现扩展性、可维护性较强的程序开发过程,解决了现有技术中硬编码方式以及各种设计模式的多种缺陷。具体场景中,如果需要扩展上述功能接口下的一种新业务类型,只需在应用程序源代码中创建新业务类型对应的、并且实现上述功能接口的新策略类,在上述枚举类中增加新枚举值,并利用含有新枚举值的自定义注解标注新策略类。显然,该自定义注解与实现所述功能接口的其它策略类的自定义注解具有相同的注解名称。这样,在应用程序启动时,服务端实例化实现上述功能接口的每一策略类;通过上述注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系存储到map集合。当服务端接收到调用功能接口的客户端请求时,可以利用客户端请求携带的参数确定客户端请求对应的枚举值,如果该枚举值为上述新枚举值,服务端即可依据内存中的映射关系获取新枚举值对应的新策略类的实例,最后执行新策略类实例中的相应方法,从而使上述功能接口具有新业务类型的相应功能。
具体应用中,前述多个策略类一般直接实现功能接口,这种实现方式存在以下不足:如果某一策略类需要实现一个特定方法而其它策略类不需要,则功能接口应具有该特定方法的抽象方法,但是由于接口的实现类需要全部实现接口方法,这样一来就需要轻微改动其它策略类从而在其中的每一策略类实现特定方法,这就造成了一定的代码污染。在本发明实施例中,可以通过以下方式克服上述不足:在应用程序源代码中,使多个策略类继承一个预先创建的抽象类,并使该抽象类实现上述功能接口,这样即可使多个策略类间接实现了上述功能接口。当需要在多个策略类中的第一策略类实现第一方法时(其它策略类不需要实现第一方法,第一方法即上述特定方法),由于抽象类的子类可以部分实现抽象类的方法,因此只需要在抽象类定义第一方法或者第一方法对应的抽象方法,并由第一策略类具体实现即可,不需要功能接口和其它策略类进行任何改动。
图2是本发明实施例中程序开发方法的具体实现示意图,如图2所示,本发明实施例的程序开发方法可以分为两个阶段,其一为:“策略类与枚举值建立映射”,在该阶段,多个策略类实现功能接口,并通过自定义注解与枚举类中定义的枚举值建立映射关系。应用程序启动时,可以通过检测自定义注解获取策略类实例,并将策略类实例与枚举值的映射关系存储在map集合。第二个阶段为“动态切换策略实例”,在该阶段,服务端可以根据客户端请求携带的参数确定枚举值,进而根据枚举值确定适配的策略类实例,最后执行策略类实例中的方法,从而结束业务调用。
根据本发明实施例的技术方案,在应用程序源代码中,使用自定义注解标注实现同一功能接口的多个策略类,每一策略类的自定义注解中具有唯一的、由枚举类定义的枚举值;当应用程序启动时,通过扫描自定义注解的注解名称即可获取每一策略类实例,此时可将策略类实例与相应的枚举值之间的映射关系存储在map集合。这样,当客户端请求调用功能接口时,即可根据请求参数确定相应的枚举值,进而确定相应的策略类实例以执行策略类实例中的方法。上述程序开发方法严格遵循开闭原则,各模块代码具有高内聚、低耦合的优点,当需要新增功能模块或业务类型时,只需要创建实现功能接口的新策略类,在枚举类中增加新枚举值,并使用含有新枚举值的自定义注解标注新策略类即可,原有策略类代码不需要进行改动,由此避免了硬编码问题和原有代码污染问题,增强了代码的健壮性、可维护性和可扩展性,也克服了因编码人员在对原有业务理解不透彻的情况下改动原有代码而造成的原有功能受到影响的缺陷,还能够解决因相关文档不明晰等原因造成的工作交接时需花费大量精力梳理旧业务的问题。
需要说明的是,对于前述的各方法实施例,为了便于描述,将其表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,某些步骤事实上可以采用其它顺序进行或者同时进行。此外,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是实现本发明所必须的。
为便于更好的实施本发明实施例的上述方案,下面还提供用于实施上述方案的相关装置。
请参阅图3所示,本发明实施例提供的程序开发装置300可以包括:标注单元301、映射加载单元302和请求处理单元303。
其中,标注单元,301可用于:在应用程序源代码中,利用自定义注解标注预先创建、并且实现同一功能接口的多个策略类;其中,每一自定义注解包括注解名称和作为注解类型元素数据的预设枚举值,标注在任意两个策略类的自定义注解具有同一注解名称和不同的枚举值;映射加载单元302可用于:在所述应用程序启动时,实例化所述多个策略类;通过所述注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系加载到内存;请求处理单元303可用于:在接收到调用所述功能接口的客户端请求时,利用客户端请求携带的参数确定客户端请求对应的枚举值,依据内存中的所述映射关系获取该枚举值对应的策略类实例,执行该策略类实例中的预设方法。
在本发明实施例中,每一自定义注解中的枚举值在预先创建的枚举类中定义,每一策略类用于实现所述功能接口下的一种业务类型;所述程序开发装置300可进一步包括业务扩展单元,其用于:当需要扩展所述功能接口下的一种新业务类型时:在应用程序源代码中创建新业务类型对应的、并且实现所述功能接口的新策略类,在所述枚举类中增加新枚举值;利用含有新枚举值的自定义注解标注新策略类;其中,该自定义注解与实现所述功能接口的其它策略类的自定义注解具有相同的注解名称;在所述应用程序启动时,实例化实现所述功能接口的每一策略类;通过所述注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系存储到预先创建的map集合。
具体应用中,所述程序开发装置300可进一步包括枚举创建单元,其用于:在利用所述自定义注解标注所述策略类之前,创建枚举类,并在该枚举类中定义每一自定义注解中的枚举值。
实际应用中,映射加载单元302可进一步用于:将所述映射关系存储到预先创建的map集合。
作为一个优选方案,所述多个策略类实现所述功能接口可以包括:所述多个策略类直接实现所述功能接口;或者,所述多个策略类通过预先创建的抽象类实现所述功能接口;其中,所述抽象类直接实现所述功能接口,所述多个策略类继承所述抽象类。
此外,在本发明实施例中,所述程序开发装置300可进一步包括方法定义单元,其用于:当需要在所述多个策略类中的第一策略类实现第一方法、并且不需要在所述多个策略类中的其它策略类实现第一方法时,在所述抽象类定义第一方法或者第一方法对应的抽象方法。
根据本发明实施例的技术方案,在应用程序源代码中,使用自定义注解标注实现同一功能接口的多个策略类,每一策略类的自定义注解中具有唯一的、由枚举类定义的枚举值;当应用程序启动时,通过扫描自定义注解的注解名称即可获取每一策略类实例,此时可将策略类实例与相应的枚举值之间的映射关系存储在map集合。这样,当客户端请求调用功能接口时,即可根据请求参数确定相应的枚举值,进而确定相应的策略类实例以执行策略类实例中的方法。上述程序开发方法严格遵循开闭原则,各模块代码具有高内聚、低耦合的优点,当需要新增功能模块或业务类型时,只需要创建实现功能接口的新策略类,在枚举类中增加新枚举值,并使用含有新枚举值的自定义注解标注新策略类即可,原有策略类代码不需要进行改动,由此避免了硬编码问题和原有代码污染问题,增强了代码的健壮性、可维护性和可扩展性,也克服了因编码人员在对原有业务理解不透彻的情况下改动原有代码而造成的原有功能受到影响的缺陷,还能够解决因相关文档不明晰等原因造成的工作交接时需花费大量精力梳理旧业务的问题。
图4示出了可以应用本发明实施例的程序开发方法或程序开发装置的示例性系统架构400。
如图4所示,系统架构400可以包括终端设备401、402、403,网络404和服务器405(此架构仅仅是示例,具体架构中包含的组件可以根据申请具体情况调整)。网络404用以在终端设备401、402、403和服务器405之间提供通信链路的介质。网络404可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等。
用户可以使用终端设备401、402、403通过网络404与服务器405交互,以接收或发送消息等。终端设备401、402、403上可以安装有各种客户端应用。
终端设备401、402、403可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
服务器405可以是提供各种服务的服务器,例如对用户利用终端设备401、402、403所操作的客户端应用提供支持的服务方服务器(仅为示例)。服务方服务器可以对接收到的客户端请求进行处理,并将处理结果反馈给终端设备401、402、403。
需要说明的是,本发明实施例所提供的程序开发方法一般由服务器405执行,相应地,程序开发装置一般设置于服务器405中。
应该理解,图4中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
本发明还提供了一种电子设备。本发明实施例的电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明所提供的程序开发方法。
下面参考图5,其示出了适于用来实现本发明实施例的电子设备的计算机系统500的结构示意图。图5示出的电子设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图5所示,计算机系统500包括中央处理单元(CPU)501,其可以根据存储在只读存储器(ROM)502中的程序或者从存储部分508加载到随机访问存储器(RAM)503中的程序而执行各种适当的动作和处理。在RAM503中,还存储有计算机系统500操作所需的各种程序和数据。CPU501、ROM 502以及RAM 503通过总线504彼此相连。输入/输出(I/O)接口505也连接至总线504。
以下部件连接至I/O接口505:包括键盘、鼠标等的输入部分506;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分507;包括硬盘等的存储部分508;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分509。通信部分509经由诸如因特网的网络执行通信处理。驱动器510也根据需要连接至I/O接口505。可拆卸介质511,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器510上,以便从其上读出的计算机程序根据需要被安装入存储部分508。
特别地,根据本发明公开的实施例,上文的主要步骤图描述的过程可以被实现为计算机软件程序。例如,本发明实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行主要步骤图所示的方法的程序代码。在上述实施例中,该计算机程序可以通过通信部分509从网络上被下载和安装,和/或从可拆卸介质511被安装。在该计算机程序被中央处理单元501执行时,执行本发明的系统中限定的上述功能。
需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。在本发明中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这根据所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本发明实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元也可以设置在处理器中,例如,可以描述为:一种处理器包括标注单元、映射加载单元和请求处理单元。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定,例如,标注单元还可以被描述为“向映射加载单元提供自定义注解的注解名称的单元”。
作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中的。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该设备执行时,使得该设备执行的步骤包括:在应用程序源代码中,利用自定义注解标注预先创建、并且实现同一功能接口的多个策略类;其中,每一自定义注解包括注解名称和作为注解类型元素数据的预设枚举值,标注在任意两个策略类的自定义注解具有同一注解名称和不同的枚举值;在所述应用程序启动时,实例化所述多个策略类;通过所述注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系加载到内存;在接收到调用所述功能接口的客户端请求时,利用客户端请求携带的参数确定客户端请求对应的枚举值,依据内存中的所述映射关系获取该枚举值对应的策略类实例,执行该策略类实例中的预设方法。
根据本发明实施例的技术方案,在应用程序源代码中,使用自定义注解标注实现同一功能接口的多个策略类,每一策略类的自定义注解中具有唯一的、由枚举类定义的枚举值;当应用程序启动时,通过扫描自定义注解的注解名称即可获取每一策略类实例,此时可将策略类实例与相应的枚举值之间的映射关系存储在map集合。这样,当客户端请求调用功能接口时,即可根据请求参数确定相应的枚举值,进而确定相应的策略类实例以执行策略类实例中的方法。上述程序开发方法严格遵循开闭原则,各模块代码具有高内聚、低耦合的优点,当需要新增功能模块或业务类型时,只需要创建实现功能接口的新策略类,在枚举类中增加新枚举值,并使用含有新枚举值的自定义注解标注新策略类即可,原有策略类代码不需要进行改动,由此避免了硬编码问题和原有代码污染问题,增强了代码的健壮性、可维护性和可扩展性,也克服了因编码人员在对原有业务理解不透彻的情况下改动原有代码而造成的原有功能受到影响的缺陷,还能够解决因相关文档不明晰等原因造成的工作交接时需花费大量精力梳理旧业务的问题。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。

Claims (10)

1.一种程序开发方法,其特征在于,包括:
在应用程序源代码中,利用自定义注解标注预先创建、并且实现同一功能接口的多个策略类;其中,每一自定义注解包括注解名称和作为注解类型元素数据的预设枚举值,标注在任意两个策略类的自定义注解具有同一注解名称和不同的枚举值;
在所述应用程序启动时,实例化所述多个策略类;通过所述注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系加载到内存;以及
在接收到调用所述功能接口的客户端请求时,利用客户端请求携带的参数确定客户端请求对应的枚举值,依据内存中的所述映射关系获取该枚举值对应的策略类实例,执行该策略类实例中的预设方法。
2.根据权利要求1所述的程序开发方法,其特征在于,所述程序开发方法进一步包括:
在利用所述自定义注解标注所述策略类之前,创建枚举类,并在该枚举类中定义每一自定义注解中的枚举值。
3.根据权利要求1所述的程序开发方法,其特征在于,所述将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系加载到内存,包括:
将所述映射关系存储到预先创建的map集合。
4.根据权利要求2所述的程序开发方法,其特征在于,每一策略类用于实现所述功能接口下的一种业务类型;以及,所述程序开发方法进一步包括:当需要扩展所述功能接口下的一种新业务类型时:
在应用程序源代码中创建新业务类型对应的、并且实现所述功能接口的新策略类,在所述枚举类中增加新枚举值;
利用含有新枚举值的自定义注解标注新策略类;其中,该自定义注解与实现所述功能接口的其它策略类的自定义注解具有相同的注解名称;以及
在所述应用程序启动时,实例化实现所述功能接口的每一策略类;通过所述注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系存储到预先创建的map集合。
5.根据权利要求1所述的程序开发方法,其特征在于,所述多个策略类实现所述功能接口,包括:
所述多个策略类直接实现所述功能接口;或者
所述多个策略类通过预先创建的抽象类实现所述功能接口;其中,所述抽象类直接实现所述功能接口,所述多个策略类继承所述抽象类。
6.根据权利要求5所述的程序开发方法,其特征在于,所述程序开发方法进一步包括:
当需要在所述多个策略类中的第一策略类实现第一方法、并且不需要在所述多个策略类中的其它策略类实现第一方法时,在所述抽象类定义第一方法或者第一方法对应的抽象方法。
7.一种程序开发装置,其特征在于,包括:
标注单元,用于:在应用程序源代码中,利用自定义注解标注预先创建、并且实现同一功能接口的多个策略类;其中,每一自定义注解包括注解名称和作为注解类型元素数据的预设枚举值,标注在任意两个策略类的自定义注解具有同一注解名称和不同的枚举值;
映射加载单元,用于:在所述应用程序启动时,实例化所述多个策略类;通过所述注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系加载到内存;以及
请求处理单元,用于:在接收到调用所述功能接口的客户端请求时,利用客户端请求携带的参数确定客户端请求对应的枚举值,依据内存中的所述映射关系获取该枚举值对应的策略类实例,执行该策略类实例中的预设方法。
8.根据权利要求7所述的程序开发装置,其特征在于,每一自定义注解中的枚举值在预先创建的枚举类中定义,每一策略类用于实现所述功能接口下的一种业务类型;以及,所述程序开发装置进一步包括业务扩展单元,其用于:当需要扩展所述功能接口下的一种新业务类型时:
在应用程序源代码中创建新业务类型对应的、并且实现所述功能接口的新策略类,在所述枚举类中增加新枚举值;
利用含有新枚举值的自定义注解标注新策略类;其中,该自定义注解与实现所述功能接口的其它策略类的自定义注解具有相同的注解名称;以及
在所述应用程序启动时,实例化实现所述功能接口的每一策略类;通过所述注解名称获取每一策略类实例,并将每一策略类实例与标注该策略类的自定义注解中的枚举值之间的映射关系存储到预先创建的map集合。
9.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-6中任一所述的程序开发方法。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1-6中任一所述的程序开发方法。
CN202010603603.6A 2020-06-29 2020-06-29 程序开发方法和装置 Pending CN113778388A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010603603.6A CN113778388A (zh) 2020-06-29 2020-06-29 程序开发方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010603603.6A CN113778388A (zh) 2020-06-29 2020-06-29 程序开发方法和装置

Publications (1)

Publication Number Publication Date
CN113778388A true CN113778388A (zh) 2021-12-10

Family

ID=78835215

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010603603.6A Pending CN113778388A (zh) 2020-06-29 2020-06-29 程序开发方法和装置

Country Status (1)

Country Link
CN (1) CN113778388A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116541105A (zh) * 2023-07-06 2023-08-04 智慧眼科技股份有限公司 一种基于注解的组件加载方法、系统、终端及存储介质

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116541105A (zh) * 2023-07-06 2023-08-04 智慧眼科技股份有限公司 一种基于注解的组件加载方法、系统、终端及存储介质

Similar Documents

Publication Publication Date Title
CN109976761B (zh) 软件开发工具包的生成方法、装置及终端设备
US9934005B2 (en) Dynamically building locale objects or subsections of locale objects based on historical data
US10146522B1 (en) Live code updates
CN106462412B (zh) 动态地产生的基于模式的类的结构识别
US9086931B2 (en) System for translating diverse programming languages
US9965259B2 (en) System for translating diverse programming languages
US11429365B2 (en) Systems and methods for automated retrofitting of customized code objects
US9430228B2 (en) Verification of backward compatibility of software components
CN108319460B (zh) 应用程序安装包的生成方法、装置、电子设备及存储介质
US20150169386A1 (en) Automating software availability management based on api versioning
US20080235661A1 (en) System and method for using annotations to automatically generate a framework for a custom javaserver faces (jsf) component
WO2019005228A1 (en) AUTOMATED ADAPTATION OF A SOURCE CODE IN ORDER TO INJECT FUNCTIONS BETWEEN VERSIONS OF A PLATFORM
WO2020063252A1 (zh) 一种实现多版本依赖隔离的方法和装置
CN110716720A (zh) 一种实现应用热部署的方法和装置
US9311111B2 (en) Programming environment with support for handle and non-handle user-created classes
US8516455B2 (en) Dynamic loading of kernel extensions
CN108351790B (zh) 用于期望状态配置的非单调最终收敛的设备、方法和介质
US9141353B2 (en) Dynamically building locale objects at run-time
CN112835568A (zh) 一种项目构建方法和装置
CN110888794A (zh) 接口测试方法和装置
CN113778388A (zh) 程序开发方法和装置
CN116685946A (zh) 在不停止应用的执行的情况下的更新的共享库的重新加载
US8135943B1 (en) Method, apparatus, and computer-readable medium for generating a dispatching function
US9778917B2 (en) Dynamically building subsections of locale objects at run-time
Villela et al. About Static. NET Assembly

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination