コード分析結果によると、次の警告メッセージが表示されます。
CA1502 過度の複雑さを回避 'METHOD()' の循環的複雑度は 27 です。メソッドを書き直すかリファクタリングして、複雑さを 25 に減らします。
BusinessServices ReportService.cs 310
循環的複雑度とは何ですか?これを解決する方法は?
コード分析結果によると、次の警告メッセージが表示されます。
CA1502 過度の複雑さを回避 'METHOD()' の循環的複雑度は 27 です。メソッドを書き直すかリファクタリングして、複雑さを 25 に減らします。
BusinessServices ReportService.cs 310
循環的複雑度とは何ですか?これを解決する方法は?
ウィキペディアから:
ソース コードのセクションの循環的複雑度は、ソース コード内の線形に独立したパスの数です。たとえば、ソース コードに IF ステートメントや FOR ループなどの決定ポイントが含まれていない場合、複雑度は 1 になります。これは、コード内のパスが 1 つしかないためです。コードに 1 つの条件を含む 1 つの IF ステートメントがある場合、コードには 2 つのパスが存在します。1 つのパスでは IF ステートメントが TRUE として評価され、もう 1 つのパスでは IF ステートメントが FALSE として評価されます。
これを解決する最も簡単な方法は、メソッドを 2 つ以上の小さなメソッドに分割することです。Visual Studio の組み込みのリファクタリング ツール ( などRefactor -> Extract Method
) を使用して、コードの選択した部分を別のメソッドに抽出できます。
CA1502 はバイナリ アナライザーです。場合によっては、コードがそれほど複雑でないか、分解できないことがあります。CA1502 警告が発生した例を次に示します。
public class Mapping : Profile
{
[SuppressMessage("Microsoft.Maintainability", "CA1502"]
public Mapping()
{
CreateMap<ItemInstance, ManifestRecords>()
.ForMember(dest => dest.SomeProperty1, opt => opt.MapFrom(src => src.SomeProperty1))
.ForMember(dest => dest.SomeProperty2, opt => opt.MapFrom(src => src.SomeProperty2))
.ForMember(dest => dest.SomeProperty3, opt => opt.MapFrom(src => src.SomeProperty3))
.ForMember(dest => dest.SomeProperty4, opt => opt.MapFrom(src => src.SomeProperty4))
.ForMember(dest => dest.SomeProperty5, opt => opt.MapFrom(src => src.SomeProperty5))
.ForMember(dest => dest.SomeProperty6, opt => opt.MapFrom(src => src.SomeProperty6))
.ForMember(dest => dest.SomeProperty7, opt => opt.MapFrom(src => src.SomeProperty7))
.ForMember(dest => dest.SomeProperty8, opt => opt.MapFrom(src => src.SomeProperty8))
.ForMember(dest => dest.SomeProperty9, opt => opt.MapFrom(src => src.SomeProperty9))
.ForMember(dest => dest.SomeProperty10, opt => opt.MapFrom(src => src.SomeProperty10))
.ForMember(dest => dest.SomeProperty11, opt => opt.MapFrom(src => src.SomeProperty11))
.ForMember(dest => dest.SomeProperty12, opt => opt.MapFrom(src => src.SomeProperty12))
.ForMember(dest => dest.SomeProperty13, opt => opt.MapFrom(src => src.SomeProperty13))
.ForMember(dest => dest.SomeProperty14, opt => opt.MapFrom(src => src.SomeProperty14))
.ForMember(dest => dest.SomeProperty15, opt => opt.MapFrom(src => src.SomeProperty15))
.ForMember(dest => dest.SomeProperty16, opt => opt.MapFrom(src => src.SomeProperty16));
}
}
私が AutoMapper を使用していることがわかります。コンパイルされたバイナリ表現には存在する可能性がありますが、ソース コードには実際には循環的複雑性はありません。
次の属性を使用して警告を抑制することができます。
[SuppressMessage("Microsoft.Maintainability", "CA1502"]