我在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) 但我很困惑,我如何能解决这个特殊情况?我是否应该关心这个例子?
对于这个例子,你完全不应该在意,我觉得。首先,每个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枚举,但那是另外一个故事。我只是按照我们的设计,你先根据扩展设置枚举值。