我无法让 Visual Studio 建模/映射孤立/离散 VB 函数代码。
我正在使用用 VB.Net 编写的遗留应用程序。大多数应用程序代码/可执行文件对最终用户是不透明的,但它在表单后面具有用户空间自定义,可以与表单字段和数据模型交互。我需要做的是映射这个用户定义的代码以查找不良交互,例如循环逻辑。
TL,DR(问题):目标是获得某种实体关系或依赖图。我可以在 Viso 或其他东西中绘制这些,但是为所有代码都这样做是相当令人生畏的。
在我看来,应该有一种方法可以轻松地为函数及其内部结构以及读写模式建立模式。到目前为止我还没有发现任何东西。没有人应该尝试用 Excel 来做这件事——太多了。我熟悉正则表达式,但根据我的经验,它并不是真的适合这样的问题。
有什么办法吗?
如果对细节不感兴趣,请忽略以下
我尝试过使用 VS 代码映射,但它需要引用应用程序的已编译部分,而我没有。所以在 VS 中,这个用户代码基本上是死的、无法识别的孤立代码。它没有类上下文,只在运行时执行。这样做似乎相当困难。所以 VS Code 可以语法高亮它,但 Visual Studio 不能用它做任何事情,并且像代码映射和 dmg(有向图)这样的附加工具看不到它。
由于所有用户代码都是简单的函数,我希望以某种方式将其简单地转换为 DMGL,以查看它们在这种有限的上下文中如何相互引用。我可以使用 Excel 或 Regex 来做到这一点,但这必须是重新发明轮子的重大努力。我什至尝试过Object-Role Modeling,但是必须手动输入,太麻烦了。
我也看过 Roslyn,但它与 Visual Studio 的问题相同
在这里复制我所有的可疑函数可能不太好,但可以在以下位置看到整个上下文:最可能的罪魁祸首
理解显示的代码的关键是有一个表示时间卡的父/标题表单。Timecards 表中的字段以 lmp* 为前缀——并且有一个表示详细信息行的子子表单,称为数据库表 TimecardLines,其字段以 lml* 为前缀。
例子
当用户编辑时间卡行的某些字段时,可以调用这两个函数。我没有显示代码,只显示接口。每个都可以引用和更新由其他功能管理的字段。因此,以文本形式可视化可能的级联效果可能是一场噩梦。
标记为依赖项的项目是对应用程序已编译部分的调用,我只有接口足迹,除了作为入口/出口点之外无法分析。由于它们对我来说是不可变的,我无法修复它们,只能在不必要的地方避免它们。:
M1.Ax.Erp.Forms.Production.Timecard.TimecardLineView
+Timecard 条目问题的子级:M1.Ax.Erp.Forms.Production.TimecardView
注:暂不考虑
_Delete()
事件。
Function lmlRoundedEndTime_ValueChanged(sender, e)
更新:
lmlLaborHours
- 隐式调用: -lmlLaborHours_ValueChanged()
lmlActualEndTime
- 隐式调用:
TimecardLines_UpdateCompleted
- 隐式调用:
输入:
lmlRoundedStartTime
lmlRoundedEndTime
lmlShiftID
依赖:
App.Ax("Shift").``CalculateHours``()
行为设置:
xapLMUpdateActualWithRounded
隐式调用:
lmpRoundedEndTime_ValueChanged()
Function lmlRoundedStartTime_ValueChanged(sender, e)
更新:
lmlRoundedEndTime
- 隐式调用:
lmlRoundedEndTime_ValueChanged
TimecardLines_UpdateCompleted
lmlLaborHours
lmlActualStartTime
- 隐式调用:
输入:
lmlActualStartTime
lmlRoundedStartTime
lmlRoundedEndTime
lmlLaborHours
lmlShiftID
依赖项:
App.Ax("Shift").``CalculateEndTime``()
App.Ax("Shift").CalculateHours()
行为设置:
xapLMCalculateEndTime
xapLMUpdateActualWithRounded
当这些被编辑时,父标题会被更新,因此许多相关的父函数可能会发生不良交互:
M1.Ax.Erp.Forms.Production.Timecard.TimecardView
父级:+Timecard 条目问题:M1.Ax.Erp.Forms.Production.TimecardLineView
可以调用以下函数:TimecardLines_UpdateCompleted
Function lmpRoundedStartTime_ValueChanged(sender, e)
更新:
lmpPayrollHours
输入:
lmpRoundedStartTime
lmpRoundedEndTime
lmpShiftID
依赖项:
App.Ax("TimecardFunctions").CalculateHours()
行为设置:
xapDCPayCalculationMethod
Function lmpRoundedEndTime_ValueChanged(sender, e)
更新:
lmpPayrollHours
输入:
lmpRoundedStartTime
lmpRoundedEndTime
lmpShiftID
依赖项:
App.Ax("TimecardFunctions").CalculateHours()
行为设置:
xapDCPayCalculationMethod
等等。
PS:我没有创建标签 dmgl 的声誉分数 - 它应该是。如果有人可以标记它,那就太棒了。