,

quinta-feira, 18 de abril de 2013

Questão de Certificação - Dia 4

Olá a todos, preparados para o post de hoje sobre Questões de Certificação do CTFL?

Hoje estudaremos um assunto que cai bastante no teste de Certificação, porém é um assunto que poucos conhecem e que até mesmo o Syllabus não menciona, "Complexidade Ciclomática", assunto que por sinal só é possível ter uma teoria no Glossário de Termos de Teste da ISTQB.

A questão que iremos comentar foi retirada do Simulado nº 5 (disponínel em nosso blog, na área de download). Bons estudos.

S5Q7. Ainda com base no pseudocódigo apresentado na questão 5 (segue abaixo), qual a complexidade ciclomática do código?
         a) 2
         b) 3
         c) 4
         d) 5


Pseudocódigo da questão 05:
                      READ A
                      READ B
                      IF B > A THEN
                               MIN = A
                               IF B = 2*A THEN
                                       PRINT “Bingo!”
                               ENDIF
                      ELSE
                               MIN = B
                      ENDIF
                      PRINT MIN

Comentários:
Complexidade ciclomática é uma métrica de software, desenvolvida por Thomas J. McCabe em 1976, que determina a complexidade de um programa estruturado (cíclico). 

A complexidade ciclomática mede a quantidade de caminhos de execução independentes de um código fonte. Por exemplo, se o código fonte não contém estruturas de controle a complexidade é 1, já que há somente caminho válido através do código.  Se o código tiver uma estrutura de seleção contendo uma condição (IF), então há dois caminhos possíveis, uma para quando a condição foi verdadeira e outra para quando a condição for falsa.

A forma mais prática de se avaliar a complexidade ciclomática de um código é convertendo-o a um grafo de fluxo de controle, onde os nós do grafo serão correspondidos a grupos indivisíveis de comando, e as aresta direcionada conecta dois nós (se o segundo comando poder ser executado imediatamente após o primeiro). 

Matematicamente, a complexidade ciclomática é definida com referência ao grafo. Ela é definida pela seguinte formula:

 CC = (A - N) + 2 x C

Onde,
  •  CC é a Complexidade Ciclomática
  •  A é o número de arestas do grafo
  •  N é o número de nós do grafo
  • C é o número de componentes conectados       
 
Iremos então converter esse nosso código para uma forma de grafo de fluxo de controle.

 

Com o grafo pronto fica bem mais fácil de resolver a questão. Temos duas maneiras de resolvé-la. Fazendo o fluxo de caminhos lógicos possíveis, ou usando a fórmula matemática da complexidade ciclomática.

Vamos primeiro pelo modo mais difícil (pelo menos de se entender), usando a fórmula matemática.

Analisando o grafo contamos que o mesmo tem 8 nós e 9 arestas (ligações entre os nós). Entendemos como componentes conectados a quantidade de entradas do grafo, como esse é um grafo simpes (com apenas um único ponto de entrada e saída) o número de componentes conectados é 1.

Com isso já podemos montar a nossa fórmula:

CC = (A - N) + 2 x C
CC = (9 -8) + 2 x 1  
CC = 1 +2
CC = 3

Vamos agora pelo modo mais fácil de se encontrar a Complexidade Ciclomática, usando o grafo de fluxo.

 
   Como vimos, a complexidade ciclomática medi o número de caminhos de uma determinada função.

Acima podemos visualizar que o código apresentado, possui 3 caminhos lógicos possíveis.

VERDE: Onde B é maior que A e 2xA é diferente de B (Exemplo: A=2  e B=3)

AZUL: Onde B é maior que A e 2xA é igual a B (Exemplo: A=1 e B=2)  

VERMELHO: Onde B é menou ou igual a A (Exemplo: A=2 e B=1)

 Logo a Complexidade Ciclomática é 3.

Como podemos ver, essa segunda forma é bem mais fácil, pois visualmente já temos como resolver a questão, além de que não será preciso decorrar a fórmula para que possamos resolver. Como temos muito assunto para estudar para a prova, uma Formula para decorrar não é uma boa solução, não acham?

Resposta: "B"


Fontes de Pesquisa:  

1 comentários:

  1. Gostaria de ver um exemplo com mais de 1 componente conectado... Os nós e arestas desse outro componente seriam contados também?

    ResponderExcluir