如果不随意移动它,这可能不是这个问题的正确位置.我标记为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('----------------------------------------------------------');
Run Code Online (Sandbox Code Playgroud)
新代码将是这样的:
Messages.Add(sMsgText1 + '' + sName + '' + sMsgText2 + '' + sFullPath)
Run Code Online (Sandbox Code Playgroud)
Strings.pas文件将保存所有字符串数据.希望更有意义
Dav*_*vid 12
将字符串移动到单独的文件是个好主意!它将它们保持在一起,如果需要,可以让您轻松更改它们.你的问题并没有说你希望能够翻译它们,但集中化将有助于解决这些问题.
但是,代码如下:
Messages.Add(sMsgText1 + '' + sName + '' + sMsgText2 + '' + sFullPath)
Run Code Online (Sandbox Code Playgroud)
是不是比喜欢代码更好:
Messages.Add('The voucher was NOT sent to ' + sName+
' because the application is in TEST MODE.');
Run Code Online (Sandbox Code Playgroud)
你已经变成一个混乱,但可读的函数调用到一个混乱和联合国可读的函数调用.使用旧代码(上面的第二个代码段),您可以阅读代码并大致了解消息的内容,因为很多内容都在文本中.使用新代码,你不能.
其次,移动字符串以将相关项目保持在一起并使其更容易更改的原因.如果你想改变上面的消息,而不是在路径'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.');
Run Code Online (Sandbox Code Playgroud)
有一个功能:
Messages.ItemNotFound(sFile, sPath);
...
Messages.ItemNotFound(sFileName, sURL);
Run Code Online (Sandbox Code Playgroud)
你得到:
ItemNotFount(item, path),导致的消息听起来不错 :)
我认为将所有字符串常量移动到一个单元是很有意义的.它使文本更容易更改,特别是如果您想要翻译成其他(人类)语言.
但是不是字符串,为什么不做我通常做的事情,即使用resourcestring.这样,您的字符串可以由其他人使用资源编辑器进行更改,而无需重新编译.
unit Strings;
resourcestring
strMsgText1 = 'The voucher was NOT sent to ';
etc...
Run Code Online (Sandbox Code Playgroud)
但是这样的字符串可能做得更好:
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';
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,在某些语言中,这种替换的位置和顺序是不同的.这样,翻译人员可以在任何需要的地方放置参数.当然,应用程序必须使用Format()来处理字符串:
Messages.Add(Format(strVoucherNotSent, [sName]));
Messages.Add(Format(strVoucherSavedTo, [sFullPath]));
Messages.Add(Format(strVoucherForNHasValueOf, [sName, dblValue]));
Run Code Online (Sandbox Code Playgroud)
如果您想将UI翻译成不同的语言,那么您可以将所有文本放在一个文件中,或者可能是一些专门用于声明字符串常量的文件.
但是,如果您在没有这么强烈动机的情况下进行此更改,那么您可能只是难以阅读您的代码.
一般来说,你必须问这样一个重大重构的好处是什么,如果它们不是不证自明的,那么你可能只是为了改变而改变事物.
| 归档时间: |
|
| 查看次数: |
966 次 |
| 最近记录: |