Reducing cyclomatic complexity
I have used radon to detect high cyclomatic complexity spots in iota2.
CC score | Rank | Risk |
---|---|---|
1 - 5 | A | low - simple block |
6 - 10 | B | low - well structured and stable block |
11 - 20 | C | moderate - slightly complex block |
21 - 30 | D | more than moderate - more complex block |
31 - 40 | E | high - complex block, alarming |
41+ | F | very high - error-prone, unstable block |
We have many functions and methods with bad scores (6 in class F, 4 in class E and more than 20 in class D).
We should aim at having scores below 20. This can be achieved by moving if/elif/else blocks, long for loops, etc. to named functions.
Please adopt a function below and make it better!
#487
Class F: dedicated issueiota2/Common/OtbAppBank.py
F 2678:0 train_vector_classifier - F (54)
F 2897:0 train_vector_regression - F (54)
iota2/Common/Tools/CoRegister.py
F 285:0 coregister - F (54)
iota2/VectorTools/PrepareSamplesRegion.py
F 513:0 gestion_echantillons - F (59)
iota2/Sampling/VectorSampler.py
F 438:0 generate_samples_crop_mix - F (43)
iota2/Sensors/SAR/S1Processor.py
F 993:0 S1PreProcess - F (44)
Class E
iota2/Common/OtbAppBank.py
F 1185:0 CreateOrthoRectification - E (31)
F 1818:0 CreateExtractROIApplication - E (31)
iota2/VectorTools/shapeDifference.py
F 180:0 diffBetweenLayersSpeedUp - E (31)
iota2/simplification/zonal_stats.py
F 1127:0 zonal_stats - E (32)
Class D
iota2/Common/OtbAppBank.py
F 519:0 CreateIota2FeatureExtractionApplication - D (28)
F 1986:0 CreatePointMatchCoregistrationModel - D (26)
F 928:0 CreateSampleSelectionApplication - D (24)
F 1732:0 CreateSuperimposeApplication - D (22)
F 1423:0 CreateBinaryMorphologicalOperation - D (21)
iota2/Common/customNumpyFeatures.py
C 36:0 data_container - D (25)
M 38:4 data_container.__init__ - D (24)
iota2/sequence_builders/i2_classification.py
M 458:4 i2_classification.check_compat_param - D (26)
iota2/sequence_builders/i2_obia.py
M 387:4 i2_obia.check_compat_param - D (26)
iota2/Classification/undecision_management.py
F 349:0 undecision_management - D (24)
iota2/configuration_files/read_config_file.py
M 602:4 iota2_parameters.get_available_sensors_dates - D (21)
iota2/Segmentation/prepare_segmentation_obia.py
F 1328:0 intersect_keep_duplicates - D (28)
iota2/VectorTools/CountNbPolByAtt.py
F 27:0 countByAtt - D (22)
iota2/VectorTools/spatialOperations.py
F 34:0 intersectSqlites - D (28)
iota2/Validation/ResultsUtils.py
F 863:0 stats_report - D (23)
F 337:0 fig_conf_mat - D (22)
iota2/Sampling/DimensionalityReduction.py
F 118:0 build_features_lists - D (23)
iota2/Sampling/VectorSampler.py
F 905:0 generate_samples_classif_mix - D (29)
F 1187:0 generate_samples - D (22)
iota2/Steps/IOTA2Step.py
M 822:4 Step.task_launcher - D (21)
iota2/Sensors/SAR/S1FilteringProcessor.py
F 84:0 main - D (28)
iota2/Sensors/SAR/S1Processor.py
M 407:4 Sentinel1_PreProcess.concatenateImage - D (22)
iota2/simplification/nomenclature.py
F 81:0 getClassesFromVectorQML - D (21)
iota2/simplification/ZonalStats.py
F 936:0 zonalstats - D (26)
iota2/simplification/MergeTileRasters.py
F 367:0 tilesRastersMergeVectSimp - D (22)