【问题标题】:How to choose migration path from Delphi 2007如何从 Delphi 2007 中选择迁移路径
【发布时间】:2011-01-08 18:59:03
【问题描述】:

我正在与一个使用 Delphi 2007 的更大应用程序的团队合作。它使用更大的遗留框架来访问数据。应用程序和框架都使用 String 作为字符串的数据类型。我已经开始修改框架中的代码以支持 Delphi 2009 字符串,请参阅我之前的问题。

我现在看到 2 个替代方案:

Alt 1 - 像以前一样继续使用字符串。这可能是最简洁的解决方案,因为框架随后将支持 Unicode。但是必须对框架中的代码进行大量修改才能使其正常工作。这需要深入了解框架中的内部算法。这也是引入新错误的更大机会。

Alt 2 - 用 AnsiString 替换 String 和用 AnsiChar 替换 Char。这可能是一个更简单的解决方案,也是我开始修改代码的方式(但后来我开始思考并提出这个问题......)。不利的一面是不支持 Unicode。 Unicode 支持不是必需的,因为它以前工作过,但很高兴拥有。它在未来也可能有用。另一个问题是应用程序必须在框架的方法中将 Ansistring 变量作为参数发送,而不是像以前那样发送 String。有成千上万的呼吁改变......

所以我现在不知道。这两个选项都需要大量工作,但替代 1 可能更具风险和耗时。我想从这个论坛得到反馈和 cmet,因为我想我不是第一个遇到这个问题的人。

编辑 另一个问题是内存占用。我写了一个快速测试,分配了一百万个字符串的数组。每个字符串用从 A 到 Z 的 26 个字符填充。

使用 Delphi 2007 需要 40.011.600 字节,时间为 4:15 分钟。 使用 Delphi 2009 需要 72.015.580 字节,时间为 4:45 分钟。

使用 GetHeapStatus.TotalAllocated 测量内存消耗。

我认为我们不能让字符串分配两倍的内存。

现在每个客户端有 500 MB 的内存消耗并不罕见。我猜这大部分都是字符串。想必我们尽量使用 AnsiString。

问候

【问题讨论】:

  • 大家都很感兴趣,谢谢!显然,选择什么并不明显。我对 Alt 2 感觉更多,但 Andreas 的评论让我担心。如果 Pos 返回错误的索引,它可能会引入新的错误。
  • 查看我的回答中的编辑:“链接到 CodeRage 4 上的 Unicode 会话并解释 Andreas 所描述的情况”。

标签: delphi unicode migration delphi-2009 delphi-2007


【解决方案1】:

要么继续使用旧版本的 Delphi,要么一路走下去。不管怎样,你迟早要这样做。

请注意,“用 ansistring 替换所有内容”方案也并非完全万无一失,特别是在您接触流并且文件格式需要保持不变的情况下。不再有带有 ansistring 的显式 TStringlists、tstringstreams 等。

Datasnap、Indy 和其他框架可能也是如此。

您可以先尝试对某些字符串密集型部分使用此技巧,以避免直接更改过多代码。例如。我有一个自己的 XML 库,我对其进行了修补以保留大部分 ansistring。该库只是横向使用,unicode 对它无关紧要。

【讨论】:

  • 是的,我注意到 AnsiString 替换轨道不是 100%。
【解决方案2】:

从“alt 2”开始,然后逐渐将 unicode 支持添加到您的框架中,然后转到 Unicode。

理由:您想要一个稳定的应用程序;切换到 Delphi 2009+ 最终需要您真正支持 Unicode。

编辑:20100125

在执行“alt 2”时,请注意 Delphi 编译器提示警告。
Andreas 描述的情况会产生这样的提示和警告。

我已经在我的CodeRage 4 session about Unicode and other encodings 中解释了这一点。
上面的链接指向一个页面,您可以在其中查看该会话的回放。

如果您仍有疑问,请在此处提出。

--杰罗恩

【讨论】:

  • Alt 2 可能比 Alt 1 给他带来更多麻烦,因为 RTL 和 VCL 是 Unicode。例如,如果他使用“Pos”函数,编译器将更喜欢 Unicode 版本,除非两个参数都是 AnsiStrings。如果第一个是字符串文字或字符文字,编译器将使用 Unicode 版本。还有一些多字节字符串在 Unicode 中由不同数量的字符表示,这会导致 Pos 返回错误的索引。
  • 有趣,您有任何可能发生这种情况的参考或真实案例吗?
  • 我认为他的意思是说,在评估要调用的版本时,从文字到 unicode 的转换优于文字到 ansistrings。我认为这是正确的,但不应被高估。我希望 (ansistring,char) 会选择 ansistring 版本。
【解决方案3】:

我们在一年前评估了 2007 -> 2009 年的过渡,并尝试了一个较小的项目(20 万行)。结果是,在您不使用“花哨”的东西(如指针、字符集等)的任何地方,移植都不是那么困难。尤其是我们在一天左右的时间内移植的 GUI 单元。这相当于 opt1。

具有低级例程、访问测量系统等的库单元是完全不同的故事。在这里,我们选择翻译 string -> ansistring、char -> ansichar 等。移植这些单元很难得到正确的结果,而且客户不会为转换付费。因此这些单位选择 2。

这种混合方法让我们两全其美,但我们将在 Delphi 2007 上保留一些较大的项目,并且可能仅在 64 位版本的编译器出现时进行移植。

【讨论】:

  • 可能这就是我们进行对话的方式,但整个团队必须讨论和计划这一点。
【解决方案4】:

它会做更多的工作,但我真的建议您升级到 Unicode 字符串,因为这是 VCL 的本机字符串类型,因此您的所有控件无论如何都将处理 Unicode 字符串。尝试来回转换所有内容会给您带来各种麻烦。

【讨论】:

  • 正如我所说,这是最干净的解决方案。让我担心的是,我们必须更改框架中我们不完全理解的代码。这需要大量测试以确保质量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多