这可能不是这个问题的正确位置,如果不随意移动它。我标记为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文件将保存所有字符串数据。希望更有意义
答案 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的答案和评论一样,与您做出的所有决定一样,您必须权衡利益。
除了可以提供一些自动帮助的各种花哨的重构工具之外,我们意识到将字符串文字单独移动到另一个单元并不能完成工作。就像Rudy和David M已经回答的那样,你必须重写你的来源。此外,找到可读,简短和适用的常量名称需要时间。正如许多评论已经说明控制拼写的一致性很重要,我喜欢认为同样的论点也适用于替换常量本身。
关于翻译答案,无论是否适用于OP,将所有源字符串移动到单独的单元只是翻译解决方案的一部分。您还必须注意设计师字符串(即字幕)和GUI兼容性:更长的翻译仍然必须符合您的标签。
如果你有奢侈或需要:去追求它。但我会把它带到下一个项目。
答案 5 :(得分:0)
我在旧版本的框架中使用resourcestrings对所有文字进行分组。我之所以回来,因为在框架中你可能不会在框架中使用所有字符串(例如,因为没有使用某些单位或单位组,但扫描常用目录会在翻译工具中显示所有字符串)。
现在我再次在单位上分发它们。我最初开始对它们进行分组以避免重复,但回想起来这是一个较小的问题
(*)在“common”dirs上使用dxgettext。