字符串在单独的.pas文件中

时间:2011-07-15 19:19:06

标签: delphi pascal

这可能不是这个问题的正确位置,如果不随意移动它。我标记为Delphi / Pascal,因为它是我在atm工作的,但这可能适用于我猜的所有编程。

无论如何,我正在进行一些代码清理,并考虑将程序中的所有字符串移动到单独的.pas文件中。这样做有利有弊吗?它甚至值得做吗?

澄清一下:我的意思是我将创建一个单独的文件,Strings.pas,我将创建所有文本字符串变量。

当前代码

 Messages.Add('The voucher was NOT sent to ' + sName+
                          ' because the application is in TEST MODE.');
 Messages.Add('Voucher Saved to ' + sFullPath);
 Messages.Add('----------------------------------------------------------');

新代码将类似于:

Messages.Add(sMsgText1 + '' + sName + '' + sMsgText2 + '' + sFullPath)

Strings.pas文件将保存所有字符串数据。希望更有意义

6 个答案:

答案 0 :(得分:12)

将字符串移动到单独的文件是个好主意!它将它们保持在一起,如果需要,可以让您轻松更改它们。你的问题并没有说你希望能够翻译它们,但集中化将有助于它。

但是,代码如下:

Messages.Add(sMsgText1 + '' + sName + '' + sMsgText2 + '' + sFullPath)

比代码更好

Messages.Add('The voucher was NOT sent to ' + sName+
                      ' because the application is in TEST MODE.');

你已经把一个凌乱但可读的函数调用变成了一个凌乱的 un 可读的函数调用。使用旧代码(上面的第二个代码段),您可以阅读代码并大致了解消息的内容,因为很多内容都在文本中。使用新代码,你不能。

其次,移动字符串以将相关项目保持在一起并使其更容易更改的原因。如果你想改变上面的消息,而不是在路径'bar'中说“文件'foo',那么该怎么办?”它的措辞是“文件栏\ foo是......”?您不能:消息的构建方式仍然是固定的,并且分散在整个代码中。如果您想要以相同的方式更改要格式化的多条消息,则需要更改许多单独的位置。

如果你的目标是翻译你的消息,这将是一个更大的问题,因为翻译需要重新编写消息而不仅仅是翻译组件。 (例如,您需要更改邮件中包含的子项的顺序 - 您不能只假设每种语言都是替换顺序中的短语。)

进一步重构

我建议您更加积极地重构邮件代码。当您建议将邮件移至单独的文件时,您肯定是在正确的轨道上。但是不要只是移动字符串:移动函数。而不是通过代码散布的大量Messages.Add('...'),找到您创建的公共消息子集。很多都会非常相似。创建一个可以调用的函数族,这样所有类似的消息都可以用一个函数实现,如果你需要更改它们的措辞,你可以在一个地方完成。

例如,而不是:

Messages.Add('The file ' + sFile + ' in ' + sPath + ' was not found.');
... and elsewhere:
Messages.Add('The file ' + sFileName + ' in ' + sURL + ' was not found.');

只有一个功能:

Messages.ItemNotFound(sFile, sPath);
...
Messages.ItemNotFound(sFileName, sURL);

你得到:

  • 集中消息字符串
  • 集中消息功能
  • 减少代码重复
  • 清洁代码(函数调用中没有组合字符串,只是参数)
  • 更容易翻译 - 提供功能的替代实现(不要忘记只是翻译子字符串可能还不够,你经常需要能够大幅改变措辞。)
  • 明确说明函数名称中的消息,例如ItemNotFount(item, path),这会导致
  • 阅读时更清晰的代码

听起来不错:)

答案 1 :(得分:7)

我认为将所有字符串常量移动到一个单元是很有意义的。它使文本更容易更改,特别是如果你想翻译成其他(人类)语言。

但是不是字符串,为什么不做我通常做的事情,即使用resourcestring。这样,您的字符串可以由其他人使用资源编辑器进行更改,而无需重新编译。

unit Strings;

resourcestring
  strMsgText1 = 'The voucher was NOT sent to ';

etc...

但是这样的字符串可能更好:

resourcestring
  strVoucherNotSent = 
    'The voucher was NOT sent to %s because the application is in TEST MODE.';
  strVoucherForNHasValueOf =
    'The voucher for %s has a value of $%.2f'; 

这样做的好处是,在某些语言中,这种替换的位置和顺序是不同的。这样,翻译人员可以在任何需要的地方放置参数。当然,应用程序必须使用Format()来处理字符串:

Messages.Add(Format(strVoucherNotSent, [sName]));
Messages.Add(Format(strVoucherSavedTo, [sFullPath]));
Messages.Add(Format(strVoucherForNHasValueOf, [sName, dblValue]));

答案 2 :(得分:5)

如果您想将UI翻译成不同的语言,那么您可以将所有文本放在一个文件中,或者可能是一些专门用于声明字符串常量的文件。

但是,如果您在没有这么强烈动机的情况下进行此更改,那么您可能只是难以阅读代码。

一般来说,你必须问一下这种重大重构的好处是什么,如果它们不是不言自明的,那么你可能只是为了改变而改变事物。

答案 3 :(得分:3)

如果您想翻译您的应用,请考虑将Gnu GetText用于delphi,也称为dxGetText。这比将字符串放入单独的.pas文件更好,因为它允许您在没有任何特殊工具,任何重新编译的情况下启用翻译,甚至是最终用户。

答案 4 :(得分:0)

嗯,这里的共识似乎倾向于专业方面,我完全同意这一点。错误过度使用字符串文字可能会导致您的来源获得stringly typed

我仍然缺少的一个好处是字符串的可重用性。虽然这不是从运送到另一个单位的直接好处,但它是将字符串文字移动到常量。

但是一个相当重要的缺点是创建这个单独的源文件所需的时间。您可以考虑在下一个项目中实现这个良好的编程实践。这完全取决于你是否有足够的时间(例如爱好项目)或截止日期,是否有下一个项目(例如学生),或者只是想做一些练习。与David H的答案和评论一样,与您做出的所有决定一样,您必须权衡利益。

除了可以提供一些自动帮助的各种花哨的重构工具之外,我们意识到将字符串文字单独移动到另一个单元并不能完成工作。就像RudyDavid M已经回答的那样,你必须重写你的来源。此外,找到可读,简短和适用的常量名称需要时间。正如许多评论已经说明控制拼写的一致性很重要,我喜欢认为同样的论点也适用于替换常量本身。

关于翻译答案,无论是否适用于OP,将所有源字符串移动到单独的单元只是翻译解决方案的一部分。您还必须注意设计师字符串(即字幕)和GUI兼容性:更长的翻译仍然必须符合您的标签。

如果你有奢侈或需要:去追求它。但我会把它带到下一个项目。

答案 5 :(得分:0)

我在旧版本的框架中使用resourcestrings对所有文字进行分组。我之所以回来,因为在框架中你可能不会在框架中使用所有字符串(例如,因为没有使用某些单位或单位组,但扫描常用目录会在翻译工具中显示所有字符串)。

现在我再次在单位上分发它们。我最初开始对它们进行分组以避免重复,但回想起来这是一个较小的问题

(*)在“common”dirs上使用dxgettext。