Pregunta

Ahora mismo estoy trabajando en una aplicación web que recibe una cantidad significativa de datos de una base de datos que tiene el potencial de devolver resultados nulos. Al pasar por la complejidad ciclomática de la aplicación, una cantidad de funciones pesan entre 10 y 30. En su mayor parte, la mayoría de las funciones con números altos tienen muchas líneas similares a las siguientes:

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

Lo que me lleva a mi pregunta, ¿cuál es la mejor manera de tratar de reducir estos números? En este momento estoy buscando tener la mayoría de las funciones por debajo de 10.

¿Fue útil?

Solución

¿Qué pasa con el uso de Métodos de extensión .

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

Entonces simplemente puedes escribir:

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

Esto se lee sin problemas y reduce la complejidad ciclomática en sus funciones.

Otros consejos

Descomponerse en funciones, tal vez algo como esto:

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

Por supuesto, puede extender la firma de procedimientos para que " oraData " y " fila " Se puede pasar como parámetros.

La primera pregunta es: ¿Por qué estás " colgado " arriba en CC? Es una herramienta para evaluar qué tan denso es el código y una regla empírica no debe ser " no muy alta de un número cc " ;.

Probablemente esté afectando a todos los "IF" y aumente ese número, así que reduzca el número de ifs llamando a una función de ajuste que extrae los datos del conjunto de resultados que maneja el nulo o cambia la consulta para que no lo haga. devuelve nulos.

Tenga en cuenta que los valores nulos proporcionan información y no son inútiles. ¿Por ejemplo republicano o demócrata? el uso de null no dice ninguna opción.

¿Vio esta pregunta ? Está preguntando algo similar (pero creo que en un nivel más básico) ... pero eso significa que las respuestas no pueden ser de mucha ayuda aquí.

Definitivamente estoy de acuerdo con las otras sugerencias aquí: si hay declaraciones repetidas que se pueden empaquetar cuidadosamente en funciones / procedimientos, ese podría ser un enfoque a seguir, siempre y cuando no solo esté cambiando el CC. No estoy seguro de que hayas ganado demasiado si pasas de un proceso con un CC de 35 a tres procesos con CC de 15, 10 y 10. (No es un mal primer paso, pero lo ideal sería que pudieras para simplificar algo en un ámbito más amplio para reducir el CC total en esa área de su sistema.)

Es posible refactorizar si en una función de utilidad separada para reducir su CC. Es posible que se requiera una serie de funciones o una función basada en la diferenciación de tipos para manejar los diferentes tipos de base de datos (cadena, int, etc.)

Sin embargo, yo argumentaría que cualquier solución daría como resultado un código menos mantenible o legible (es decir, ¡podría empeorar otras métricas!) y como QA permitiría que se aprobara de acuerdo con esta justificación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top