Qual è il modo migliore per ridurre la complessità ciclomatica durante la convalida dei dati? [chiuso]

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

Domanda

In questo momento sto lavorando a un'applicazione web che riceve una quantità significativa di dati da un database che ha il potenziale per restituire risultati nulli. Quando si passa attraverso la complessità ciclomatica per l'applicazione, un numero di funzioni pesa tra 10 e 30. Nella maggior parte dei casi la maggior parte delle funzioni con i numeri alti ha molte linee simili alle seguenti:

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

Il che mi porta alla mia domanda, qual è il modo migliore per cercare di ridurre questi numeri? In questo momento sto cercando di avere la maggior parte delle funzioni al di sotto di 10.

È stato utile?

Soluzione

Che dire dell'utilizzo di Metodi di estensione .

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

Quindi puoi semplicemente scrivere:

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

Questo si legge senza problemi e riduce la complessità ciclomatica delle tue funzioni.

Altri suggerimenti

Decompone in funzioni, forse qualcosa del genere:

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

Naturalmente puoi estendere la firma delle procedure in modo che " oraData " e "riga" può essere passato come parametro.

La prima domanda è: perché sei "appeso" su CC? È uno strumento per valutare quanto è denso il codice e una regola empirica dovrebbe essere "non troppo alta di un numero cc".

Probabilmente sta colpendo tutti quegli "IF" e fa apparire quel numero - quindi riduci il numero di if chiamando una funzione di avvolgimento che estrae i dati dal set di risultati che gestisce il valore nullo o modifica la query in modo che non ' t restituisce valori null.

Tieni presente che i null forniscono informazioni e non sono inutili. Ad esempio repubblicano o democratico? l'utilizzo di null non indica alcuna scelta.

Hai visto questa domanda ? Sta chiedendo qualcosa di simile (ma penso a un livello più elementare) ... ma ciò significa che le risposte potrebbero non esserci di grande aiuto qui.

Sono assolutamente d'accordo con gli altri suggerimenti qui: se ci sono dichiarazioni ripetute che possono essere ordinatamente raggruppate in funzioni / procedure, questo potrebbe essere un approccio da adottare, purché non si stia semplicemente spostando CC. Non sono sicuro che tu abbia guadagnato troppo se passi da un proc con un CC di 35 a tre proc con CC di 15, 10 e 10. (Non è un brutto primo passo, ma idealmente saresti in grado per semplificare qualcosa su un ambito più ampio per ridurre il CC totale in quell'area del sistema.)

È possibile trasformare il se in una funzione di utilità separata per ridurre il proprio CC. Per gestire i diversi tipi di database (stringa, int ecc.) Potrebbe essere necessario un numero di funzioni o una funzione basata sulla differenziazione dei tipi

Tuttavia, direi che qualsiasi soluzione comporterebbe un codice meno gestibile o leggibile (vale a dire che potresti peggiorare le altre metriche!) e come il QA consentirebbe che passasse secondo questa giustificazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top