Sonarlint 被误导了?它在中等方法上找到了 55 的认知复杂度

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

SonarLint 警告我: 重构此方法以将其认知复杂度从 55 降低到允许的 15。

但是那个方法肯定没有那么多语句:

public Dataset<Row> rowEtablissements(SparkSession session, int anneeCOG, int anneeSIRENE, boolean actifsSeulement, boolean communesValides) throws TechniqueException {
   Dataset<Row> etablissements = loadFromStore(session, "{0}_{1,number,#0}_{2}_{3}", "etablissements", anneeSIRENE, actifsSeulement, communesValides);

   if (etablissements != null) {
      return etablissements;
   }

   LOGGER.info("Consitution du dataset des établissements, année (SIRENE) : {}, année COG : {}, actifs seulement: {}, restreintes aux communes valides : {}",
         anneeSIRENE, anneeCOG, actifsSeulement, communesValides);

   Map<String, Integer> indexs = new HashMap<>();

   etablissements = etablissementsNonFiltres(session, anneeSIRENE).filter((FilterFunction<Row>)etablissement -> validationEtablissement(etablissement, actifsSeulement, indexs));
      
   // Si le filtrage par communes valides a été demandé, l'appliquer.
   if (communesValides) {
      Dataset<Row> communes = this.cogDataset.rowCommunes(session, anneeCOG);
         
      etablissements = etablissements
         .join(communes, etablissements.col("codeCommune").equalTo(communes.col("codeCommune")), "left_outer")
         .drop(communes.col("codeCommune"))
         .drop(etablissements.col("nomCommune"))
            
         .filter((FilterFunction<Row>)etablissement -> {
            String nomCommune = getString(indexs, etablissement, "nomCommune");
            String codeCommune = getString(indexs, etablissement, "codeCommune");
              
            if (StringUtils.isBlank(nomCommune)) {
               // Déterminer si nous sommes face à un établissement implanté à l'étranger.
               String nomCommuneEtrangere = etablissement.getAs("nomCommuneEtrangere");
               String paysEtranger = etablissement.getAs("nomPaysEtranger");
               String nomCommuneEtrangereSecondaire = etablissement.getAs("nomCommuneEtrangereSecondaire");
               String paysEtrangerSecondaire = etablissement.getAs("nomPaysEtrangerSecondaire");
               String codeCommuneSecondaire = etablissement.getAs("codeCommuneSecondaire");
               String nomCommuneSecondaire = etablissement.getAs("nomCommuneSecondaire");
                  
               if (StringUtils.isNotBlank(nomCommuneEtrangere) || StringUtils.isNotBlank(paysEtranger)) {
                  debug("anomalie.etablissement_code_commune_etrangere", anneeSIRENE, nomCommuneEtrangere != null ? nomCommuneEtrangere : "non précisée", paysEtranger, etablissement.getAs("siret"));
                     
                  if (codeCommuneSecondaire != null) {
                     LOGGER.error("Il y a une commune secondaire {} - {} sur un établissement ayant une adresse étrangère, non exploitée.", codeCommuneSecondaire, nomCommuneSecondaire);
                  }
               }
               else {
                  if (StringUtils.isNotBlank(nomCommuneEtrangereSecondaire) || StringUtils.isNotBlank(paysEtrangerSecondaire)) {
                     debug("anomalie.etablissement_code_commune_etrangere", anneeSIRENE, nomCommuneEtrangereSecondaire != null ? nomCommuneEtrangereSecondaire : "non précisée", paysEtrangerSecondaire, etablissement.getAs("siret"));
                        
                     if (codeCommuneSecondaire != null) {
                        LOGGER.error("Il y a une commune secondaire {} - {} sur un établissement ayant une adresse étrangère, non exploitée.", codeCommuneSecondaire, nomCommuneSecondaire);
                     }
                  }
                  else {
                     // Les établissements des Antilles ou des collectivités d'outre-mer ne peuvent pas être retenus parce que leurs communes ne sont pas dans le maillage communal INSEE.
                     // Mais si cette commune que l'on a pas trouvée n'en est pas une, c'est une anomalie que l'on rapporte.
                     if (new CodeCommune(codeCommune).isCollectiviteOutremer() == false) {
                        warn("anomalie.etablissement_code_commune_inconnu", anneeSIRENE, codeCommune != null ? codeCommune : "<Non défini>", anneeCOG, etablissement.getAs("siret"));
                     }
                  }
               }
                  
               return false;
            }
               
            return true;
         });
      }
      else {
         etablissements = etablissements.withColumn("codeDepartement", substring(col("codeCommune"), 1, 2));
      }

      // Associer les libellés des codes APE/NAF.
      Dataset<Row> nomenclatureNAF = this.nafDataset.rowNomenclatureNAF(session, anneeSIRENE);
      etablissements = etablissements.join(nomenclatureNAF, etablissements.col("activitePrincipale").equalTo(nomenclatureNAF.col("codeNAF")) , "left_outer")
         .drop("codeNAF", "niveauNAF");
      
      etablissements = etablissements.repartition(col("codeDepartement"));
      etablissements = etablissements.sortWithinPartitions(col("siret"));
      etablissements = etablissements.persist();
      
      if (saveToStore(etablissements, new String[] {"codeDepartement"}, "{0}_{1,number,#0}_{2}_{3}", "etablissements", anneeSIRENE, actifsSeulement, communesValides)) {
      LOGGER.info("Le dataset des établissements, année (SIRENE) : {}, année COG : {}, actifs seulement: {}, restreintes aux communes valides : {} est prêt et stocké.",
         anneeSIRENE, anneeCOG, actifsSeulement, communesValides);
   }
      
   return etablissements;
}

