2017-07-31 14 views
0

不幸的是,我继承了一个基于{$IFDEF}“地狱”的不幸设计。如何确定所有单元的依赖关系? (估计重构成本)

我有大致看起来像这样(其中MyDbSystemB是我想补充的)

unit MyTable; 

interface 
uses 
    // ... 
{$IFDEF MyDbSystemA} 
    DbSystemA , 
{$ENDIF} 
{$IFDEF MyDbSystemB} 
    DbSystemB , 
{$ENDIF} 

type 
    TMyTable = class(
     {$IFDEF MyDbSystemA} 
      TSystemATable 
     {$ENDIF} 
     {$IFDEF MyDbSystemB} 
      TSystemBTable 
     {$ENDIF} 
    ) 
    // A public interface implementation 
    end; 
implementation 
    // ... 
end. 

一些单位参考TMyTable,但依靠提供TSystemATable具体功能:

unit oldUnit; 

interface 
    uses MyDbTable; 

type 
    TXy = class(TXyz) 
    public 
     procedure Foo(); 
    end; 

implementation 

procedure TXy.Foo(); 
var 
    table : TMyTable; 
begin 
    table := TMyTable.Create(); 
    table.SomeSystemASpecificFunction; 
end; 

我想在单个引用/语法检查中找到所有这些引用。但正如我在这里看到的那样,显然不是真的可能。

找到这些文件来估计移植工作的最佳策略是什么?

  • 一个纯文本文件的grep在所有*.pas文件(可能有很多要么死代码,或者只是去耦不好的东西)?

  • 我也能够提供

    TMyTable = class({ ... like above }) 
        {$IFDEF MyDbSystemB} 
    public 
        procedure SomeSystemASpecificFunction; deprecated; 
        {$ENDIF} 
    end; 
    

    TMyTable的实施替代实施,但我需要估计重构成本做正确反正。

    关于我也可以添加deprecated属性以及SomeSystemASpecificFunction替代品,这至少会给我警告。

+0

只需将单位注释掉,看看会发生什么。解决你找到的错误,不断重新编译,看看剩下的是什么。 –

+0

@Rudy这正是我想要避免(与那个庞大的代码库)。 – user0042

+0

它可能是解决所有不同引用到某些类和其他标识符的唯一可行的方法。 –

回答

2

如果你知道TMyTableA成员的名字代码呈现然后使用在文件中查找...(或者你喜欢的替代grep般的工具),以确定这些成员引用的依赖您项目中的文件。

无论如何,这可能比任何基于编译的检查更可靠。

任何声称能够找到“项目中的所有编译错误”的工具通常都不是对你说谎,因为没有可靠的方法来区分之前由于其他错误而未出现的错误汇编。

例如在C#解决方案中,通过简单的更改很容易导致几十个(如果不是数百个)编译错误,这些错误通过仅解决第一个错误来解决。

即编译器报告(例如)224错误,实际上只有1个错误,223个错误作为副作用。

出于同样的原因,您不能确定错误列表是否包含您最终可能发现的所有真正错误。在某些情况下,由于这些副作用错误,编译器可能会被击败甚至不尝试编译包含您正在查找的错误的代码。

当然,在几十个或几百个错误的列表中,您可能可以通过grep找到那些似乎是您正在寻找的“真正”错误的候选对象(即参考您知道的特定成员参与你的改变)。但是,所做的只是更改要搜索的数据集以查找这些引用。即编译错误列表,而不是您的项目源。

+0

您如何看待强制弃用警告? – user0042

+0

_“通过仅解决第一个错误来解决。”_不幸的是,这并不简单。 – user0042

+0

@ user0042 - 不,我知道当你知道有多个错误时,修复第一个错误并不能解决所有错误。我只是指出,“显示所有错误”功能通常没有用处多少有用,并且可以使用替代工具来解决这些罕见场景中有用的用例。即不要将编译器用作“grep”工具。 – Deltics