if else重复代码逻辑 - 不需要的

时间:2017-03-13 15:27:43

标签: delphi

我有三个来自数据库的值

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原则。 知道如何改进我的代码。

2 个答案:

答案 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进行比较(应始终将评估视为不同)。