为什么会被误导?


我明白你的反应。但是55已经意味着非常大的数量或陈述或条件。

然后我在另一个子方法中提取了该方法的一部分。

private Dataset<Row> restreindreAuxCommunesValides(SparkSession session, Dataset<Row> etablissements, int anneeCOG, int anneeSIRENE, Map<String, Integer> indexs) {
   Dataset<Row> communes = this.cogDataset.rowCommunes(session, anneeCOG);

   return etablissements
      .join(communes, etablissements.col("codeCommune").equalTo(communes.col("codeCommune")), "left_outer")
      .drop(communes.col("codeCommune"))
      .drop(etablissements.col("nomCommune"))

      .filter((FilterFunction<Row>)etablissement -> {
         String nomCommune = getString(indexs, etablissement, "nomCommune");
         String codeCommune = getString(indexs, etablissement, "codeCommune");

         if (StringUtils.isBlank(nomCommune)) {
            // Déterminer si nous sommes face à un établissement implanté à l'étranger.
            String nomCommuneEtrangere = etablissement.getAs("nomCommuneEtrangere");
            String paysEtranger = etablissement.getAs("nomPaysEtranger");
            String nomCommuneEtrangereSecondaire = etablissement.getAs("nomCommuneEtrangereSecondaire");
            String paysEtrangerSecondaire = etablissement.getAs("nomPaysEtrangerSecondaire");
            String codeCommuneSecondaire = etablissement.getAs("codeCommuneSecondaire");
            String nomCommuneSecondaire = etablissement.getAs("nomCommuneSecondaire");

            if (StringUtils.isNotBlank(nomCommuneEtrangere) || StringUtils.isNotBlank(paysEtranger)) {
               debug("anomalie.etablissement_code_commune_etrangere", anneeSIRENE, nomCommuneEtrangere != null ? nomCommuneEtrangere : "non précisée", paysEtranger, etablissement.getAs("siret"));

               if (codeCommuneSecondaire != null) {
                  LOGGER.error("Il y a une commune secondaire {} - {} sur un établissement ayant une adresse étrangère, non exploitée.", codeCommuneSecondaire, nomCommuneSecondaire);
               }
            }
            else {
               if (StringUtils.isNotBlank(nomCommuneEtrangereSecondaire) || StringUtils.isNotBlank(paysEtrangerSecondaire)) {
                  debug("anomalie.etablissement_code_commune_etrangere", anneeSIRENE, nomCommuneEtrangereSecondaire != null ? nomCommuneEtrangereSecondaire : "non précisée", paysEtrangerSecondaire, etablissement.getAs("siret"));

                  if (codeCommuneSecondaire != null) {
                     LOGGER.error("Il y a une commune secondaire {} - {} sur un établissement ayant une adresse étrangère, non exploitée.", codeCommuneSecondaire, nomCommuneSecondaire);
                  }
               }
               else {
                  // Les établissements des Antilles ou des collectivités d'outre-mer ne peuvent pas être retenus parce que leurs communes ne sont pas dans le maillage communal INSEE.
                  // Mais si cette commune que l'on a pas trouvée n'en est pas une, c'est une anomalie que l'on rapporte.
                  if (new CodeCommune(codeCommune).isCollectiviteOutremer() == false) {
                     warn("anomalie.etablissement_code_commune_inconnu", anneeSIRENE, codeCommune != null ? codeCommune : "<Non défini>", anneeCOG, etablissement.getAs("siret"));
                  }
               }
            }

            return false;
         }

         return true;
      });
}

