Architexa是个全新的基于Eclipse的UML建模工具,开发人员可以凭借Architexa的UML图快速洞悉代码之间的关系并与他人共享这些内容。之所以能快速探测代码基,关键在于Architexa为开发者提供了3种熟悉的图表类型(层次图、类图与序列图),随着开发人员对代码基理解的不断深入,他们可以在Architexa的帮助下构建代码之间关系和粒度。
最近有幸采访到了Architexa的创建者Vineet Sinha以深入了解该工具,同时明晰了它为何能帮助开发者处理日益膨胀的代码基。
Architexa是如何在其他UML工具欠缺的地方帮助开发者的?
我们将精力放在了代码需求而非设计需求上,希望能帮助开发者更快地理解代码,理解好相关的任务、相关的文档并能轻松地讨论这些重要的代码概念,然后与同伴分享这一切。
在一开始探索代码基时可以使用层次图这一强大的工具。能否向读者做个简单的介绍?这个想法来自于现有的工作还是经过了不断的演变才得出的?你是如何想到它的呢?
Architexa中的层次图会根据现有的代码基作出最接近于层次架构图的估算。我们注意到大多数层次架构图都是团队或项目所用的高层次图表的主要形式,通常不太容易从众多的代码基中找出层次架构图的踪迹。如果这类图可以帮助开发者找到他们最感兴趣的部分代码基,我们打算快速实现一个版本以满足开发者所需。
Architexa通过分析代码并展示模块来构建层次架构图,如果某个模块依赖于另一个模块,那么就会将它放在图表的上面。除此之外,我们还需要猜——默认情况下,模块基本上是根据代码基的目录结构创建的。而且,大多数代码基经常包含循环,我们使用了复杂的算法来处理这种循环,但依然能保证提供高效的层次图。
大多数工具套件都是我在MIT(CSAIL)读博士时尝试并开发的,我们想要的是一个卓越的工具。主要的想法来自于很多地方:我在下面这些地方花了大量的时间: (i)阅读了多个项目的软件文档以了解共通的东西,(ii)分析了目前提供有效的代码视图的工具:虽然这些工具都非常复杂并且需要培训,但他们各有千秋,我们可以从中了解到这些工具常见的使用模式,这样就能通过几次鼠标点击来简化工具的使用了,(iii)典型的树形widget,通常他们都会收起并显示大量信息,(iv)大量优秀的工具,以便从中找到适合我们的图表的技术。
在构建好了第一个原型后,我们发现了很多问题。虽说实现了大多数主要的想法,但我们意识到了真实世界中的问题(代码经常有循环),我们开发这些技术不仅是为了解决这些问题(通过层次来忽略掉一些代码循环),更是为了减轻用户的负担,这样他们就能轻松处理问题了(用户可以根据这种循环依赖进行扩展、使用彩色高亮显示当前模块之上、使用了当前模块以及与当前模块之间存在循环的模块)。
用户可以借助于Architexa白手起家,无需对代码基有任何了解就能起步并不断探索。在探索代码基时你发现了自己的使用模式了么?你是如何在每天的开发/设计工作中使用这个工具的?
我们发现了大量的使用模式并积极地探求这些模式来不断提升工具的品质。但大多数使用模式还是取决于用户所要完成的任务:
如果开始查看项目(或是项目的一部分),用户通常都需要高层次视图,在这种情况下,他们会使用层次架构视图从上开始,然后双击视图深入到代码内部。
如果想要查看项目(或是子项目)的核心,用户通常都需要了解多个类之间的交互关系,因此想要看到多种关系图(继承、方法调用、属性访问等等),他们尤其喜欢使用类图。
如果想要了解一个重要的用例,用户则需要看到控制流程,在这种情况下,序列图是个不错的选择。
有没有什么办法可以比较现有的图表和改变后的代码基呢?
在代码基发生变化时,图表的使用有多种可能。我们支持两种用例:
在用户创建好图表后又修改了代码基时:如果再一次打开图表就会看到一个红色的错误标识,标识类/关系缺失。
在用户修改完代码基后又想创建图表时:用户可以右键单击项目,转到team菜单并让Architexa根据变更构建一个新图表而非检入代码。这么做的好处在于可以考虑到代码评审问题,因为生成的图表通常都是修改后功能的最好总结。
我们还会在这个地方增加更多支持。
手工生成图表是探索代码基的好办法,但在构建过程中自动生成(类似于JavaDoc)则可以更好地描绘系统的演变过程。Architexa也能实现该功能么?
重要的图表通常会跨越多个类,每个重要的类也会跨越多个图表,因此把他们放到JavaDoc中没什么意义。我们允许用户将图表上传到一台简单的类似于wiki的服务器上。这样,用户不仅可以与其他人共享这些图片(只需使用浏览器即可),还使得我们可以增加额外的信息,这样使用Architexa客户端的其他用户就可以继续探索其他人写的代码了。这些图表代表了代码基中的重要概念,因此他们不仅支持用户添加注释,还可以在不同的地方嵌入这些图表,还有版本的概念,这样就能反映出主要概念的演变过程了。我们还会在这个地方增加更多支持。
该工具目前支持哪些语言?
此次发布只支持Java,但我们还有C++原型。
该工具是否有助于说明组件以及核心类的交互呢(比如说MVC/Web框架交互)?
当然了。该套件的目标就是展示代码中显露出来的关系(方法调用、继承等等)和运行时出现的关系(对接口或基类的调用)。我们通过静态关系实现这一点,但允许用户以任何可行的方式修改图表。
能否说说第一版中尚未包含但即将发布的特性,读者对此可能很有兴趣?
此次发布包含了大量的特性。虽然我们实现了很多特性,但目前主要的目标还是倾听用户的想法。