Desenvolvimento de qualidade em X++ vai muito além de fazer o código compilar e funcionar. O D365 F&O disponibiliza um framework robusto de verificação de best practices que analisa código-fonte em profundidade — sem necessidade de compilação — e pode ser integrado diretamente aos pipelines de CI/CD para garantir padrões de qualidade em escala.

A Base: Abstract Syntax Tree (AST)

O framework de best practices do D365 F&O é construído sobre análise de Abstract Syntax Tree (AST). O parser X++ — com capacidade de error recovery automático — constrói uma representação em árvore do código-fonte que pode ser atravessada programaticamente sem compilar o código.

Isso tem implicações práticas importantes: é possível analisar grandes bases de código X++ de forma extremamente rápida, detectando padrões problemáticos sem o overhead de uma compilação completa.

AstSweeper: Traversal com Padrão Visitor

A classe AstSweeper implementa o padrão Visitor para atravessar o AST em profundidade-primeira. Para cada tipo de nó da árvore — método, classe, expressão, statement — métodos especializados são invocados:

public class MyBestPracticeChecker extends BestPracticeAstChecker
{
    // Visitado para cada método encontrado no código
    public void visitMethod(XppMethod _method)
    {
        // Verificar se o método tem mais de 200 linhas
        if (_method.lineCount() > 200)
        {
            this.addWarning(
                _method,
                "Método muito longo. Refatore em métodos menores.",
                BestPracticeMessageSeverity::Warning
            );
        }

        next visitMethod(_method); // Continuar traversal
    }
}

Tipos de Regras: Código vs Metadados

O framework suporta dois tipos de regras:

  • Code-based rules: Analisam o AST do código X++. Ideais para detectar padrões como: uso de select sem índice, métodos excessivamente longos, variáveis não utilizadas, ou ausência de ttsbegin/ttscommit em operações de banco.
  • Metadata-based rules: Analisam os metadados dos objetos AOT (tabelas, formulários, relatórios) usando a API Microsoft.Dynamics.AX.Metadata.Metamodel. Úteis para verificar se tabelas têm índice primário definido, se formulários têm títulos, etc.

Integração com CI/CD via xppbp.exe

A ferramenta de linha de comando xppbp.exe permite executar verificações de best practices em pipelines automatizados:

# Executar best practices em um modelo específico
xppbp.exe -metadata:C:\AOSService\PackagesLocalDirectory `
           -module:MyModule `
           -xmllog:BPResults.xml `
           -suppresswarnings:true

O arquivo XML gerado pode ser consumido por ferramentas como Azure DevOps para publicar os resultados como test results ou quality gates — bloqueando merges automaticamente quando violações críticas são encontradas.

Boas Práticas Essenciais em X++

  • Nunca use select sem índice em loops: Uma query sem índice em uma tabela com milhões de registros causa full table scans e degrada a performance de toda a instância.
  • Sempre use ttsbegin/ttscommit consistentemente: Transações abertas sem commit explícito causam locks e timeouts em ambientes de produção.
  • Prefira RecordInsertList para inserção em massa: Inserir 10.000 registros um a um via table.insert() é até 100x mais lento que usar RecordInsertList.
  • Documente extensões com [ExtensionOf] explícito: Deixe claro que uma classe é uma extensão, não uma reimplementação.

Conclusão

O framework de best practices do D365 F&O é uma ferramenta poderosa que, quando integrada ao pipeline de desenvolvimento, eleva consistentemente a qualidade do código X++. Equipes que adotam essa abordagem detectam problemas no momento do desenvolvimento — e não em produção.

Na Minoru Tech, implementamos pipelines de qualidade de código X++ com integração Azure DevOps para nossos clientes. Entre em contato para conhecer nossa abordagem.