MiniWalker






4.38/5 (48投票s)
2005年10月10日
11分钟阅读

563252

274
你知道什么是IT吗?吞下红色药丸,然后找出答案……
- 下载 .NET Framework 2.0 原型 - 1281 Kb (来自 blix.net)
- 下载 .NET Framework 1.1 原型 - 1234 Kb (来自 blix.net)
- 下载 .NET Framework 2.0 原型 - 1.25 MB
- 下载 .NET Framework 1.1 原型 - 1.20 MB
红色药丸
当我们用 C# 编写代码时,我们会使用面向对象软件构建技术。这意味着我们的实现形式是类以及它们之间的关系。但这并不能说明全部,因为在我们开发的过程中,还会构建一个心理模型。这是我们对系统如何工作的想法,通常包含所有重要的部分——即主要的类以及它们如何协同工作。小的细节可能会在这个模型中丢失,在我们通过调试器再次体验实现时,这些细节会被找回。
当我们看六个月前写的代码,或者看别人的代码时,这个心理模型可能不存在。我们必须通过检查,通常还需要更多的调试器经验来重新构建它。在这种情况下,心理模型的直接转移无疑是更好的解决方案。我们如何转移一个只存在于原始作者脑海中的东西呢?
因此,当我们审视这一切时,很明显 C# 有明确的规则和构造。我们可以利用这些来创建可视化。虽然生成的版本在类型的重要性及其用法方面无法与心理模型相媲美,但它可以基于广度来近似。也就是说,属性的数量、方法的数量以及这些方法和属性的作用域可以用来在视觉上表示一个类型。此外,隔离类型之间的引用可以精确地显示两个类型之间的依赖关系。虽然仍不如我们大多数人随身携带的手工心理模型好,但这些生成的图像仍然可以让我们一目了然地了解类型的函数和关系。这就是 MiniWalker 的目标。
迷你图约定
我们在这里使用的可视化约定称为迷你图。这种约定专为 C# 类型及其关系的视觉表示而设计,便于生成。而且,我们知道您可能正在考虑 UML!但 UML 是为表示任何语言而设计的,并且有意地独立于实现。因此,它隐藏了理解 C# 类型所需的关键信息。迷你图约定则走向相反的方向,尽可能添加描述性的图形细节。如果您真的想要 UML,只需使用 Visual Studio 2005 中的类视图。对我们而言,UML 远远不够。
具体来说,在这里我们需要看到所有字段、方法、属性和事件,而不仅仅是类型的公共成员。最重要的是,我们需要映射这些成员之间的依赖关系,以便我们能够直观地看到依赖的级别和强度。为什么?因为它使我们能够在不阅读每一行源代码的情况下了解类型的运作方式。它还为我们提供了类型的质量的“鸟瞰图”——具有许多引用的类型要么是极高级别的,要么可能只需要重构。最后,Minis 使我们能够一目了然地了解类型的用途。
例如,“控制器”类型通常具有较少的public
成员和大量的private
或protected
方法。像这样
您还可以通过字段而不是参数来判断“控制器”类型在方法之间通信时倾向于使用字段。像这样
“数据”类型通常相反,几乎所有的public
属性,几乎没有其他内容。请注意,属性的private
字段出现在属性椭圆中,这强调了这个类型几乎没有真正的内部逻辑的信息。
至于类型关系,参数图标(我们称之为小方块,kibbles)的存在通常会提示我们该类型作为参数传递。像这样
如果没有参数,那么方法显然会创建该类型。
关键是,玩了几分钟 Minis 之后,您就会开始习惯它们,并在瞬间就能发现一个类型的本质。您正在熟悉您自己的(或别人的)源代码,并且做得很快。随着 MiniWalker 的发展,我们将进行改进以增强这种效果。
解析器
现在,我们不是为了学术练习而这样做。我们确实有一些严肃的,有时甚至是沉重的要求需要处理。因此,MiniWalker 的目的是成为一个功能齐全且非常有用的工具,它可以帮助我们清晰、快速地准确了解我们的实现方向以及不足之处。实现这一目标的首要任务是完成一个高质量的解析器。我们需要解析器,因为只有自定义解析器才能深入到必要的细节级别来构建有用的可视化。例如,解析器“弄清楚”以下内容:
- 当前解决方案中声明的所有类型。
- 类型引用:字段类型、属性类型、参数类型以及在方法体或字段声明中创建的类型。
- 分级:通过类型创建来确定高级类型和低级类型。
分级
分级是 MiniWalker 的一个关键概念。我们将 `Point` 或 `Rectangle` 等类型视为“低级”类型。我们认为它们“更接近底层”。`Form` 或 `ListView` 等类型被认为是“高级”类型,因为它们利用许多其他类型来完成工作。确定类型级别并不容易,我们仍在努力。我们使用的基本规则是,如果一个类型创建了另一个类型,那么第一个类型就比第二个类型更高级。这在某些情况下可行,但并非在所有情况下都可行。
设置 MiniWalker
首先,您需要下载并解压缩原型。如果接受默认设置,它将解压缩到C:\MiniWalker2005。您可以将 MiniWalker 指向您的实时源代码解决方案,或者指向包含源代码副本的目录。在解压缩的默认目录中,有一个名为CopyYourSolutionHere 的嵌套目录。要使用 MiniWalker 的默认行为,您应该将您想遍历的源代码的解决方案和相关项目复制到此目录中。否则,请在解决方案工作区中单击“搜索解决方案”按钮,在您的本地硬盘驱动器上的任何位置选择您的解决方案所在的目录。
接下来,运行MiniWalker.exe。该应用程序将立即在所选目录中搜索解决方案并开始解析。如果成功解析了您的解决方案,在所有解析完成后,将自动选择第一个解决方案并显示类型工作区。
解决方案工作区
运行 MiniWalker 时看到的第一个屏幕是解决方案工作区。
在这里,会显示找到的所有解决方案以及解析进度。解析完成后,第一个解决方案会被自动选中,并显示类型工作区。您可以通过切换控件随时返回解决方案工作区。
遍历 Minis
解决方案中的所有类型都显示在类型工作区中。选择一个类型即可查看该类型的 MiniDiagram。
分级结果直接显示在 Mini Diagrammer 本身中。在这里,高级类型显示在左侧,低级类型显示在右侧。
单击这些列表中的任何一个都会导致类型之间的所有引用被绘制为一系列蓝色箭头,目标成员主体被高亮显示并带有标签。
当从列表中选择一个类型时,其 Mini Diagram 上方会出现一个小的蓝色图标。
单击此图标会隐藏 Mini 并再次显示列表。然后您可以选择另一个类型。当所选类型具有比可探索的更多的引用时,会在 Mini 的左侧(或右侧)显示一个蓝色箭头。
单击此箭头会导致 Minis 向左或向右滑动。这被称为“遍历” Minis。这有点像通过类型的各种引用进行“钻取”。当然,如果您向左移动,实际上是在“向上钻取”,移动到更高级别的类。这种遍历过程,以及从中获得的信息,是 MiniWalker 体验的精髓。
源代码高亮
源代码高亮有助于您查看 Mini Diagram 中显示的任何属性、方法、事件或引用的实现。您可以通过将鼠标悬停在成员主体上来检查 Mini 的成员。
单击成员以查看其源代码。
当引用显示如下时:
它们在源代码中高亮显示如下:
这里,`BigArrow` 在其构造函数和属性中引用 `BigArrowColors`。单击构造函数或属性将高亮显示该成员。
然后您可以看到引用在成员内高亮显示。
引用面板
引用面板是出现在所选类型源代码上方的类型列表。单击此处列出的类型,这些类型将成为所选类型。这些类型的颜色编码如下:
- 白色:祖先或接口。
- 黑色:后代。
- 深蓝色:更高级别的类(创建所选类型的类型)。
- 亮蓝色:更低级别的类(由所选类型创建或被所选类型引用的类型)。
- 灰色:外部(引用的程序集中的类型)。
查找器
您可以通过输入类型应具有的引用数量来限制显示的类型,从而快速隔离具有最多引用的类型。
GridBag
类型工作区使用一种称为 `GridBag` 的新型控件。`GridBag` 将应用程序表面划分为可折叠的矩形区域。这些区域之间的间隙包含不可见的分割线。您可以将鼠标移到这些间隙上,光标提示将指示拖动过程中发生的分割操作。您也可以单击间隙来折叠相邻的区域(有效地将其隐藏)。
Minis
(单击此处返回文章。) 这里是 Mini 标准的完整描述,尽管原型中也包含了一个完整的图例。Mini 图的核心是一个代表对象的矩形。
属性由椭圆表示。
如果属性实现的是值类型,它会包含一个小的矩形。
如果属性实现的是引用类型,它会包含一个圆圈。
属性的 getter 由椭圆左侧的形状指示。
属性的 setter 由椭圆右侧的形状指示。
当 getter 或 setter 包含除了简单返回或赋值字段值以外的任何代码时,会从封闭的形状到椭圆的边缘画一条线。这是一个具有 getter 代码的读/写属性的示例。
方法由圆角矩形表示。
小方块用于表示方法的参数。
参数超过三个的方法使用省略号代替第三个方块。
接口显示在右上角,通过一个类似叉的符号表示。
事件显示在底部,通过一个类似插座的形状表示。形状内的向下箭头代表用于实现事件的委托。
包含值类型的字段由小的矩形表示——这些看起来几乎像一个连字符。
包含对象的字段(引用类型)显示为圆圈。
构造函数出现在左上方。像方法一样,这些形状包含表示任何参数的小方块。
如果声明了析构函数,它将显示为最后一个构造函数正下方的灰色矩形。
对象各个部分的范围和可见性由 Mini 中的位置表示。公共属性出现在左侧,椭圆的左尖端突出。
公共方法出现在右侧,矩形的右边缘突出。
公共事件出现在底部,“插座”突出。
static
、private
和protected
成员显示在 Mini 内部的特殊区域。这里,我们有一个带有静态区域、私有区域和保护区域的 Mini。顶部的静态区域包含字段。中间的私有区域包含字段和方法。下方的保护区域包含方法和属性。
链接
- Concept IDE 2010.
- Don Norman 文章 (PDF).
- 《关于人机交互设计》(About Face: Alan Cooper).
- 《定量信息的视觉显示》(The Visual Display of Quantitative Information: Edward R. Tufte).
更新
- 2005年10月10日 - 文章发布。
- 2005年10月25日 - 现在映射您的 C# 代码。
- 2005年11月2日 - 解析 C# 2.0。
- 2005年11月3日 - 源代码高亮。
- 2005年12月1日 - 增加了对 .NET Framework 2.0 的支持。
- 2006年5月4日 - 源代码目录选择器,更新的解析器,为非数字显示增加了更多颜色。
- 2006年6月7日 - 更新了源代码解析器。