0

我正在开发一个遗留应用程序,它不仅是意大利面,而且在破碎时会变成蛋壳(Humpty Dumpty 综合征),当代码像旧马尼拉醉酒的水手一样蜿蜒而行时,弄清楚发生了什么就像试图在烟囱里找到一只贵宾犬。

例如,这是我必须了解的一种方法;这只是它的第一部分:

private void InitializeBackgroundThread( LoginStatuses loginStatus, string DialogCap )
{
    try
    {
        double pause         = 1;
        int    wait          = 250;
        ProgressChangedFlag  = false;
        ProgressChangedIndex = 0;
        pc                   = new PendingCommands( pause, wait );

        PendingCommands.ProcessCommands = true;

        if (!((loginStatus == LoginStatuses.LoginVendors) || (loginStatus == LoginStatuses.LoginInventory)))
            PendingCommands.Processing = false;

        PendingCommands.Timeout        = false;
        Util.StopCancelRequested       = false;

        if( timeOut != "" )
            pc.timeOut = timeOut;

        if (!((loginStatus == LoginStatuses.LoginVendors) || (loginStatus == LoginStatuses.LoginInventory)))
        {
            InitializeBackgroundThread_CCRLoginTerminate        (true);
            InitializeBackgroundThread_CCRTimerExceeded         (true);
            InitializeBackgroundThread_CCROnline                (true);
        }

        if (loginStatus == LoginStatuses.LoginVendors)
        {
            InitializeBackgroundThread_CCRCommandConfirmedGetsites  (false);
            InitializeBackgroundThread_CCRCommandConfirmed      (false);
            InitializeBackgroundThread_CCRCommandConfirmedSitesetup (true);
        }
        else if (loginStatus == LoginStatuses.LoginSitesData)
        {
            InitializeBackgroundThread_CCRCommandConfirmed      (false);
            InitializeBackgroundThread_CCRCommandConfirmedSitesetup (false);
            InitializeBackgroundThread_CCRCommandConfirmedGetsites  (true);
        }
        else
        {
            InitializeBackgroundThread_CCRCommandConfirmedSitesetup (false);
            InitializeBackgroundThread_CCRCommandConfirmedGetsites  (false);
            InitializeBackgroundThread_CCRCommandConfirmed      (true);
        }

        InitializeBackgroundThread_CCRProgress              (true);
        InitializeBackgroundThread_CCRProgressChanged       (true);
        InitializeBackgroundThread_CCRProgressComm          (true);

现在我可以用记事本检查它了是“SNAFU”吗?等等等等。

如果一个工具可以直接吃掉这个意大利面并吐出如下报告,那不是很好吗:

*With a loginStatus of "AllQuiet"
PendingCommands.Processing is set to true.
InitializeBackgroundThread_CCRProgressChanged is called.
...
With a loginStatus of "SNAFU"
(etc.)*

这将是一个“杀手”调试/健全性检查工具。我知道有代码覆盖工具,但是有没有这么复杂的工具?

4

1 回答 1

4

这不是代码覆盖率,它只是跟踪运行特定测试时执行的代码。

您想要的是程序切片(“从某个代码点向我展示下游/上游的所有内容”又名“切片” http://en.wikipedia.org/wiki/Program_slicing)和部分评估(“显示如果我假设某个值是一个特定的常量,那么这段代码会是什么样子” http://en.wikipedia.org/wiki/Partial_evaluation)。并且您希望它显示叠加在您的实际代码之上的结果(例如,粗体显示选定的部分)以查看您的焦点。

是的,那将是非常好的工具。

不,我不知道。有 C 和 C++ 的程序切片器(参见http://www.grammatech.com/research/technologies/codesurfer)。我不认为他们有部分评估部分,但我认为他们确实有一些其他选择来最小化被检查的切片的大小。

于 2013-06-03T13:46:23.480 回答