深入实践Kotlin元编程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 元编程的学习方法

学习从来就不是一件轻松的事情,元编程的学习尤其如此。本节将介绍一些元编程技术的学习心得和方法,帮助读者做好学习元编程技术的准备。

1.3.1 培养兴趣

相比编程语言的基本语法,元编程相关的技术往往更有难度。为什么呢?一方面,元编程需要开发者对目标语言本身以及编译原理有一定的了解;另一方面,元编程需要开发者有一定的开发经验积累,能够从复杂的业务场景中抽象出需要解决的问题。

不过,换个角度来看,元编程又很简单。正如前面提到的,元编程在多数情况下就是处理程序中的模板代码,目的是提升研发效率,因而元编程的需求往往来自研发团队自身。相比多变的产品需求,元编程的需求往往更简单、更纯粹。

不仅如此,元程序的编写过程中往往富有挑战,解决问题的过程中又充满乐趣。元编程还可以实现四两拨千斤的效果,给开发者带来很大的成就感和价值感。

因此,要学习元编程技术首先要做的就是充分调动自己的技术热情,不要有畏难情绪。

1.3.2 付诸行动

“纸上得来终觉浅,绝知此事要躬行。”我们学习编程技术,最忌讳的就是“看了就是会了”,学习元编程技术尤其如此。元数据通常都比较抽象,不容易凭直觉想象,如果不动手试验,有些情况是很难直接想到的。

例如我在准备9.5.3节的内容时,需要研究$changed的计算方法(参见代码清单9-87),其中涉及的条件非常烦琐、复杂,为了搞清楚各个分支的关系,就必须要构造各种用例来反复尝试。

1.3.3 善用工具

由于元数据比较抽象,因此合理地利用一些工具来帮助我们快速找到问题的本质也是非常重要的。

在众多工具中,对Kotlin元编程最有帮助的莫过于PsiViewer了。PsiViewer是一款可以将IntelliJ平台的PSI(Program Structure Interface,程序结构接口)可视化的IntelliJ插件。

接下来看一个具体的例子,如代码清单1-6所示。

代码清单1-6 GitUser类

比如,我们希望搞清楚id的类型Int是什么类型的节点,就可以通过PsiViewer非常方便地看到,如图1-2所示。

图1-2 使用PsiViewer查看Int节点

PsiViewer可以用来查看所有IntelliJ平台支持的编程语言,它最常用的应用场景实际上是IntelliJ插件的开发。Kotlin编译器使用了PSI作为Kotlin的抽象语法树,因此PsiViewer同样可以用于Kotlin编译器插件的开发。

说明

尚未正式发布的K2编译器(K2Compiler,Kotlin的新一代编译器)已经不再使用PSI,而是自研了一套专用的FIR(Front-end Intermediate Representation,前端中间表示)作为新的抽象语法树。

1.3.4 多读源代码

元编程技术的参考资料远不及入门教程多,甚至连官方文档也对此讳莫如深。其实原因说来也简单,元编程技术相对于其他技术而言还是太小众了。

资料的缺乏,特别是成体系的资料的缺乏,自然是我希望本书能够解决的问题之一。不过,纵然我能把我知道的内容完全呈现到纸面上,也还会受到个人技术水平和内容篇幅的限制,不能解决的问题仍然是大多数。

怎么办呢?

很简单,经常翻阅编译器甚至IntelliJ社区版的源代码,所有问题的答案基本上都可以在编译器源代码中找到。如果你想要成为元编程技术的高手,那一定要养成有问题翻阅源代码的习惯。我们将在1.4节介绍如何配置编译器以及IntelliJ社区版的源代码调试环境,强烈建议读者将环境配置好并时常翻阅源代码。