Pergunta

Agora eu estou trabalhando em uma aplicação web que recebe uma quantidade significativa de dados de um banco de dados que tem um potencial para retornar resultados nulos. Ao atravessar a complexidade ciclomática para a aplicação de uma série de funções estão pesando entre 10 - 30. Para a maior parte a maioria das funções com os números elevados tem um monte de linhas semelhante à seguinte:

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

O que me leva à minha pergunta, qual é a melhor maneira de ir sobre a tentativa de trazer esses números para baixo? Agora eu estou olhando para ter a maioria das funções abaixo de 10.

Foi útil?

Solução

Que tal usar Métodos de extensão .

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

Em seguida, você pode simplesmente escrever:

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

Isto lê sem problemas e reduz a complexidade ciclomática em suas funções.

Outras dicas

decompor-se em funções, talvez algo como isto:

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

Claro que você pode estender a assinatura procedimentos para que "oradata" e "linha" pode passados ??como parâmetros.

A primeira pergunta é: Por que você está "pendurado" em cima CC? É uma ferramenta para avaliar quão denso o código é e uma regra de ouro deve ser "não muito alto de um número cc".

É provavelmente bater todos aqueles "SE" s e trazendo esse número - para reduzir o número de ifs chamando uma função envoltório que extrai os dados do conjunto de resultados que lida com o nulo ou alterar a consulta para que ele não faz nulos retorno.

Tenha em mente que nulos não fornecer informações e não são inúteis. Por exemplo republicano ou democrata? usando nulo diz nem escolha.

Você viu esta questão ? Ele está pedindo algo semelhante (mas eu acho que em um nível mais básico) ... mas então isso significa que as respostas não pode ser de muita ajuda aqui.

Eu definitivamente concordo com os outros sugestões aqui: se não são repetidas declarações de que pode ser perfeitamente embalados em funções / procedimentos, que podem ser uma abordagem para levar, contanto que você não está apenas mudando CC ao redor. Eu não estou certo de que você ganhou muito se você se mover de um proc com uma CC de 35 a três procs com CCs de 15, 10 e 10. (Não é um primeiro passo ruim, mas o ideal é que você seria capaz a algo simplificar em um escopo maior para reduzir CC total nessa área do seu sistema.)

É possível refatorar o se em uma função separado utilitário para reduzir o seu CC. Um certo número de funções ou uma função depender do tipo de diferenciação pode ser necessária para lidar com os diferentes tipos de bases de dados (cadeia, int etc ..)

No entanto, eu diria que qualquer solução resultaria em código menos sustentável ou legível (ou seja, você pode piorar outras métricas!) E teria como QA permitir que passe de acordo com esta justificação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top