Quel est le meilleur moyen de réduire la complexité cyclomatique lors de la validation des données? [fermé]

StackOverflow https://stackoverflow.com/questions/204742

Question

Je travaille actuellement sur une application Web qui reçoit une quantité importante de données d'une base de données susceptible de renvoyer des résultats nuls. Lorsque vous parcourez la complexité cyclomatique de l'application, un certain nombre de fonctions pèsent entre 10 et 30. La plupart des fonctions avec des nombres élevés ont beaucoup de lignes similaires au suivant:

If Not oraData.IsDBNull(4) Then row("Field") = oraData.GetString(4)

Ce qui m'amène à ma question: quelle est la meilleure façon de réduire ces chiffres? À l'heure actuelle, la majorité des fonctions sont inférieures à 10, je pense.

Était-ce utile?

La solution

Qu'en est-il des méthodes d'extension .

Imports System.Runtime.CompilerServices

Module Extensions

    <Extension()> _
    Public Function TryGetString(ByVal row As IDataRecord, i As Integer) As String
        If row.IsDBNull(i) Then
            Return null
        End If
        Return row.GetString(i);
    End Function

End Module

Ensuite, vous pouvez simplement écrire:

row("Field") = oraData.TryGetString(4)

Cela se lit bien et réduit la complexité cyclomatique de vos fonctions.

Autres conseils

Décomposez en fonctions, peut-être quelque chose comme ceci:

//Object Pascal
procedure UpdateIfNotNull( const fldName: String; fldIndex : integer );
begin
  if oraData.IsDBNull( fldIndex ) then
    row( fldName ) := oraData.GetString(fldIndex);
end;

Vous pouvez bien entendu étendre la signature des procédures de manière à ce que "oraData". et " rangée " peut être passé en paramètre.

La première question est la suivante: pourquoi êtes-vous "bloqué"? sur CC? C’est un outil pour évaluer la densité du code et une règle empirique devrait être «pas trop élevé d’un nombre cc».

Il frappe probablement tous ces "SI" et affiche ce nombre. Réduisez donc le nombre de if en appelant une fonction wrap qui extrait les données du jeu de résultats qui gère le caractère NULL ou modifie la requête pour le supprimer. t renvoie les valeurs NULL.

N'oubliez pas que les valeurs NULL fournissent des informations et ne sont pas inutiles. Par exemple républicain ou démocrate? l'utilisation de null ne dit ni choix.

Avez-vous vu cette question ? Il demande quelque chose de similaire (mais je pense à un niveau plus fondamental) ... mais alors cela signifie que les réponses ne seront peut-être pas très utiles ici.

Je suis tout à fait d’accord avec les autres suggestions suivantes: s’il existe des déclarations répétées qui peuvent être soigneusement intégrées aux fonctions / procédures, il s’agit peut-être d’une approche à adopter, à condition que vous ne déplaciez pas simplement CC. Je ne suis pas sûr que vous ayez trop gagné si vous passiez d'un processus avec un CC de 35 à trois avec des CC de 15, 10 et 10. (Ce n'est pas une mauvaise première étape, mais idéalement, vous seriez capable pour simplifier quelque chose sur une plus grande portée afin de réduire le CC total dans cette zone de votre système.)

Il est possible de reformuler if dans une fonction utilitaire distincte afin de réduire votre CC. Un certain nombre de fonctions ou une fonction reposant sur la différenciation des types peut être nécessaire pour gérer les différents types de base de données (chaîne, int, etc.)

Cependant, je dirais que toute solution résulterait en un code moins facilement maintenable ou lisible (par exemple, vous pourriez aggraver d'autres métriques!) et le laisserait à l'AQ le laisser passer selon cette justification.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top