【问题标题】:Sonarqube reporting duplicate code block on controller actionsSonarqube 报告控制器操作的重复代码块
【发布时间】:2020-08-12 15:34:56
【问题描述】:

我正在使用 SonarQube 分析我的 .NET Core 应用程序,它现在报告以下两个控制器操作的重复块:从查询字符串获得的三个参数和 ParametersHelper.ProcessAndSanitizeSee2InputParams 的调用,如图所示。

静态方法调用会清理每个参数 - 空值检查、修剪和自定义逻辑 - 并将它们分组到字典中。

关于如何重构这些操作以避免触发 SonarQube 的重复代码检测的任何提示?

// comments omitted
[HttpGet("{seasonKey}")]
[ProducesResponseType(typeof(See2Season), 200)]
public async Task<IActionResult> GetSeasonByKeyAsync(
    string seasonKey,
    [FromQuery(Name = "provider")] string providers,
    [FromQuery(Name = "lang")] string languages,
    [FromQuery(Name = "priority")] string priority)
{
    var sanitizedSee2Params = ParametersHelper.ProcessAndSanitizeSee2InputParams(
        this._logger,
        true,
        new KeyValuePair<string, string>(InputParameterNames.PROVIDERS, providers),
        new KeyValuePair<string, string>(InputParameterNames.LANGUAGE, languages),
        new KeyValuePair<string, string>(InputParameterNames.PRIORITY, priority));

    var result = await this._seasonManager.GetSeasonByKeyAsync(
        seasonKey,
        sanitizedSee2Params).ConfigureAwait(false); 

    return this.Ok(result);
}

// comments omitted
[HttpGet("{seasonKey}/children")]
[ProducesResponseType(typeof(IEnumerable<See2Content>), 200)]
public async Task<IActionResult> GetSeasonChildrenByKeyAsync(
    string seasonKey,
    [FromQuery(Name = "overrideDefaultDirection")] bool overrideDefaultDirection,
    [FromQuery(Name = "provider")] string providers,
    [FromQuery(Name = "lang")] string languages,
    [FromQuery(Name = "priority")] string priority)
{
    var sanitizedSee2Params = ParametersHelper.ProcessAndSanitizeSee2InputParams(
        this._logger,
        true,
        new KeyValuePair<string, string>(InputParameterNames.PROVIDERS, providers),
        new KeyValuePair<string, string>(InputParameterNames.LANGUAGE, languages),
        new KeyValuePair<string, string>(InputParameterNames.PRIORITY, priority));

    var result = await this._seasonManager.GetSeasonChildrenByKeyAsync(
        seasonKey,
        overrideDefaultDirection,
        sanitizedSee2Params).ConfigureAwait(false);

    return this.Ok(result);
}

【问题讨论】:

    标签: c# .net-core sonarqube asp.net-core-webapi code-analysis


    【解决方案1】:

    您无需删除整个重复即可解决此重复问题(克隆)。删除/减少第一个克隆的96-101 行引起的重复应该足够了。您可以考虑将该逻辑提取到单独的方法中。像这样:

    private SanitizedInputParams sanitizeSeasonParams(string providers, string languages, string priority) {
      return ParametersHelper.ProcessAndSanitizeSee2InputParams(
        this._logger,
        true,
        new KeyValuePair<string, string>(InputParameterNames.PROVIDERS, providers),
        new KeyValuePair<string, string>(InputParameterNames.LANGUAGE, languages),
        new KeyValuePair<string, string>(InputParameterNames.PRIORITY, priority));
    }
    

    因此,克隆长度减少,SonarQube 可能不再报告此问题(取决于配置的最小克隆长度)。 或者,您可以考虑增加最小克隆长度以专注于更长、更相关的克隆。另见:https://docs.sonarqube.org/display/SONARQUBE45/Duplications

    【讨论】:

    • 我无法控制 SonarQube 的配置,因此我无法减少最小克隆长度。我最终为所有重复参数创建了一个自定义属性,并且正如您所建议的那样,逻辑现在正在提取到一个私有方法中。谢谢。
    猜你喜欢
    • 2016-11-23
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多