GGo*_*haA 3 c# sonarqube .net-core
我在降低给定代码片段的认知复杂性方面遇到了很大的麻烦。您能否提供一些有关如何解决此问题的提示?我可以使用switch将其从 24 减少到 16 ,但它仍然是 16,我没有其他选择
protected override bool Compare(object valueToValidate, object valueToCompare)
{
if (RaUtils.IsBlankValue(valueToValidate) || RaUtils.IsBlankValue(valueToCompare))
{
return true;
}
switch (Type.GetTypeCode(valueToCompare.GetType()))
{
case TypeCode.DateTime:
if (DateTime.TryParse(valueToValidate.ToString(), out var valueToValidateDt)
&& DateTime.TryParse(valueToCompare.ToString(), out var valueToCompareDt))
{
return valueToValidateDt >= valueToCompareDt;
}
break;
case TypeCode.Double:
if (double.TryParse(valueToValidate.ToString(), out var valueToValidateDouble)
&& double.TryParse(valueToCompare.ToString(), out var valueToCompareDouble))
{
return valueToValidateDouble >= valueToCompareDouble;
}
break;
case TypeCode.Decimal:
if (decimal.TryParse(valueToValidate.ToString(), out var valueToValidateDecimal)
&& decimal.TryParse(valueToCompare.ToString(), out var valueToCompareDecimal))
{
return valueToValidateDecimal >= valueToCompareDecimal;
}
break;
case TypeCode.Int32:
if (int.TryParse(valueToValidate.ToString(), out var valueToValidateInt32)
&& int.TryParse(valueToCompare.ToString(), out var valueToCompareInt32))
{
return valueToValidateInt32 >= valueToCompareInt32;
}
break;
case TypeCode.Int64:
if (long.TryParse(valueToValidate.ToString(), out var valueToValidateInt64)
&& long.TryParse(valueToCompare.ToString(), out var valueToCompareInt64))
{
return valueToValidateInt64 >= valueToCompareInt64;
}
break;
default: throw new NotImplementedException();
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
您可以尝试将块内的代码移动case到它们自己的方法中:
private bool CompareDateTime(string value1, string value2)
{
if (DateTime.TryParse(value1, out var valueToValidateDt)
&& DateTime.TryParse(value2, out var valueToCompareDt))
{
return valueToValidateDt >= valueToCompareDt;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
你Comapre会简化成这样:
protected override bool Compare(object valueToValidate, object valueToCompare)
{
if (RaUtils.IsBlankValue(valueToValidate) || RaUtils.IsBlankValue(valueToCompare))
{
return true;
}
switch (Type.GetTypeCode(valueToCompare.GetType()))
{
case TypeCode.DateTime:
return CompareDateTime(valueToValidate.ToString(), valueToCompare.ToString());
case TypeCode.Double:
return CompareDouble(valueToValidate.ToString(), valueToCompare.ToString());
case TypeCode.Decimal:
return CompareDecimal(valueToValidate.ToString(), valueToCompare.ToString());
case TypeCode.Int32:
return CompareInt32(valueToValidate.ToString(), valueToCompare.ToString());
case TypeCode.Int64:
return CompareInt64(valueToValidate.ToString(), valueToCompare.ToString());
default: throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
由于所有方法都具有相同的签名,因此您还可以使用 aDictionary<TypeCode,Func<string,string,bool>>代替 switch 块:
protected override bool Compare(object valueToValidate, object valueToCompare)
{
if (RaUtils.IsBlankValue(valueToValidate) || RaUtils.IsBlankValue(valueToCompare))
{
return true;
}
var methods = new Dictionary<TypeCode,Func<string,string,bool>>
{
{ TypeCode.DateTime, CompareDateTime },
{ TypeCode.Double, CompareDouble },
{ TypeCode.Decimal, CompareDecimal },
{ TypeCode.Int32, CompareInt32 },
{ TypeCode.Int64, CompareInt64 }
};
if(methods.TryGetValue(Type.GetTypeCode(valueToCompare.GetType()), out var method))
{
return method.Invoke(valueToValidate.ToString(), valueToCompare.ToString());
}
else
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |