在Delphi中,我应该关心 "case of "语句的Cyclomatic Complexity吗?

问题描述 投票:0回答:1

我在Delphi 10.3中使用了内置的 "方法毒性指标",在我的代码审查流程中,我有以下方法。

function LoadTagsFromFile(const Filename: String; var Tags: TFileTags; var LastError: Integer): Boolean;
var
    AudioType: TAudioFormat;

begin
    AudioType := ExtToAudioType(ExtractFileExt(FileName));

    case AudioType of
        afApe: Result := LoadApeTags(Filename, Tags, LastError);

        afFlac: Result := LoadFlacTags(Filename, Tags, LastError);

        afMp3: Result := LoadMp3Tags(Filename, Tags, LastError);

        afMp4: Result := LoadMp4Tags(Filename, Tags, LastError);

        afOgg: Result := LoadOggTags(Filename, Tags, LastError);

        afWav: Result := LoadWavTags(Filename, Tags, LastError);

        afWma: Result := LoadWmaTags(Filename, Tags, LastError);

        else
            Result := LoadTags(Filename, Tags, LastError);
    end;
end;

其中一个方法被标记为红色(CC=8,使整体毒性超过1) 但我很困惑,我如何能解决这个特殊情况?我是否应该关心这个例子?

delphi switch-statement cyclomatic-complexity
1个回答
1
投票

对于这个例子,你完全不应该在意,我觉得。首先,每个case语句中的代码清晰易读。任何其他的方法都会使代码变得更加难以理解,而不会有任何性能上的提升,也就是说,你是从磁盘上读取一个文件,你永远无法衡量任何重新制定的case语句与磁盘读取过程相比所产生的性能差异。

另外,由于你使用的是Delphi 10.3,你应该利用记录助手。我会做一个

TAudioFormatHelper = record helper for TAudioFormat
 private
   function LoadApeTags(Filename, Tags, LastError):boolean; 
   ... other Load functions here...
 public 
    procedure LoadTagsFromFile(const Filename: String; var Tags: TFileTags; var LastError: Integer): Boolean;
    procedure SetFromFileName(const FileName:string)     

end

这样你就可以摆脱这些全局类型的方法,并将它们绑定到你的枚举上。

var
  audioFormat:TAudioFormat;
begin
  audioFormat.SetFromFileName(.....)
  audioFormat.LoadTagsFromFIle(.....)

当然,LoadTagsFromFile也可以设置audioFormat枚举,但那是另外一个故事。我只是按照我们的设计,你先根据扩展设置枚举值。

© www.soinside.com 2019 - 2024. All rights reserved.