【发布时间】:2016-11-25 17:10:05
【问题描述】:
我正在尝试更改如何使用布尔参数来获得有意义的名称,因此我不需要检查每个方法 True/False 的含义。在此示例中,我使用 True/False:
procedure ProcessData(Param1, Param2: string; CreateOnEmpty: boolean = False);
procedure TForm1.Button1Click(Sender: TObject);
begin
ProcessData(P1, P2, True); // when CreateOnEmpty should be True
ProcessData(P1, P2); // when CreateOnEmpty should be False
ProcessData(P1, P2, False); // when CreateOnEmpty should be False
end;
但在这种情况下,我需要查找 ProcessData 方法以了解 True/False 参数的含义,这样做。
所以,我从这个示例开始,为参数分配有意义的名称:
procedure TForm1.Button2Click(Sender: TObject);
var
vCreateWhenEmpty: boolean;
vDontCreateWhenEmpty: boolean;
begin
// Init control params
vCreateWhenEmpty := True;
vDontCreateWhenEmpty := False;
ProcessData(P1, P2, vCreateWhenEmpty); // When CreateOnEmpty should be True
ProcessData(P1, P2, vDontCreateWhenEmpty); // When CreateOnEmpty should be False
end;
但是,我想避免初始化局部变量并且正在考虑这样的事情:
procedure TForm1.Button3Click(Sender: TObject);
Type
TBoolTrue = Boolean = True; // Init to True and all local vars will be True
TBoolFalse = Boolean = False; // Init to False and all local vars will be False
var
vCreateWhenEmpty: TBoolTrue; // Variable should default to True
vDontCreateWhenEmpty: TBoolFalse; // Variable should default to False
begin
ProcessData(P1, P2, vCreateWhenEmpty); // When CreateOnEmpty should be True
ProcessData(P1, P2, vDontCreateWhenEmpty); // When CreateOnEmpty should be False
end;
所以,我可以跳过分配值 True/False。
我有 100 多个接受布尔参数的方法,因此可以用作参数的 100 多个常量或全局变量听起来有点过头了。
是否有可能以某种方式将布尔类型初始化为 True/False 或使用其他技巧避免初始化局部变量?
编辑:
我在示例中将布尔类型设置为局部类型,我的意思是将它们设置为全局类型,因此它们只在每个方法中设置一次,而不是每次都设置。 所以,这将是全球性的,而不是本地的:
Type
TBoolTrue = Boolean = True; // Init to True and all local vars will be True
TBoolFalse = Boolean = False; // Init to False and all local vars will be False
编辑 2:
我希望问题不会结束,因为答案中有一些很好的建议。所以我的选择是:
全局常量(我最终会得到 100 个新常量)
全局枚举字段(即使我最终会得到 100 个,与 const 一样,如果我添加第三个值,它们可以更轻松地扩展值)
- 本地常量(我喜欢这个很短,每个常量 1 行,它是本地的,而不是全局的)
- 局部变量(每个变量 2 行,定义和初始值 - 太多)
- 本地枚举字段(我喜欢这个,因为它可以使用第三个或第四个值进行扩展...)
- Sir Rufo 的自动初始化记录示例(虽然有点过头,但正是我想要的;不幸的是,这是一个真正过头的实现;性能可能会受到影响,但有可用的解决方案 - 很好)李>
- 保持原样并依靠代码洞察力快速了解参数 - 不幸的是,在 XE7 中不稳定且无法依赖;也许在较新的版本中会更好,但从对较新版本的反馈来看,我怀疑它是否会按预期工作。
决定
尽管 Rufo 爵士关于如何做我所想的事情的技巧是独一无二的,但我意识到我正在尝试实现当前 Delphi 版本所不具备的东西。因此,我将使用 const 和枚举类型的组合,并且只在真正需要的地方应用,而不是在任何地方应用,并且将避免使用 100 多个全局、局部变量。
【问题讨论】:
-
坏主意。显式代码将更易于维护。
-
你在问是否可以初始化一些东西,这样你就可以避免初始化它。嗯?
-
@RobKennedy 是:初始化全局值一次,并用局部变量引用这个值。
-
为什么不制作像 const vCreateWhenEmpty 这样的本地类型常量:Boolean = True。它将位于数据段中,而不是堆栈中,并且您仍然可以仅在本地访问它,而不会像下面的回答那样浪费全局空间。
-
@ZENsan:全局范围的建议是基于它们将在多个地方使用的理解。如果没有,局部常量可以正常工作。
标签: delphi boolean delphi-xe7