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
序列是造成所有混乱的原因。谢谢!