1.
一开始,显示整个工程的状况
这一步具体有很多工作要做,最终目标是能够让用户快速分辨出工程由几个模块组成,哪些模块属于高层模块,哪些属于底层模块,分辨出每个模块中比较重要的类。还有每个类在程序里面的实际影响范围。
具体的设想在下一步进行,当前重点考虑类内部的设计。
2.
用户选出感兴趣的模块,进而挑选感兴趣的类。
假设挑选了下面这个类。
3.
用户第一眼,应该能够分辨出这个类最主要的成员。包括处理核心计算的1-2个函数,最重要的3-4个变量。其余函数、变量以不显眼的形式(例如灰色或淡色的节点)展示,这样用户可以看出一些额外的信息,例如这个类是函数多,还是变量多。最主要的函数,其相关的调用关系也以显眼的边画出。我认为可以借助城市不同等级道路的表示方式。
当前函数的效果如下面左图,而函数加变量的效果为下面右图。主要问题是所有的函数、变量都显得同等重要,无法分出主次,连接边太过乱。
4.
为了让用户对类的工作方式有进一步了解,需要以某种形式展示类的数据流图。
首先需要分出数据入口和出口。初步的方法可以检查类的公有成员函数(因为这部分成员才与外部发生数据交换,先不考虑友元、静态函数等特殊情况),若函数设置了类内部的变量,认为其为数据入口,若函数设置了传入的变量,或者返回内部变量,认为其为数据出口。可以以一些简单的图标展示,例如下图的箭头(下图仅仅根据函数的set和get前缀标注了相应的函数)。但是这些图标默认必须是隐藏的,只有在用户打开开关时才显示,以防一开始分散用户的注意力。
然后可以指出一些重要的数据流向。例如,用户指定几个入口,几个出口,系统找出几个可能的数据流。下图中用户指定setSelectedEntity为入口,getSelectedEdges为出口,系统计算出可能的数据流。即通过setSelectedEntity->updateSelectedRendering->getSelectedEdges 这样的函数调用顺序,有可能(不保证完全准确)把输入的entity数据转换成输出的selectedEdges数据。
5.
用户还可以通过交互,从核心函数开始,逐步了解类的其余部分。例如通过选定其中一个函数,知道与其相关的函数和变量。