Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Melhorando seu código Kotlin co Detekt

Melhorando seu código Kotlin co Detekt

Talk apresentada no lançamento do TechRadar vol. 20 da ThougtWorks: https://www.thoughtworks.com/pt/radar/

O Detekt é uma ferramenta de análise estática de código para o Kotlin. Ele encontra Code Smells e complexidade de código. Você pode executá-lo a partir da linha de comando ou usar seus plugins para integração com ferramentas de desenvolvedor populares, como Gradle (para executar análise de código por meio de compilações) ou SonarQube (para executar cobertura de código além da análise de código estático) e IntelliJ. O Detekt é um ótimo complemento para construir pipelines de aplicações Kotlin.

Daniel S. Debastiani

June 06, 2019
Tweet

Transcript

  1. AVALIE Blip 56 - pág. 41 "Vale a pena explorar

    com o objetivo de compreender como isso afetará sua empresa." DETEKT NO TECH RADAR
  2. O QUE É? Análise estática é um método de depuração,

    que examina o código-fonte antes que um programa seja executado. Ele opera na árvore de sintaxe abstrata fornecida pelo compilador Kotlin. FERRAMENTA DE ANÁLISE ESTÁTICA PARA KOTLIN
  3. O QUE FAZ? O Detekt faz uma análise estática do

    código fonte Kotlin e relação a um conjunto de regras, sinalizando os trechos de código que violam tais regras. Busca pontos fracos no código-fonte que podem levar a vulnerabilidades. Analisa violação de princípios de SOLID, CleanCode e busca por problemas de performance. ANÁLISE DE CODE SMELLS E COMPLEXIDADE
  4. • Comments Rule Set (5): Reportam problemas em comentários e

    documentação do código. CommentOverPrivateFunction, CommentOverPrivateProperty, EndOfSentenceFormat, UndocumentedPublicClass • Complexity Rule Set (11): Reportam código complexo. ComplexCondition, ComplexInterface, ComplexMethod, LabeledExpression, LargeClass, LongMethod, LongParameterList • Empty-blocks Rule Set (14): Reportam existência de blocos de código vazios. EmptyCatchBlock, EmptyClassBlock, EmptyDefaultConstructor, EmptyDoWhileBlock, EmptyElseBlock, EmptyFinallyBlock • Exceptions Rule Set (13): Relatam problemas relacionados a como o código gera e manipula exceções. ExceptionRaisedInUnexpectedLocation, InstanceOfCheckForException, NotImplementedDeclaration, PrintStackTrace • Formatting Rule Set (30): Tratam de problemas de formatação. (by Ktlint) ChainWrapping, CommentSpacing, Filename, FinalNewline, ImportOrdering, Indentation, MaximumLineLength, ModifierOrdering CONJUNTO DE REGRAS PRÉ-DEFINIDAS
  5. • Naming Rule Set (17): Certificam a nomenclatura de diferentes

    partes do código. ClassNaming, ConstructorParameterNaming, EnumNaming, ForbiddenClassName, FunctionMaxLength, FunctionNaming • Performance Rule Set (4): Aponta possíveis problemas de desempenho no código. ArrayPrimitive, ForEachOnRange, SpreadOperator, UnnecessaryTemporaryInstantiation • Potential-bugs Rule Set (15): Detectam possíveis bugs. DuplicateCaseInWhenExpression, EqualsAlwaysReturnsTrueOrFalse, EqualsWithHashCodeExist, ExplicitGarbageCollectionCall • Style Rule Set (49): Verifica o estilo do código. Isso ajudará a manter o código alinhado com as diretrizes de estilo de código fornecidas. EmptyCatchBlock, EmptyClassBlock, EmptyDefaultConstructor, EmptyDoWhileBlock, EmptyElseBlock, EmptyFinallyBlock CONJUNTO DE REGRAS PRÉ-DEFINIDAS TOTAL DE 9 CONJUNTOS COM 158 REGRAS
  6. • Regra classificada pela gravidade: - Maintainability - Minor -

    CodeSmell - Defect - Warning - Style - Performance • Aplica uma penalidade de tempo que representa o débito técnico: debit. • Algumas regras podem ter os parâmetros de análise configurados. • Ao término da análise é emitido um relatório completo podendo ser exportado para HTML • É possível determinar critérios de interrupção de build/pipe de acordo com os problemas encontrados. COMO FUNCIONA A ANÁLISE?
  7. Interfaces que contém muitas funções e/ou propriedades indicam que esta

    interface está lidando com muitas coisas ao mesmo tempo. Interfaces devem seguir o princípio da responsabilidade única. Isso também irá garantir que implementações dessa interface não lidem com muitas coisas ao mesmo tempo. Interfaces grandes devem ser divididas em interfaces menores que tenham uma responsabilidade bem definida e sejam mais fáceis de entender e implementar. EX: Conjunto de regras de Complexidade Gravidade: Maintainability Debt: 20min Opções de configuração: • threshold: (default: 10) quantidade máxima de definições em uma interface • includeStaticDeclarations: (default: false) se as declarações estáticas devem ser incluídas Interface Complexa
  8. COMO UTILIZAR? Pela linha de comando: Detekt CLI Pelo Gradle:

    Groovy DSL Kotlin DSL Plain Task Pelo Maven: Ant Task CLI E PLUGINS PARA GRADLE E MAVEN*
  9. CODE SMELLS - 844 - Complexity: 114 - Empty-blocks: 46

    - Exceptions: 22 - Naming: 18 - Style: 644 EX: ANÁLISE DE UM PROJETO ANDROID REAL Overall debt: 4d 18h 45min Complexity Report: - 23995 lines of code (loc) - 19210 source lines of code (sloc) - 12947 logical lines of code (lloc) - 1025 comment lines of code (cloc) - 3703 McCabe complexity (mcc) - 844 number of total code smells - 5 % comment source ratio - 286 mcc per 1000 lloc - 65 code smells per 1000 lloc Project Statistics: - number of properties: 1128 - number of functions: 1842 - number of classes: 454 - number of packages: 58 - number of kt files: 320 Successfully generated HTML report at reports/detekt.html Build failed with 844 weighted issues (threshold defined was 10).
  10. TooGenericExceptionCaught A exceção capturada é muito genérica. Prefira capturar exceções

    específicas para o caso que está sendo tratado atualmente. CODE SMELLS: 22 FAZ SENTIDO? try { MetricsHelper.addToCart( product.totalPrice ?: 0f, product.name ?: "", product.id?.toString() ?: "") } catch (e: Exception) { Crashlytics.logException(e) } Exception Rule Set: Relatam problemas relacionados a como o código gera e manipula exceções.
  11. “Code Smell is a surface indication that usually corresponds to

    a deeper problem in the system.” - Martin Fowler
  12. “Code Smell is a hint that something has gone wrong

    somewhere in your code. Use the smell to track down the problem.” - Kent Beck
  13. POR QUE UTILIZAR? Detekt é facilmente integrado com ferramentas de

    C.I. (CircleCI e SonarQube) Todos os conjuntos de regras podem ser customizados. Você pode criar as regras específicas para seu projeto. CODE REVIEW AUTOMATIZADO
  14. #TWTechRadar Please share your feedback with [email protected] THANK YOU Daniel

    Santin Debastiani Consultant Developer @dsdebastiani