然而,这种新方法被 SonarLint 谴责,CC 仍然是 42。

然后我从中提取了另一部分:

private boolean isCommuneValide(Row etablissement, int anneeCOG, int anneeSIRENE, Map<String, Integer> indexs) {
   String nomCommune = getString(indexs, etablissement, "nomCommune");
   String codeCommune = getString(indexs, etablissement, "codeCommune");

   if (StringUtils.isBlank(nomCommune)) {
      // Déterminer si nous sommes face à un établissement implanté à l'étranger.
      String nomCommuneEtrangere = etablissement.getAs("nomCommuneEtrangere");
      String paysEtranger = etablissement.getAs("nomPaysEtranger");
      String nomCommuneEtrangereSecondaire = etablissement.getAs("nomCommuneEtrangereSecondaire");
      String paysEtrangerSecondaire = etablissement.getAs("nomPaysEtrangerSecondaire");
      String codeCommuneSecondaire = etablissement.getAs("codeCommuneSecondaire");
      String nomCommuneSecondaire = etablissement.getAs("nomCommuneSecondaire");

      if (StringUtils.isNotBlank(nomCommuneEtrangere) || StringUtils.isNotBlank(paysEtranger)) {
         debug("anomalie.etablissement_code_commune_etrangere", anneeSIRENE, nomCommuneEtrangere != null ? nomCommuneEtrangere : "non précisée", paysEtranger, etablissement.getAs("siret"));

         if (codeCommuneSecondaire != null) {
            LOGGER.error("Il y a une commune secondaire {} - {} sur un établissement ayant une adresse étrangère, non exploitée.", codeCommuneSecondaire, nomCommuneSecondaire);
         }
      }
      else {
         if (StringUtils.isNotBlank(nomCommuneEtrangereSecondaire) || StringUtils.isNotBlank(paysEtrangerSecondaire)) {
            debug("anomalie.etablissement_code_commune_etrangere", anneeSIRENE, nomCommuneEtrangereSecondaire != null ? nomCommuneEtrangereSecondaire : "non précisée", paysEtrangerSecondaire, etablissement.getAs("siret"));

            if (codeCommuneSecondaire != null) {
               LOGGER.error("Il y a une commune secondaire {} - {} sur un établissement ayant une adresse étrangère, non exploitée.", codeCommuneSecondaire, nomCommuneSecondaire);
            }
         }
         else {
            // Les établissements des Antilles ou des collectivités d'outre-mer ne peuvent pas être retenus parce que leurs communes ne sont pas dans le maillage communal INSEE.
            // Mais si cette commune que l'on a pas trouvée n'en est pas une, c'est une anomalie que l'on rapporte.
            if (new CodeCommune(codeCommune).isCollectiviteOutremer() == false) {
               warn("anomalie.etablissement_code_commune_inconnu", anneeSIRENE, codeCommune != null ? codeCommune : "<Non défini>", anneeCOG, etablissement.getAs("siret"));
            }
         }
      }

      return false;
   }

   return true;
}

但这一个还有 33 CC.

我改成了:

if (StringUtils.isNotBlank(nomCommune)) {
      return true;
}

在它的开头。 => CC = 25

我在该方法末尾的

if
-
else
序列是造成所有混乱的原因。谢谢!

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