作为介绍,最近我有点安静,部分原因是我一直在忙于Chronicle-FIX的工作 。 这是Chronicle-Enterprise套件中的一个新的超低延迟库,我们证明了该库可以在低个位数微秒内解析和存储消息。 当然,它利用了我们的开源产品Chronicle-Queue , Chronicle-Network和Chronicle-Bytes 。

我们实现的低延迟的秘密之一是,每个实现都可以完全基于其所需的架构来生成自定义的修复引擎。 为了实现这一点,我构建了很多代码生成代码。

因此,我想我将分享在此过程中中学到的一些经验教训。

1.使用代码生成库

到目前为止,这是最重要的提示。 我很难强调这有多重要,以及您将节省多少时间和复杂性。 您真的不想在创建字符串文字时试图弄乱代码中的正确间距或加倍和三倍转义的引号引起麻烦!

我使用了JavaPoet ,它是开源的(Apache 2),非常好。 它处理了我想做的所有事情,包括一些非常复杂的泛型。 它唯一不支持的事情就是声明静态导入,但这很容易解决,对于一个优秀的库来说,它并不重要。

JavaPoet将Java代码分解为对象:TypeSpec(类或接口),MethodSpec(方法),FieldSpec(字段),CodeBlocks(代码块)。 它巧妙地为基于printf模式的语句(代码行)提供了丰富的语法。 您会发现,遵循这种范式将为您提供更简洁明了的代码,而不是自己动手编写代码,这很容易使此类问题的过程编码路线更加混乱。

2.首先手动编写代码

在没有先编写示例代码的情况下,请勿尝试并生成代码。 通过后视镜进行编码不是一件容易的事,如果要逐步进行,则变得很复杂。

首先花一点时间手工编写代码,然后为其生成代码。

另外,您将希望产生尽可能最佳的代码,这只有在您首先花费时间和精力手工编写代码的情况下才能完成。

3.生成尽可能少的代码

仅生成所需数量的代码。 因此,例如,如果您所有生成的类都需要实现某个方法,请使用可以由生成的代码调用的帮助程序类,而不是多次生成该方法。 或者,使用基类上的方法获取代码以扩展静态基类。

4.确保可以一次性吹走所有生成的代码

不要将静态代码与生成的代码混合使用。 您要做的是拥有com.test.generatedcode.xx.xx类的软件包。 在每次测试/开发运行结束时,您都应该能够删除整个文件夹com/test/generatedcode ,这意味着该文件夹中根本没有静态代码。

您会发现以这种方式安排代码将使测试周期变得更快。

5.从一小部分可验证的代码开始

代码生成的重点通常是产生大量代码。 很难测试您生成的代码是否正确。 因此,从一个小而复杂的示例开始,您可以通过阅读代码进行检查,并为其找到一个测试用例。

希望以后的情况会更多。

6.生成测试用例

如第5点所述,很难在所有情况下验证您的代码生成器是否正确。 因此,您应该尝试将测试用例作为所生成代码的一部分进行生成。 然后,您可以从生成器生成许多偏斜的复杂代码,并对其进行测试。

7.冗长

从本质上讲,生成代码的代码很难阅读和理解。 代码生成代码将永远不必太快,因此不必担心使其变得冗长。 使用大量评论,但更重要的是,尝试使其尽可能明确,以便您可以在一年内回顾它并仍然可以对其进行维护。

翻译自: https://www.javacodegeeks.com/2015/12/7-tips-successful-code-generation-java.html