O documento discute a métrica de complexidade ciclomática e sua importância para a qualidade, testabilidade e manutenção de software. Apresenta exemplos de códigos com diferentes níveis de complexidade ciclomática e discute a quantidade de cenários de teste necessários para cada caso.
O documento discute conceitos de linguagens de programação, incluindo interpretação pura, interpretação híbrida e ambientes de programação. Ele explica que a interpretação pura executa programas diretamente sem compilação, enquanto sistemas híbridos geram código intermediário para melhor desempenho. Também descreve ferramentas comuns em ambientes de programação como editores de texto e depuradores.
O documento discute estruturas de controle de decisão e repetição em Java, incluindo if/else, switch/case, while, for e declarações de interrupção. Ele também fornece exemplos de como usar essas estruturas para direcionar o fluxo de um programa.
O documento discute os conceitos e vantagens dos testes de software, apresentando os tipos de teste (caixa branca, preta e cinza) e as fases do teste (unidade, integração, sistema e aceitação). O objetivo dos testes é garantir a qualidade do software através da identificação de bugs.
O documento discute funções e procedimentos em Java. Resume-se em 3 frases:
1) Funções são blocos de código que retornam um valor ao serem chamados, enquanto procedimentos executam ações mas não retornam valores. 2) Funções e procedimentos organizam e reutilizam código, evitando repetições. 3) O documento fornece exemplos de como declarar e usar funções e procedimentos em Java.
Este documento discute requisitos de engenharia de software. Apresenta tipos de requisitos funcionais e não funcionais, e discute como especificá-los de forma clara, completa e consistente para evitar ambiguidades. Também discute alternativas à especificação de requisitos em linguagem natural, como especificações estruturadas, baseadas em modelos e tabelas.
O documento discute conceitos de linguagens de programação, incluindo interpretação pura, interpretação híbrida e ambientes de programação. Ele explica que a interpretação pura executa programas diretamente sem compilação, enquanto sistemas híbridos geram código intermediário para melhor desempenho. Também descreve ferramentas comuns em ambientes de programação como editores de texto e depuradores.
O documento discute estruturas de controle de decisão e repetição em Java, incluindo if/else, switch/case, while, for e declarações de interrupção. Ele também fornece exemplos de como usar essas estruturas para direcionar o fluxo de um programa.
O documento discute os conceitos e vantagens dos testes de software, apresentando os tipos de teste (caixa branca, preta e cinza) e as fases do teste (unidade, integração, sistema e aceitação). O objetivo dos testes é garantir a qualidade do software através da identificação de bugs.
O documento discute funções e procedimentos em Java. Resume-se em 3 frases:
1) Funções são blocos de código que retornam um valor ao serem chamados, enquanto procedimentos executam ações mas não retornam valores. 2) Funções e procedimentos organizam e reutilizam código, evitando repetições. 3) O documento fornece exemplos de como declarar e usar funções e procedimentos em Java.
Este documento discute requisitos de engenharia de software. Apresenta tipos de requisitos funcionais e não funcionais, e discute como especificá-los de forma clara, completa e consistente para evitar ambiguidades. Também discute alternativas à especificação de requisitos em linguagem natural, como especificações estruturadas, baseadas em modelos e tabelas.
Este documento discute aspectos gerais de segurança em bancos de dados, incluindo evitar violações de consistência de dados através de mecanismos como criptografia, controles de redundância e concorrência, e restrições de integridade. Além disso, aborda segurança de acesso para usuários e aplicações e manutenção de logs e backups.
Regiões críticas dos Sistemas OperacionaisAbadia Cardoso
O documento discute os conceitos de regiões críticas, sincronização e comunicação entre processos em sistemas operacionais. Aborda modelos de processos, problemas de concorrência, algoritmos de garantia de exclusão mútua como semáforos e monitores, e técnicas de comunicação interprocessos como passagem de mensagens e compartilhamento de dados.
O Firebase é o novo kit de ferramentas do Google para desenvolvedores de Apps. Possui uma série de SDKs importantes e suporta as principais plataformas do mercado como Android, iOS, Web, C++ e servidor. Assista ao vídeo relacionado a essa apresentação em https://youtu.be/YXmYpSNdtMY
Este documento contém notas de aula sobre aspectos teóricos da computação, incluindo:
1) Linguagens regulares descritas usando autômatos finitos, expressões regulares e gramáticas regulares.
2) Detalhes sobre expressões regulares, como operações de concatenação e união.
3) Exemplos de como expressões regulares geram linguagens regulares.
O documento apresenta conceitos sobre arrays em C, incluindo: 1) arrays são estruturas de dados que armazenam itens do mesmo tipo; 2) arrays possuem tamanho fixo e elementos são acessados via índice; 3) arrays podem ser inicializados de forma explícita ou implícita. Exemplos demonstram operações comuns com arrays como inicialização, impressão e cálculos.
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
기존에 작성해 놓은 C++ 코드에 모던 C++를 적용하기는 쉽지 않습니다. 막상 개선하려고 마음먹었다고 해도, 어디서부터 바꿔야 할 지 막막하기만 합니다. 이 세션에서는 기존 C++ 코드에서 모던 C++를 적용해 프로그램의 구조와 성능을 개선하는 방법에 대해서 설명합니다. 그리고 기존 C++ 코드에 모던 C++를 적용할 때 주의해야 될 점에 대해서도 살펴봅니다.
Este documento apresenta os fundamentos da linguagem de programação Java, incluindo sua história, características como orientação a objetos, portabilidade e segurança, e o passo a passo para instalação do ambiente de desenvolvimento Java.
[1] O documento descreve elementos básicos de algoritmos como variáveis, tipos de dados, operadores, funções e estruturas de controle.
[2] São apresentados tipos de dados como inteiro, real, caractere e lógico, e operadores aritméticos, relacionais e lógicos.
[3] Estruturas de controle como condicionais simples e compostas e repetições por condição e contagem são explicadas com exemplos de algoritmos.
O documento descreve o algoritmo de ordenação Shell Sort. Ele divide o vetor em sub-vetores menores e ordena esses sub-vetores usando inserção ou outra técnica simples, melhorando a ordenação a cada passo até chegar a um único vetor ordenado. O documento também discute a complexidade do algoritmo e métodos para escolher os incrementos usados nos passos.
Lista de exercicios algoritmos com pseudocodigoMauro Pereira
1) O documento apresenta uma lista de exercícios de algoritmos com pseudocódigo para os alunos do curso de Eletrônica Integrado sobre estruturas sequenciais, condicionais e de repetição.
2) Os exercícios incluem algoritmos para calcular área de retângulo, trocar valores de variáveis, calcular raízes de equação de 2o grau e custo de combustível.
3) Também pede algoritmos para analisar número como positivo, negativo ou zero e tipo de triângulo.
Material de apoio das aulas de tutoria de Algoritmos e Estrutura de dados da Universidade Federal de Ouro Preto, Campus João Monlevade. O conteúdo abordado é sobre análise da complexidade de algoritmos.
Java orientação a objetos (variaveis de instancia e metodos)Armando Daniel
O documento descreve os conceitos de variáveis de instância e métodos em Java. Explica que variáveis de instância armazenam dados específicos de cada objeto e são criadas quando um objeto é instanciado. Também descreve que métodos representam o comportamento de uma classe e podem receber parâmetros, retornar valores e acessar variáveis de instância.
O documento discute recursividade, definindo-a como um objeto ou processo que se refere a si mesmo. Explica que recursividade divide um problema em subproblemas da mesma natureza e fornece exemplos como fatorial e fibonacci. Também discute vantagens e desvantagens de programação recursiva.
O documento apresenta uma palestra sobre Programação Orientada a Objetos versus Programação Estruturada. O palestrante Albert Bitencourt discute que a Programação Orientada a Objetos defende um pensamento de programação mais voltado ao pensamento humano ao ensinar computadores a pensar como humanos através de conceitos como classe, objeto, atributo, método, herança e polimorfismo. Já a Programação Estruturada defende um pensamento de programação mais voltado ao pensamento de máquina e é eficiente para problemas simples.
모던 C++의 시초인 C++11은 C++ 코드 전반에 많은 변화를 가져왔습니다. 그리고 최근 C++20의 표준위원회 회의가 마무리되었습니다. 내년에 C++20이 도입되면 C++11이 처음 도입되었을 때와 비슷한 규모, 또는 그 이상의 변화가 있을 것이라고 예상하고 있습니다. C++20에는 Concepts, Contract, Ranges, Coroutine, Module 등 굵직한 기능 외에도 많은 기능들이 추가될 예정입니다. 이번 세션에서는 C++20에 추가될 주요 기능들을 살펴보고자 합니다.
1) O documento apresenta os conceitos básicos de algoritmos, incluindo tipos de dados, variáveis, expressões aritméticas e lógicas, e entrada e saída de dados. 2) É definido que variáveis podem ter seus valores alterados ao longo do tempo, ao contrário de constantes, e mostra como declarar variáveis. 3) Demonstra operadores aritméticos, relacionais e lógicos usados em expressões.
O documento fornece exemplos de user stories para descrever funcionalidades de um sistema de vendas. As user stories descrevem funcionalidades como consultar estoque, solicitar desconto para vendas e aprovar pedidos de desconto de vendedores.
Este documento discute os conceitos básicos da lógica digital, incluindo operações lógicas como AND, OR e NOT. Explica como esses conceitos são usados para construir portas lógicas e circuitos digitais, representando informações binárias com níveis de tensão. Também fornece exemplos de tabelas-verdade e expressões booleanas para ilustrar como a lógica subjacente é usada em sistemas de computação.
O documento discute a manipulação de arquivos em Java, introduzindo as classes do pacote java.io para entrada e saída de dados, como InputStream, OutputStream e suas subclasses para lidar com arquivos, strings e caracteres. É mostrado como ler e escrever em arquivos, tratando exceções, e formas de simplificar o código usando classes como File, FileReader e FileWriter.
Slides da disciplina de Análise de Algoritmos, ministrada pelo Prof. Marcelo H. Carvalho no curso de Pós-Graduação em Ciência da Computação, FACOM - UFMS.
Este documento fornece as soluções detalhadas para 15 problemas de sistemas de equações retirados de exames nacionais e testes intermedios de matemática do 9o ano em Portugal. Fornece também informações sobre onde encontrar resoluções adicionais online.
Este documento fornece as soluções detalhadas para 15 problemas de sistemas de equações retirados de exames nacionais e testes intermedios de matemática do 9o ano em Portugal. Fornece também instruções adicionais sobre como os estudantes podem encontrar resoluções completas para estes problemas em um blog dedicado.
Este documento discute aspectos gerais de segurança em bancos de dados, incluindo evitar violações de consistência de dados através de mecanismos como criptografia, controles de redundância e concorrência, e restrições de integridade. Além disso, aborda segurança de acesso para usuários e aplicações e manutenção de logs e backups.
Regiões críticas dos Sistemas OperacionaisAbadia Cardoso
O documento discute os conceitos de regiões críticas, sincronização e comunicação entre processos em sistemas operacionais. Aborda modelos de processos, problemas de concorrência, algoritmos de garantia de exclusão mútua como semáforos e monitores, e técnicas de comunicação interprocessos como passagem de mensagens e compartilhamento de dados.
O Firebase é o novo kit de ferramentas do Google para desenvolvedores de Apps. Possui uma série de SDKs importantes e suporta as principais plataformas do mercado como Android, iOS, Web, C++ e servidor. Assista ao vídeo relacionado a essa apresentação em https://youtu.be/YXmYpSNdtMY
Este documento contém notas de aula sobre aspectos teóricos da computação, incluindo:
1) Linguagens regulares descritas usando autômatos finitos, expressões regulares e gramáticas regulares.
2) Detalhes sobre expressões regulares, como operações de concatenação e união.
3) Exemplos de como expressões regulares geram linguagens regulares.
O documento apresenta conceitos sobre arrays em C, incluindo: 1) arrays são estruturas de dados que armazenam itens do mesmo tipo; 2) arrays possuem tamanho fixo e elementos são acessados via índice; 3) arrays podem ser inicializados de forma explícita ou implícita. Exemplos demonstram operações comuns com arrays como inicialização, impressão e cálculos.
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
기존에 작성해 놓은 C++ 코드에 모던 C++를 적용하기는 쉽지 않습니다. 막상 개선하려고 마음먹었다고 해도, 어디서부터 바꿔야 할 지 막막하기만 합니다. 이 세션에서는 기존 C++ 코드에서 모던 C++를 적용해 프로그램의 구조와 성능을 개선하는 방법에 대해서 설명합니다. 그리고 기존 C++ 코드에 모던 C++를 적용할 때 주의해야 될 점에 대해서도 살펴봅니다.
Este documento apresenta os fundamentos da linguagem de programação Java, incluindo sua história, características como orientação a objetos, portabilidade e segurança, e o passo a passo para instalação do ambiente de desenvolvimento Java.
[1] O documento descreve elementos básicos de algoritmos como variáveis, tipos de dados, operadores, funções e estruturas de controle.
[2] São apresentados tipos de dados como inteiro, real, caractere e lógico, e operadores aritméticos, relacionais e lógicos.
[3] Estruturas de controle como condicionais simples e compostas e repetições por condição e contagem são explicadas com exemplos de algoritmos.
O documento descreve o algoritmo de ordenação Shell Sort. Ele divide o vetor em sub-vetores menores e ordena esses sub-vetores usando inserção ou outra técnica simples, melhorando a ordenação a cada passo até chegar a um único vetor ordenado. O documento também discute a complexidade do algoritmo e métodos para escolher os incrementos usados nos passos.
Lista de exercicios algoritmos com pseudocodigoMauro Pereira
1) O documento apresenta uma lista de exercícios de algoritmos com pseudocódigo para os alunos do curso de Eletrônica Integrado sobre estruturas sequenciais, condicionais e de repetição.
2) Os exercícios incluem algoritmos para calcular área de retângulo, trocar valores de variáveis, calcular raízes de equação de 2o grau e custo de combustível.
3) Também pede algoritmos para analisar número como positivo, negativo ou zero e tipo de triângulo.
Material de apoio das aulas de tutoria de Algoritmos e Estrutura de dados da Universidade Federal de Ouro Preto, Campus João Monlevade. O conteúdo abordado é sobre análise da complexidade de algoritmos.
Java orientação a objetos (variaveis de instancia e metodos)Armando Daniel
O documento descreve os conceitos de variáveis de instância e métodos em Java. Explica que variáveis de instância armazenam dados específicos de cada objeto e são criadas quando um objeto é instanciado. Também descreve que métodos representam o comportamento de uma classe e podem receber parâmetros, retornar valores e acessar variáveis de instância.
O documento discute recursividade, definindo-a como um objeto ou processo que se refere a si mesmo. Explica que recursividade divide um problema em subproblemas da mesma natureza e fornece exemplos como fatorial e fibonacci. Também discute vantagens e desvantagens de programação recursiva.
O documento apresenta uma palestra sobre Programação Orientada a Objetos versus Programação Estruturada. O palestrante Albert Bitencourt discute que a Programação Orientada a Objetos defende um pensamento de programação mais voltado ao pensamento humano ao ensinar computadores a pensar como humanos através de conceitos como classe, objeto, atributo, método, herança e polimorfismo. Já a Programação Estruturada defende um pensamento de programação mais voltado ao pensamento de máquina e é eficiente para problemas simples.
모던 C++의 시초인 C++11은 C++ 코드 전반에 많은 변화를 가져왔습니다. 그리고 최근 C++20의 표준위원회 회의가 마무리되었습니다. 내년에 C++20이 도입되면 C++11이 처음 도입되었을 때와 비슷한 규모, 또는 그 이상의 변화가 있을 것이라고 예상하고 있습니다. C++20에는 Concepts, Contract, Ranges, Coroutine, Module 등 굵직한 기능 외에도 많은 기능들이 추가될 예정입니다. 이번 세션에서는 C++20에 추가될 주요 기능들을 살펴보고자 합니다.
1) O documento apresenta os conceitos básicos de algoritmos, incluindo tipos de dados, variáveis, expressões aritméticas e lógicas, e entrada e saída de dados. 2) É definido que variáveis podem ter seus valores alterados ao longo do tempo, ao contrário de constantes, e mostra como declarar variáveis. 3) Demonstra operadores aritméticos, relacionais e lógicos usados em expressões.
O documento fornece exemplos de user stories para descrever funcionalidades de um sistema de vendas. As user stories descrevem funcionalidades como consultar estoque, solicitar desconto para vendas e aprovar pedidos de desconto de vendedores.
Este documento discute os conceitos básicos da lógica digital, incluindo operações lógicas como AND, OR e NOT. Explica como esses conceitos são usados para construir portas lógicas e circuitos digitais, representando informações binárias com níveis de tensão. Também fornece exemplos de tabelas-verdade e expressões booleanas para ilustrar como a lógica subjacente é usada em sistemas de computação.
O documento discute a manipulação de arquivos em Java, introduzindo as classes do pacote java.io para entrada e saída de dados, como InputStream, OutputStream e suas subclasses para lidar com arquivos, strings e caracteres. É mostrado como ler e escrever em arquivos, tratando exceções, e formas de simplificar o código usando classes como File, FileReader e FileWriter.
Slides da disciplina de Análise de Algoritmos, ministrada pelo Prof. Marcelo H. Carvalho no curso de Pós-Graduação em Ciência da Computação, FACOM - UFMS.
Este documento fornece as soluções detalhadas para 15 problemas de sistemas de equações retirados de exames nacionais e testes intermedios de matemática do 9o ano em Portugal. Fornece também informações sobre onde encontrar resoluções adicionais online.
Este documento fornece as soluções detalhadas para 15 problemas de sistemas de equações retirados de exames nacionais e testes intermedios de matemática do 9o ano em Portugal. Fornece também instruções adicionais sobre como os estudantes podem encontrar resoluções completas para estes problemas em um blog dedicado.
O documento discute instruções de controle de fluxo em Java, como if/else, switch/case, loops (while, do-while e for) e manipulação de exceções com try/catch/finally. Inclui detalhes sobre como usar cada instrução e exemplos de código.
Apresentação no TDC2013 - Florianópolis da trilha Mobile e Embedded (25/05/2013). Apresenta algumas dicas, técnicas e sugestões de como melhorar o processamento e uso de memória no código.
Este documento apresenta e discute as métricas de complexidade ciclomática e complexidade cognitiva. Apresenta as definições, cálculos e exemplos para cada uma. Discute suas semelhanças e diferenças, quando aplicar cada uma e a utilidade da complexidade ciclomática para testabilidade.
O documento discute testes de unidade e integração para a classe Calculadora utilizando as bibliotecas JUnit e EasyMock. Inclui código Java para a classe Calculadora e testes de unidade utilizando asserções JUnit para verificar o comportamento correto da soma.
O documento descreve um planejamento fatorial completo com três fatores (temperatura, catalisador e concentração) e suas respectivas interações para analisar o rendimento de uma reação. Os principais efeitos encontrados foram da temperatura, catalisador e concentração, com interação significativa entre temperatura e concentração.
Grafos e Algoritimos - Dr. Julio Cesar de Araujo MenezesJulio Menezes
Exercício resolvidos durante o Curso de Grafos e Algoritmos (como aluno de Engenharia da Computação) do Departamento de Computação da Universidade Federal de Sergipe.
O documento discute técnicas de teste baseadas na estrutura do código, como cobertura de comandos, decisões e caminhos. Ele explica o que é cobertura de teste e como medir a cobertura de comandos e decisões. Além disso, aborda outras técnicas como cobertura de desvio, LCSAJ e cobertura de caminho, bem como técnicas baseadas na experiência como suposição de erros e teste exploratório.
Este documento introduz conceitos básicos de cálculo numérico. Aborda o que é um algoritmo e como ele deve ser estruturado para resolver problemas de forma eficiente. Também explica as principais etapas para modelagem matemática e resolução numérica de problemas, incluindo modelagem, escolha de métodos numéricos e critérios de parada.
T08_T09_LM3: Estruturas de repetição (2013-2014)Carlos Santos
O documento discute estruturas de repetição em JavaScript como for, while, do-while e for-in. Explica como cada uma funciona com exemplos, incluindo a inicialização e incremento de variáveis de controle, a avaliação de condições e a execução de código dentro dos laços. Também mostra como aninhar estruturas de repetição para gerar tabelas.
(A09) LabMM3 - JavaScript - Estruturas de repetiçãoCarlos Santos
O documento descreve diferentes estruturas de repetição em JavaScript, incluindo for, while, do-while e ciclos aninhados. Explica como cada uma funciona por meio de fluxogramas e fornece exemplos de código.
1) O documento discute métodos quantitativos aplicados à logística de distribuição, incluindo modelos analógicos e de programação linear.
2) Os custos logísticos representam entre 15-25% do PIB de um país emergente, sendo transporte o principal fator.
3) Métodos como regra do noroeste, custo mínimo e Vogel são abordados para alocar quantidades de forma a minimizar custos totais.
O documento discute TDD (Desenvolvimento Guiado por Testes) em C++, abordando verificação de estado através de testes de unidade e verificação de comportamento usando mocks. É apresentado o framework Yaffut para execução de testes e o HippoMocks para criação automática de mocks, facilitando a simulação de objetos em testes.
O documento discute TDD (Desenvolvimento Guiado por Testes) em C++, abordando verificação de estado através de testes de unidade e verificação de comportamento usando mocks. É apresentado o framework Yaffut para execução de testes e o HippoMocks para criação automática de mocks, facilitando a simulação de objetos em testes.
A empresa de tecnologia anunciou um novo smartphone com câmera aprimorada, maior tela e bateria de longa duração. O dispositivo também possui processador mais rápido e armazenamento expansível. O novo modelo será lançado em outubro por um preço inicial de US$799.
Este trabalho apresenta algoritmos para controle de threads, começando com soluções simples e progredindo para algoritmos mais complexos como o de Dekker e Peterson. O documento descreve cada algoritmo, explicando seu funcionamento e quais requisitos de exclusão mutua e progresso cada um atende.
O documento descreve estruturas de controle de repetição em programação e fornece exemplos de seu uso em pseudocódigo e Java. É apresentado o conceito de laços com teste no início, variáveis contadores e acumuladoras, e exercícios propostos para praticar o uso dessas estruturas.
O documento resume os principais tópicos abordados na Aula 3 de Programação Orientada a Objetos com Java:
1) Operadores e expressões, incluindo operadores aritméticos, lógicos e condicionais;
2) Estruturas de decisão como if/else e operadores lógicos;
3) Estruturas de repetição como while, do-while e for para executar código de forma iterativa.
Este documento resume uma apresentação sobre skills de desenvolvedores em ambientes low code. A apresentação discute: 1) Como equipes de desenvolvimento usaram plataformas low code para soluções de clientes; 2) Skills relevantes como modelagem de dados e modularização ainda são importantes; 3) Desenvolvedores com skills técnicas têm vantagem em ambientes enterprise low code.
Este documento discute como a Lei Geral de Proteção de Dados (LGPD) se aplica ao tratamento de dados pessoais no metaverso. Ele explica que quase toda informação no metaverso, como nomes, avatares, movimentos e emoções, pode ser considerada dado pessoal. Também destaca que o contexto de uso determina o que pode ser feito com os dados e que as mesmas bases legais da LGPD se aplicam no metaverso. Por fim, levanta perguntas sem resposta sobre como aplicar a LGPD em ambientes descentralizados e blockchain
Este documento discute como organizações podem tratar sistemas legados sob a LGPD em 3 pontos chaves: (1) definir o papel da organização no tratamento de dados, (2) mapear os tratamentos de dados realizados, e (3) identificar pendências de adequação. O autor também discute a importância de registrar as ocorrências dos tratamentos e incorporar a privacidade no futuro.
O documento discute como organizações podem implementar o registro de operações de tratamento de dados pessoais exigido pelo Artigo 37 da LGPD de forma a não gerar um "log hell". Apresenta estratégias como adaptar a auditoria existente ou criar um registro paralelo, e discute questões como onde colocar os gatilhos de registro e quais dados e metadados devem constar no registro.
Este documento discute a abordagem do SERPRO para atender os direitos dos titulares de dados pessoais de acordo com a LGPD. Apresenta o problema complexo de haver múltiplos controladores e domínios e propõe uma solução com funcionalidades integradas e uma rede de profissionais capacitados em privacidade e proteção de dados.
O documento discute quando um dado é considerado pessoal, afirmando que depende muito do contexto. Primeiro, analisa se o nome fantasia de uma pessoa jurídica é um dado pessoal, concluindo que depende se é de um MEI, candidato político ou outra situação. Em seguida, define o que são dados pessoais segundo a LGPD e discute a identificabilidade. Por fim, enfatiza que o contexto do tratamento é fundamental para determinar se um dado é pessoal.
As três frases resumem o documento da seguinte forma:
O documento apresenta um resumo de uma palestra sobre código limpo com 17 tópicos, desde nomes significativos até refatoração. A palestra é organizada em 42 slides e será apresentada pelo desenvolvedor Douglas Siviotti com o objetivo de ensinar conceitos de qualidade de software.
Este documento apresenta um roadmap para desenvolvedores na área de proteção de dados, discutindo as principais áreas de conhecimento e atividades relacionadas à privacidade e proteção de dados no desenvolvimento de software, como modelagem de dados, minimização de dados, anonimização, ciclo de vida dos dados e relacionamento com os titulares. O roadmap recomenda uma trilha de conhecimento que inclui governança, jurídico, negócio e certificações, abordando temas como finalidades, bases legais, tratamento de dados, normas
O documento apresenta uma introdução sobre a complexidade cognitiva, medida de qualidade de software que avalia a dificuldade de entendimento de código. Ele define a complexidade cognitiva, compara-a com a complexidade ciclomática e fornece um exemplo prático de cálculo. O documento também discute a metodologia de cálculo da complexidade cognitiva e suas vantagens em relação à complexidade ciclomática.
O documento discute como desenvolvedores podem aplicar a Lei Geral de Proteção de Dados (LGPD) em seus projetos de software. Aborda o que é LGPD, como incorporar a disciplina de proteção de dados no desenvolvimento através de privacidade by design e realizando atividades específicas em cada etapa do ciclo de vida do software. Também discute os impactos da LGPD no trabalho do desenvolvedor.
Privacidade By Design no Ciclo de Vida do ProdutoDouglas Siviotti
Apresentação da privacidade by design e seus princípios e como ela pode ser aplicada no ciclo de vida de um produto de software baseado na experiência do SERPRO utilizando o Guia de Desenvolvimento Confiável (GDC).
Este documento apresenta conceitos de código limpo em exemplos de código. Apresenta quatro partes: uma sobre filosofia, outra sobre teoria, outra sobre prática em exemplos de código e uma sobre laboratório de refatoração. Apresenta conceitos como DDD, SRP, DRY, testes, refatoração e regras de simplicidade aplicados em exemplos de código.
Este documento apresenta uma introdução à Lei Geral de Proteção de Dados Pessoais do Brasil (LGPD). A apresentação contém 43 slides organizados em 6 partes, abordando tópicos como definição de dados pessoais, princípios da LGPD, direitos do titular e agentes envolvidos no tratamento de dados. O material serve como referência para pessoas e empresas afetadas pela legislação brasileira sobre privacidade e proteção de dados.
Este documento apresenta conceitos de código limpo em exemplos de código. Apresenta 4 partes: 1) Filosofia, 2) Teoria, 3) Prática com exemplos de código, 4) Laboratório de refatoração. Fornece conceitos como DDD, SRP, DRY, testes, refatoração e regras de simplicidade aplicados a exemplos de código.
O documento discute como expressar o negócio no código fonte de forma concisa e compreensível. Apresenta o caminho tradicional e o caminho ágil do negócio ao código, enfatizando a importância da expressividade do código para refletir o negócio. Também aborda características do código que expressam negócio como independência, isolamento, significado e modularização.
O documento discute o conceito de dívida técnica, seus sintomas, impactos e formas de tratamento. Apresenta a dívida técnica como uma metáfora para descrever situações onde escolhas no desenvolvimento de software geram necessidade de melhorias futuras. Em seguida, explica como reconhecer, evitar acumular, alertar sobre, amortizar e aprender com a dívida técnica para evoluir em direção à excelência.
2. Sobre esta Apresentação
2/68
1. Conteúdo: Complexidade Ciclomática
2. Área/Foco: Qualidade de Software, Manutenção e Testabilidade
3. Público alvo: Desenvolvedores de Software e Gestores
4. Conteúdo relacionado: Cobertura de Testes, Entregas Contínuas
Organização (+- 60 minutos)
Parte 1 – Introdução: Conceito e Regra de Cálculo
Parte 2 – Aplicação: Padrão de Qualidade, Importância e Utilidade
Parte 3 – Prática: Refatoração e Redução
Parte 4 – Conclusão:
3. Parte 1 - Introdução
3/68
Conceito e Regra de Cálculo
4. Conceito
4/68
Complexidade Ciclomática é uma métrica de software que
indica a complexidade de um programa* (McCabe, 1976).
* Programa, método, rotina etc
Ela mede a quantidade máxima de caminhos
linearmente independentes no código fonte.
5. Conceito
5/68
Caminho Linearmente Independente é qualquer
caminho do programa que introduz pelo menos um
novo conjunto de comandos de processamento ou
uma nova condição. Quando definido em termos de
grafo de fluxo, um caminho independente deve incluir
pelo menos uma aresta que não tenha sido
atravessada antes de o caminho ser definido
(Pressman).
1
B X
2
C Y
A
Independentes: A-1-B-2-C-D A-1-X-2-C-D A-1-B-2-Y-D
Não Independente: A-1-X-2-Y-D
D
6. Exemplo 1
6/68
public int sum(int a, int b) {
int result = a + b;
System.out.println(result);
return result;
}
1
result = a + b
println(result)
return result
O código apresenta três
linhas e um único caminho.
O código apresenta três
linhas e um único caminho.
7. Teste de Unidade do Exemplo 1
7/68
1
result = a + b
println(result)
return result
O teste de unidade precisa
somente de um cenário de teste
( qualquer a + qualquer b)
O teste de unidade precisa
somente de um cenário de teste
( qualquer a + qualquer b)
@Test
public void testSum() {
assertEquals(2, obj.sum(1, 1));
}
8. Exemplo 2 – Soma Somente Diferentes
8/68
public int sum(int a, int b) {
int result= 0;
if (a != b) {
result = a + b;
}
System.out.println(result);
return result;
}
1
result = 0
println(result)
Não
Dois caminhos são possíveis:
1. Onde ‘a’ e ‘b’ são iguais
2. Onde ‘a’ e ‘b’ são diferentes
Dois caminhos são possíveis:
1. Onde ‘a’ e ‘b’ são iguais
2. Onde ‘a’ e ‘b’ são diferentes
a != b
return result
Sim
2
result = a + b
9. Teste de Unidade do Exemplo 2
9/68
1
result = 0
println(result)
Não
a != b
return result
Sim
2
result = a + b
Um cenário pode cobrir todas
as linhas, mas é prudente
escrever mais de um
Um cenário pode cobrir todas
as linhas, mas é prudente
escrever mais de um
@Test
public void test() {
// [1] cobre um caminho a==b
// cobre 80% das linhas
assertEquals(0, obj.sum(1, 1));
// [2] cobre outro caminho a!=b
// cobre 100% das linhas
assertEquals(3, obj.sum(1, 2));
}
10. Exemplo 3 – Ano Bissexto
10/68
public boolean isBissexto(int ano){
if (ano % 400 == 0){
return true;
}
if (ano % 4 == 0 && ano % 100 != 0){
return true;
}
return false;
}
return false% 400 == 0 return true
2
Sim
% 4 == 0
Não
Sim
1
Não
return false
% 100 == 0
Não
Sim
return true
3
4
Há 4 caminhos possíveis:
1. Divisível por 400 : true
2. Nem por 400 nem 4: false
3. Divisível somente por 4: true
4. Divisível por 4 E 100 : false
Há 4 caminhos possíveis:
1. Divisível por 400 : true
2. Nem por 400 nem 4: false
3. Divisível somente por 4: true
4. Divisível por 4 E 100 : false
11. Cenários do Exemplo 3
11/68
return false% 400 == 0 return true
2
Sim
% 4 == 0
Não
Sim
1
Não
return false
% 100 == 0
Não
Sim
return true
3
4
Há 4 caminhos possíveis:
1. Divisível por 400 : true
2. Nem por 400 nem 4: false
3. Divisível somente por 4: true
4. Divisível por 4 E 100 : false
Há 4 caminhos possíveis:
1. Divisível por 400 : true
2. Nem por 400 nem 4: false
3. Divisível somente por 4: true
4. Divisível por 4 E 100 : false
// 4 caminhos independentes
assertTrue(obj.isBissexto(1600));
assertFalse(obj.isBissexto(2001));
assertTrue(obj.isBissexto(2004));
assertFalse(obj.isBissexto(1900));
12. Exemplo 4 – Sorveteria (Tipo/Pote/Cobertura)
12/68
public int precoSorvete(boolean premium,
boolean casquinha, int coberturas) {
int preco = 0;
if (premium) {
preco = 20;
} else {
preco = 15;
}
if (casquinha) {
preco = preco + 2;
} else {
preco = preco + 1;
}
if (coberturas > 1){
preco = preco + 2;
} else {
preco = preco + 1;
}
return preco;
}
if
15 20
if
+1 +2
if
+1 +2
P
0
Quantos
Caminhos?
Quantos
Caminhos?
13. Exemplo 4 – Sorveteria (8 Caminhos Possíveis)
13/68
if
15 20
if
+1 +2
if
+1 +2
17
0
if
15 20
if
+1 +2
if
+1 +2
18
0
if
15 20
if
+1 +2
if
+1 +2
18
0
if
15 20
if
+1 +2
if
+1 +2
19
0
if
15 20
if
+1 +2
if
+1 +2
22
0
if
15 20
if
+1 +2
if
+1 +2
23
0
if
15 20
if
+1 +2
if
+1 +2
23
0
if
15 20
if
+1 +2
if
+1 +2
24
0Premium
Copinho
1 Cobertura
Comum
Copinho
1 Cobertura
Comum
Copinho
2 Coberturas
Comum
Casquinha
1 Cobertura
Comum
Casquinha
2 Coberturas
Premium
Copinho
2 Coberturas
Premium
Casquinha
1 Cobertura
Premium
Casquinha
2 Coberturas
14. Questão 1
14/68
É razoável criar testes de unidade com um cenário
para cada caminho possível de um método?
assertEquals(17, sorveteria.precoSorvete(false, false, 1)); // Comum-Copinho-1Cob
assertEquals(18, sorveteria.precoSorvete(false, false, 2)); // Comum-Copinho-2Cob
assertEquals(18, sorveteria.precoSorvete(false, true, 1)); // Comum-Casquinha-1Cob
assertEquals(19, sorveteria.precoSorvete(false, true, 2)); // Comum-Casquinha-2Cob
assertEquals(22, sorveteria.precoSorvete(true, false, 1)); // Premium-Copinho-1Cob
assertEquals(23, sorveteria.precoSorvete(true, false, 2)); // Premium-Copinho-2Cob
assertEquals(23, sorveteria.precoSorvete(true, true, 1)); // Premium-Casquinha-1Cob
assertEquals(24, sorveteria.precoSorvete(true, true, 2)); // Premium-Casquinha-2Cob
Mais um IF-ELSE aumenta os cenários para 16!
15. Exemplo 4 – Sorveteria (Complexidade Ciclomática = 4)
15/68
if
15 20
if
+1 +2
if
+1 +2
17
0
if
15 20
if
+1 +2
if
+1 +2
22
0
if
15 20
if
+1 +2
if
+1 +2
18
0
if
15 20
if
+1 +2
if
+1 +2
18
0A B C D
16. Exemplo 4 – Sorveteria1 (2 Cenários Cobrem 100%)
16/68
assertEquals(17,
sorveteria.precoSorvete
(false, false, 1));
assertEquals(24,
sorveteria.precoSorvete
(true, true, 2));
if
15 20
if
+1 +2
if
+1 +2
17
0
if
15 20
if
+1 +2
if
+1 +2
22
0A B
17. Exemplo 4 – Resultado da Cobertura
17/68
Complexidade Ciclomática 4
sugere que 4 cenários (bem feitos)
são suficientes para boa cobertura
de todas as linhas e condições
(apenas 2 são necessários)
Complexidade Ciclomática 4
sugere que 4 cenários (bem feitos)
são suficientes para boa cobertura
de todas as linhas e condições
(apenas 2 são necessários)
18. Exemplo 5 – Sorveteria 2 (Ifs sem Else)
18/68
if
+5
+1
+1
if
+1
P
15
+1
if
Quantos caminhos?Quantos caminhos?
public int precoSorvete(boolean premium,
boolean casquinha, int coberturas) {
int preco = 15;
if (premium) {
preco = preco + 5;
}
preco = preco + 1; // pote
if (casquinha) {
preco = preco + 1;
}
preco = preco + 1; // cobertura
if (coberturas > 1){
preco = preco + 1;
}
return preco;
}
19. Exemplo 5 – Sorveteria 2 (8 Caminhos)
19/68
if
+5
+1
+1
if
+1
18
15
+1
if
if
+5
+1
+1
if
+1
17
15
+1
if
if
+5
+1
+1
if
+1
18
15
+1
if
if
+5
+1
+1
if
+1
19
15
+1
if
if
+5
+1
+1
if
+1
23
15
+1
if
if
+5
+1
+1
if
+1
22
15
+1
if
if
+5
+1
+1
if
+1
23
15
+1
if
if
+5
+1
+1
if
+1
24
15
+1
if
Com
Copo
1 Cob
Prem
Copo
1 Cob
Com
Copo
2 Cob
Com
Casc
1 Cob
Com
Casc
2 Cob
Prem
Copo
2 Cob
Prem
CAsc
2 Cob
Prem
Casc
2 Cob
20. Exemplo 5 – Sorveteria 2 (Complexidade Ciclomática = 4)
20/68
B
if
+5
+1
+1
if
+1
P
15
+1
if
A
if
+5
+1
+1
if
+1
P
15
+1
if
C
if
+5
+1
+1
if
+1
P
15
+1
if
D
if
+5
+1
+1
if
+1
P
15
+1
if
4 Caminhos linearmente independentes
21. Exemplo 5 – Sorveteria 2 (1 Cenário cobre 100%)
21/68
if
+5
+1
+1
if
+1
P
15
+1
if
assertEquals(24,
sorveteria.precoSorvete
(true, true, 2));
22. Exemplo 5 – Resultado da Cobertura
22/68
Complexidade Ciclomática 4
sugere que 4 cenários (bem feitos)
são suficientes para boa cobertura
de todas as linhas e condições
(apenas 1 é necessário)
Complexidade Ciclomática 4
sugere que 4 cenários (bem feitos)
são suficientes para boa cobertura
de todas as linhas e condições
(apenas 1 é necessário)
23. Exemplo 6 – Sorveteria 3 (Ifs Aninhados)
23/68
Quantos caminhos?Quantos caminhos?
if17 20
if
+1
+2
If
+1 +2
P
0
public int precoSorvete(boolean premium, boolean casquinha, int coberturas) {
int preco = 0;
if (premium) { // só premiun tem casquinha
preco = 20;
if (casquinha) { // só casq tem cobe
preco = preco + 2;
if (coberturas > 1){
preco = preco + 2;
} else {
preco = preco + 1;
}
} else {
preco = preco + 1;
}
} else {
preco = 15 + 1 + 1; // copo + 1 cob
}
return preco;
}
24. Exemplo 6 – Sorveteria 3 (Complexidade Ciclomática = 4)
24/68
if17 20
if
+1
+2
If
+1 +2
P
0A
if17 20
if
+1
+2
If
+1 +2
P
0B
if17 20
if
+1
+2
If
+1 +2
P
0
D C
Similar ao exemplo “Ano Bissexto”. Cada “preco=” poderia ser um “return”
4 Caminhos
linearmente
independentes
25. Exemplo 6 – Sorveteria 3 (2 Cenários cobrem 77,6%)
25/68
assertEquals(17,
sorveteria.precoSorvete
(false, false, 1));
assertEquals(24,
sorveteria.precoSorvete
(true, true, 2));
if17 20
if
+1
+2
If
+1 +2
0A
if17 20
if
+1
+2
If
+1 24
0
C
27. Exemplo 6 – Sorveteria 3 (4 Cenários Cobrem 100%)
27/68
17 = (false, false, 1) // 1
24 = (true, true, 2)) // 2
23 = (true, true, 1)) // 3
21 = (true, false, 2)) // 4
if17 20
if
+1
+2
If
+1 +2
0A
if17 20
if
21
+2
If
23 24
0
CD
B
28. Exemplo 6 – Resultado da Cobertura
28/68
Complexidade Ciclomática 4
sugere que 4 cenários (bem feitos)
são suficientes para boa cobertura
de todas as linhas e condições
(4 são necessários)
Complexidade Ciclomática 4
sugere que 4 cenários (bem feitos)
são suficientes para boa cobertura
de todas as linhas e condições
(4 são necessários)
29. Exemplos 4, 5 e 6 – Sorveteria 1 x 2 x 3 (CC = 4 em Todos)
29/68
if
15 20
if
+1 +2
if
+1 +2
P
0
if
+5
+1
+1
if
+1
P
15
+1
if
1 2
Sorveterias 1 e 2
8 Caminhos
4 Circuitos
1 = 2 Cenários
2 = 1 Cenário
Sorveteria 3
4 Caminhos
4 Circuitos
4 Cenários
if17 20
if
+1
+2
If
+1 +2
P
03
30. Exemplos 4, 5 e 6 – NPATH x Complexidade Ciclomática
30/68
@Test
public void testAllPaths() { // Baseado em NPATH
assertEquals(17, sorveteria.precoSorvete(false, false, 1)); // Comum-Copinho-1Cob
assertEquals(18, sorveteria.precoSorvete(false, false, 2)); // Comum-Copinho-2Cob
assertEquals(18, sorveteria.precoSorvete(false, true, 1)); // Comum-Casquinha-1Cob
assertEquals(19, sorveteria.precoSorvete(false, true, 2)); // Comum-Casquinha-2Cob
assertEquals(22, sorveteria.precoSorvete(true, false, 1)); // Premium-Copinho-1Cob
assertEquals(23, sorveteria.precoSorvete(true, false, 2)); // Premium-Copinho-2Cob
assertEquals(23, sorveteria.precoSorvete(true, true, 1)); // Premium-Casquinha-1Cob
assertEquals(24, sorveteria.precoSorvete(true, true, 2)); // Premium-Casquinha-2Cob
}
@Test
public void testIndependentPaths() { // Baseado em CC
assertEquals(17, sorveteria.precoSorvete(false, false, 1)); // Comum-Copinho-1Cob
assertEquals(23, sorveteria.precoSorvete(true, true, 1)); // Premium-Casquinha-1Cob
assertEquals(21, sorveteria.precoSorvete(true, false, 2)); // Premium-Copinho-2Cob
assertEquals(24, sorveteria.precoSorvete(true, true, 2)); // Premium-Casquinha-2Cob
}
A Sorveteria com 9 IF-ELSE teria 512 caminhos, mas CC = 10 (linhas do teste)
31. Limite Máximo de Cenários
31/68
Dependendo do algoritmo, a quantidade de
caminhos únicos pode variar, mas o valor de
complexidade ciclomática é o limite superior do
número de cenários necessários para cobrir 100%
das linhas e condições, se definidos corretamente
A Sorveteria com 9 IF-ELSE teria 512 caminhos, mas CC = 10
32. Correlação 1 - Testabilidade
32/68
Se não há impacto é porque não há teste de unidade
Quanto maior a complexidade ciclomática em
um método, maior tende a ser o número de
cenários necessários em um teste deste
mesmo método.
33. Correlação 2 - Manutenção
33/68
Quanto maior a complexidade ciclomática em um
método, maior será a dificuldade de entendimento
e o risco de inserção de novos defeitos neste
método, aumentando o esforço de manutenção.
Durante a construção inicial o impacto é mais baixo. O autor ainda entende o próprio código
34. Cálculo da Complexidade Ciclomática
34/68
Nó
Aresta
CC = Arestas – Nós + 1
if17 20
if
+1
+2
If
+1 +2
P
0
CC = 14 – 11 + 1 = 4
Preciso desenhar um
grafo para cada método
para calcular?
Preciso desenhar um
grafo para cada método
para calcular?
35. Regra de Cálculo Baseada em Keywords (Sonar)
35/68
1. Inicia em “Um” para o método (com ou sem retorno)
2. Adiciona “Um” para cada elemento de fluxo abaixo:
2.1 Seleção if, case
2.2 Loops for, while, do-while, break, e
continue.
2.3 Operadores &&, ||, ?
2.4 Exceções catch, finally, throw, ou throws
2.5 Fluxo return que não seja o último
(else, default, finally, : e return não incrementam o valor)
37. Exercício de Contagem (Soma Diferentes – Exemplo 2)
37/68
?
public int sum(int a, int b) {
int result= 0;
if (a != b) {
result = a + b;
}
System.out.println(result);
return result;
}
38. Resultado
38/68
2
public int sum(int a, int b) {
int result= 0;
if (a != b) {
result = a + b;
}
System.out.println(result);
return result;
}
+1
+1
39. Exercício de Contagem (Ano Bissexto – Exemplo 3)
39/68
?
public boolean isBissexto(int ano){
if (ano % 400 == 0){
return true;
}
if (ano % 4 == 0 && ano % 100 != 0){
return true;
}
return false;
}
41. Resultado para Implementação sem “Return”
41/68
4
public boolean isBissexto(int ano){
boolean result = false;
if (ano % 400 == 0){
result = true;
}
if (ano % 4 == 0 && ano % 100 != 0){
result = true;
}
return result;
}
+1
+1
+1
+1
42. Resultado para Implementação mais Enxuta
42/68
3
public boolean isBissexto(int ano){
return ano % 400 == 0 || (ano % 4 == 0 && ano % 100 != 0);
}
+1+1
+1
assertTrue(obj.isBissexto(1600));
assertFalse(obj.isBissexto(2001));
assertTrue(obj.isBissexto(2004));
assertFalse(obj.isBissexto(1900));
43. Modo de Uso
43/68
O número exato não é a coisa mais importante!
Complexidade Ciclomática serve para acompanhamento
da evolução do software durante a construção
Premissa: Ferramenta de Análise Estática de Código
46. Parte 2 – Aplicação
46/68
Padrão de Qualidade
Importância
Utilidade
47. Padrão de Qualidade sobre Complexidade Ciclomática (CC)
47/68
10
Quanto menor, melhor
Mais fácil de testar e manter
Valor limite do Sonar: até 10
(Acima de 10 gera uma violação)
Relação direta com casos de testes
Quanto mais alta, mais complexo
Mais responsabilidades por método
> 50 = quase impossível de manter
(até para o desenvolvedor original)
Alta CC sugere pouco OO
(+ procedural)
48. Padrão de Qualidade sobre Complexidade Ciclomática (CC)
48/68
<10!
10 é o limite, não o ideal (é alto)
CC alta é um ponto quente
- Maior necessidade de testes
- Maior probabilidade de erro
- Maior necessidade de
manutenção
A média deve tender a 1
49. Padrão de Qualidade sobre Complexidade Ciclomática (CC)
49/68
10
Segundo Thomas J. McCabe (1976):
01-10 Método Simples. Baixo Risco
11-20 Método razoavelmente complexo. Risco
moderado.
21-50 Método muito complexo. Risco elevado.
51-N Método de altíssimo risco e instável
50. Padrão de Qualidade sobre Complexidade Ciclomática (CC)
50/68
5
Segundo Steve McConnell (Code Complete 1993) :
De 0 a 5: Seu código está, provavelmente, ok.
Entre 6 e 10: Pense em maneiras de simplificar o
código
Maior que 10: Quebre o código em dois e insira uma
chamada da primeira parte para a segunda.
51. Padrão de Qualidade sobre Complexidade Ciclomática (CC)
51/68
Segundo SonarSource (sonarsource.com):
Gerencie como “Vazamento de Água” (Water Leak)
“Fix Issues Before They Exist” (Resolva antes que exista)
Utilização do Plugin SonarLint
A melhor abordagem sobre
complexidade é mantê-la baixa
57. Quebra do Ciclo Vicioso
57/68
Prazo
Curto
KEEP
CALM
AND ...
Dívida
Técnica
Perda de
Qualidade
CC
Baixa
Teste de
Unidade
Confiança
Fluidez
Refatoração
58. Parte 3 – Prática
58/68
Refatoração e Redução
da Complexidade Ciclomática
59. Refatoração
59/68
Refatoração é uma técnica para reestruturar um
código existente, alterando seu estado interno
sem alterar seu comportamento externo.
Ela consiste em uma série de pequenas transformações com a preservação do
comportamento original. Cada transformação faz pouco, mas uma sequência de
transformações pode produzir uma reestruturação significativa. Uma vez que cada
refatoração é pequena, é menos provável que dê errado.
60. Vazamento de Água: Refatoração como Atividade Corriqueira
60/68
ConstruçãoConstrução
Análise EstáticaAnálise Estática
CC Alta?CC Alta?Não
RefatoraçãoRefatoração
Sim
Tratar?Tratar? Não
Dívida TécnicaDívida Técnica
Sim
61. Exercício de Refatoração
61/68
Necessidade: A partir de uma classe qualquer retorne a quantidade de
constantes (final static) inteiras* presentes nessa classe incluindo as
constantes herdadas das superclasses.
* Inteiros: Integer, int, Long, long, Short, short, Byte, byte e BigInteger
** Se a classe é nula, Enum ou abstrata deve ser retornado “-1”.
62. Solução Inicial
62/68
O que o método faz?
Como reduzir a
Complexidade Ciclomática
de 21 para menos de 10?
Porque deu 21?
Está muito procedural?
Pode ser desmembrado?
63. Análise do Método
63/68
2
1
3
O método faz quatro coisas:
1 – Pré-condição
2 – Obtém os campos
3 – Classifica Int Const
4 – Contabiliza
Decomposição funcional
Possivelmente recursivo
4
64. Primeira Refatoração
64/68
1
1
2
2
3
3
4
- Criação de 3 métodos
- CC do método “countIntConst”
desceu de 21 para 5
- Soma das CC dá 23 (4
métodos)
- método “isIntConst” deu 11
Apesar de totalizar 23, os
métodos ficaram muito mais
testáveis e com
responsabilidades únicas
65. Refatoração Final
65/68
- Troca de “Ous” por um conjunto
com os tipos inteiros
- Soma das CC dá 14 (4 métodos)
- “isIntConst” desceu de 11 para 3
3
3
5
3
66. Resultado da Refatoração
66/68
Um método (CC = 21) deu lugar a quatro métodos (CC = 5,3,3,3)
Os métodos extraídos fazem só uma coisa e são facilmente reusáveis
O esforço de construção e teste de unidade é mais ou menos o mesmo,
mas a manutenção será muito mais simples no futuro
O método principal ficou com a leitura mais fácil, pois ele orquestra a
funcionalidade invocando outras três, adicionando semântica
67. Dicas Finais
67/68
Assim como no exemplo, Complexidade Ciclomática alta é um indício de
uma provável necessidade e/ou oportunidade de refatoração
Complexidade Ciclomática alta é indício de baixa ou má cobertura de
testes de unidade. É difícil testar e cobrir um código complexo
Uso frequente de análise estática com refatoração ajuda a manter a
complexidade baixa. Trate o vazamento de água continuamente
68. Muito Obrigado!
Dúvidas?
Douglas Siviotti de Alcantara
douglas.siviotti@gmail.com
github.com/siviotti
www.artesoftware.com.br
Código fonte usado nesta apresentação:
https://github.com/siviotti/ops/tree/master/src/main/java/siviotti/ops/example/cc