我有三个来自数据库的值
a, b, c : Integer
,其中
其中一个可以是<>空值 其他两个必须为null
到目前为止我的代码是:
var
a, b, c: Integer;
begin
if ((a <> null) and (b = null) and (c = null)) then
begin
Label1.Caption := 'hard coded value';
Label2.Caption := ClientDataSet field value;
Label3.Caption := 'hard coded value';
end;
if ((a = null) and (b <> null) and (c = null)) then
begin
Label1.Caption := ClientDataSet field value;
Label2.Caption := 'hard coded value';
Label3.Caption := 'hard coded value';
end;
if ((a = null) and (b = null) and (c <> null)) then
begin
Label1.Caption := 'hard coded value';
Label2.Caption := ClientDataSet field value;
Label3.Caption := '';
end;
某些标签标题是ClientDataSet字段值,其他标准字符串只是硬编码。
问题是这违反了DRY原则。 知道如何改进我的代码。
答案 0 :(得分:3)
不确定它是否违反DRY原则 - 所有目标块都不同。你可以简化它(实际上有很多不同的方式)。一种方法是将逻辑从头开始,并从标签的角度看待它。像这样:
if b = null then Label1.Caption := 'hard coded value' else Label1.Caption := ClientDataSetFieldValue;
if a = null then Label2.Caption := 'hard coded value' else Label2.Caption := ClientDataSetFieldValue;
if c = null then Label3.Caption := 'hard coded value' else Label3.Caption := '';
现在这确实违反了DRY原则,因此我们可以创建一个采用TLabel,字段和valueIfNotNull字符串的过程 - 就像这样
procedure SetLabel( ALabel : TLabel; AValue ; AValue : integer; NonNullValue : string );
begin
if AValue = null then ALabel.Caption := 'hard coded value' else ALabel.Caption := NonNullString;
end;
然后我们可以写
SetLabel( Label1, b, ClientDataSetFieldValue);
SetLabel( Label2, a, ClientDataSetFieldValue);
SetLabel( Label3, c, '' );
不确定有多少改进,以防万一。
答案 1 :(得分:0)
假设给定标签的所有“硬编码值”都相同,则一个选项是
iCount := Ord(a <> null) +
Ord(b <> null) +
Ord(c <> null);
if iCount = 1 then
begin
Label1.Caption := IfThen(b <> null, ClienDatasetField.Value, 'hard coded value');
Label2.Caption := IfThen(b = null, ClienDatasetField.Value, 'hard coded value');
Label3.Caption := IfThen(c = null, 'hard coded value', '');
end;
如果“硬编码值”不同,那么你可以这样做:
iCount := Ord(a <> null) +
Ord(b <> null) +
Ord(c <> null);
if iCount = 1 then
begin
if (a <> null) then
begin
Label1.Caption := 'hard coded value';
Label2.Caption := ClientDataSet field value;
Label3.Caption := 'hard coded value';
end else if (b <> null) then
begin
Label1.Caption := ClientDataSet field value;
Label2.Caption := 'hard coded value';
Label3.Caption := 'hard coded value';
end else if c <> null then
begin
Label1.Caption := 'hard coded value';
Label2.Caption := ClientDataSet field value;
Label3.Caption := '';
end;
end;
可能还有很多简化代码的方法。
现在,您的代码的真正问题可能是将整数变量与null进行比较(应始终将评估视为不同)。