【发布时间】:2015-02-03 16:48:38
【问题描述】:
tl;dr 是否有用于ifs 的 JavaDoc?
简介
我正在为多个客户编写企业应用程序。 99% 的代码库是共享的,但时不时会有这样的变体:
if (user.hasModule(REPORTS)) {
...conditional code...
}
我现在想为用户记录所有这些变体。从文档中应该清楚如果我打开例如会发生什么。模块REPORTS。我相信这个文档应该以 JavaDoc 的方式编写——这意味着它应该尽可能接近条件代码。它可能看起来像这样:
/** Enables the cool report. */
if (user.hasModule(REPORTS)) {
...conditional code...
}
或者这个:
@Doc(text="Enables the cool report.")
if (user.hasModule(REPORTS)) {
...conditional code...
}
或者这样:
if (user.hasModule(REPORTS, "Enables the cool report.")) {
...conditional code...
}
结果基本上是每个模块的 cmets 列表。
Module | Comments
----------+--------------------
REPORTS | Enables the cool report.
REPORTS | Allows exporting the reports.
IMPORT | Allows importing the data.
问题
如何从代码中收集所有文档cmets?我正在考虑几种方法:
源码提取
这将需要一个解析器来遍历源代码,找到所有这些条件并获取对(模块、注释)。但是,它必须与编译器挂钩,以避免出现奇怪的格式问题(长行中间的换行符等)。
动态提取
在运行时调用user.hasModule() 时,它会记录其实际参数,然后使用此日志来构建文档。因此,例如在 beta 测试期间,收集文档,然后将其构建到最终版本中。缺点很明显:如果系统的某个部分未被访问,则不会记录在案。
字节码提取
为了避免乱七八糟的源代码,可以直接获取编译后的字节码,用ASM 之类的东西对其进行分析,然后找到所有调用user.hasModule() 的地方。这是我最喜欢的版本,但是卡住了
以及在调用invoke_static 时如何确定VM 堆栈顶部的实际值是多少。必须有一个更简单的方法:)
总结
有这方面的工具吗?我错过了一种简单的方法吗?我在尝试记录这些情况时是否完全被误导了?谢谢!
【问题讨论】:
-
我不明白你想要做什么。您想为其他开发人员记录
if内部发生的事情吗?或者您想在运行时为用户生成文档,具体取决于启用的模块?这对我来说听起来有点奇怪。 -
后者 - 用户文档。
-
那么 Javadoc 不是您的首选工具。它用于记录代码,而不是供用户阅读。这是一种技术性的方式。
-
JavaDoc 也绝对不能记录像
ifs这样的代码结构,所以我要寻找的不是 JavaDoc,而是具有类似精神的东西。 -
我仍然不明白您为什么要为用户记录代码结构。他对代码中发生的事情不感兴趣,他想知道软件是如何工作的。