Object Calisthenics

🎶

Object CalisthenicsDefiniçãoAs 9 regras do Object Calisthenics:Objetivo: Quando usar?Videos YouTubeReferênciasOrigem e Referências PrincipaisOnde Encontrar?Comparação com Outras MetodologiasReferência Primária (Origem do Conceito)Referências Secundárias (Influências e Contexto)ObservaçõesAplicando em Python1. Clean Code & Boas Práticas em PythonLivro mais referenciado (Clean Code - Robert C. Martin)Adaptação para PythonLivro específico para Python2. Object Calisthenics & Design Orientado a Objetos em PythonOrigem do Object CalisthenicsAplicação Prática em PythonLivro Avançado (Python OO)3. Artigos Acadêmicos Complementares4. Outras Referências?ExemploCenário: Validar acesso de usuárioVersão Inicial (Com else)Versão Refatorada (Sem else)Opção 1: Early ReturnsOpção 2: Lógica Booleana ExplícitaExemplo Completo em PythonPor Que Evitar else?Outras Técnicas para Eliminar else**Aplicando em C++1. Referências para Clean Code em C++Livros Clássicos1. "Clean Code: A Handbook of Agile Software Craftsmanship"2. "Clean C++: Sustainable Software Development Patterns and Best Practices"3. "Effective C++: 55 Specific Ways to Improve Your Programs and Designs"2. Referências para Object Calisthenics em C++Origem do ConceitoAplicação em C++Artigo: "Object Calisthenics Applied to C++"Discussão no Stack Overflow3. Artigos Acadêmicos e Guias Práticos1. "Modern C++ Best Practices" (Microsoft Docs)2. "C++ Core Guidelines" (Bjarne Stroustrup & Herb Sutter)3. "SOLID Principles in C++" (Artigo Medium)4. Exemplo Prático (C++ com Object Calisthenics)Regra: "No else"AntesDepois (Sem else)5. Ferramentas para Aplicar Clean Code em C++ResumoAplicações em Sistemas Embarcados1. Princípios Adaptados para EmbarcadosA. Clean Code em Embarcados (C/C++)B. Object Calisthenics Adaptado2. Referências para EmbarcadosLivrosArtigos e Guias Online3. Exemplo Prático (C para Embarcados)Antes (Código Não Otimizado)Depois (Clean Code + Embarcados)4. Ferramentas para EmbarcadosResumoExemplo de máquina de estados sem elseCenário: Controlador de Motor DC com 3 EstadosVersão Ruim (Com if/else Aninhados)Versão Refatorada (Máquina de Estados sem else)Passo 1: Definir os EstadosPasso 2: Implementar Transições sem elseVersão com Table-Driven FSM (Avançado)Quando Usar?Referências Exemplo no Mundo RealExemplo para STM32Hardware Utilizado1. Definindo os Estados e Hardware (CubeMX)Configuração do PWM (CubeMX)Código: Estados e Inicialização2. Máquina de Estados sem elseImplementação da FSM3. Loop Principal (main.c)4. Explicação das Melhorias5. Teste no Hardware RealReferências para STM32Próximos Passos ?


Definição

Object Calisthenics é um conjunto de 9 práticas ou regras para melhorar o design de código orientado a objetos (OO), proposto por Jeff Bay no livro The ThoughtWorks Anthology. O objetivo é exercitar boas práticas de programação, tornando o código mais legível, maintainable e extensível através de restrições deliberadas que forçam o uso eficiente de OO.

As 9 regras do Object Calisthenics:

  1. Apenas um nível de indentação por método

    • Evitar aninhamento excessivo (como loops ou if dentro de if).
    • Solução: Extrair lógica em métodos menores.
  2. Não use a palavra-chave else

    • Substitua else por estruturas como early returns ou polimorfismo.
    • Exemplo: Usar return antecipado ou Strategy Pattern.
  3. Envolva todos os tipos primitivos e strings

    • Evite primitivos (como int, string) para representar conceitos de domínio.
    • Exemplo: Criar uma classe Cpf em vez de usar string cpf.
  4. Coleções como first-class citizens

    • Encapsule coleções (listas, arrays) em classes próprias com métodos específicos.
    • Exemplo: class Pedido { List<Item> itens; }class ItensPedido { ... }.
  5. Apenas um ponto (.) por linha (Lei de Demeter)

    • Evitar cadeias de chamadas como obj.getA().getB().doSomething().
    • Solução: Encapsular a lógica em métodos ou classes.
  6. Não abrevie nomes

    • Nomes descritivos (ex: Cliente em vez de Cli) melhoram a legibilidade.
    • Evite abreviações que exigem interpretação.
  7. Mantenha entidades pequenas

    • Classes com no máximo 50 linhas e métodos com até 5 linhas.
    • Força a divisão de responsabilidades.
  8. Nenhuma classe com mais de duas variáveis de instância

    • Limita a complexidade das classes, incentivando coesão.
    • Exceção: Classes que agrupam dados simples (como Point(x, y)).
  9. Não use getters/setters (ou propriedades públicas)

    • Evite expor estado interno. Prefira métodos com comportamentos significativos.
    • Exemplo: cliente.efetuarPagamento() em vez de cliente.setSaldo(...).

Objetivo:

Essas regras forçam você a pensar em design orientado a objetos puro, evitando vícios de código procedural (como classes "God Objects") e promovendo:

Quando usar?

Você já aplicou alguma dessas regras intuitivamente? Alguma delas parece especialmente útil (ou controversa)?

Videos YouTube

Referências

A metodologia Object Calisthenics foi proposta originalmente por Jeff Bay em um capítulo do livro "The ThoughtWorks Anthology: Essays on Software Technology and Innovation" (2008), publicado pela editora Pragmatic Bookshelf. Esse livro é uma coletânea de artigos escritos por profissionais da ThoughtWorks, uma consultoria de software conhecida por promover boas práticas de engenharia de software.

Origem e Referências Principais

  1. Fonte Original:

    • O ensaio de Jeff Bay, intitulado "Object Calisthenics", aparece no Capítulo 6 do livro The ThoughtWorks Anthology.
    • Não é um artigo acadêmico, mas sim um texto prático, focado em exercícios para melhorar habilidades em programação orientada a objetos (OO).
  2. Contexto e Influências:

    • A ideia se alinha com princípios de OO clássicos, como os do "Design Orientado a Objetos" (Bertrand Meyer, Object-Oriented Software Construction) e os SOLID principles (Robert C. Martin).
    • Também reflete conceitos de "Clean Code" (livro de Robert C. Martin) e "Domain-Driven Design" (Eric Evans).
  3. Disseminação:

    • O termo ganhou popularidade em comunidades ágeis e em exercícios de coding katas, mas não há um paper acadêmico formal associado. É mais uma prática difundida em blogs e workshops.

Onde Encontrar?

Comparação com Outras Metodologias

Se quiser explorar mais, recomendo o livro original ou materiais sobre refatoração (Martin Fowler) e design OO. Você já teve contato com algum desses autores?

Aqui está a referência formal no estilo Harvard, incluindo links disponíveis para as fontes principais relacionadas ao Object Calisthenics:


Referência Primária (Origem do Conceito)

Bay, J. (2008) Object Calisthenics. In: The ThoughtWorks Anthology: Essays on Software Technology and Innovation. 1st ed. Raleigh, NC: Pragmatic Bookshelf, pp. 117–136.


Referências Secundárias (Influências e Contexto)

  1. Martin, R.C. (2000) Design Principles and Design Patterns. [Online]

    • Link: Object Mentor Blog (Base para os princípios SOLID, que influenciaram o Object Calisthenics).
  2. Fowler, M. (1999) Refactoring: Improving the Design of Existing Code. 1st ed. Boston: Addison-Wesley.

    • ISBN: 978-0201485677.
  3. Evans, E. (2003) Domain-Driven Design: Tackling Complexity in the Heart of Software. 1st ed. Boston: Addison-Wesley.

    • ISBN: 978-0321125217.

Observações


Aqui estão as referências mais contundentes e amplamente citadas para guiar a produção de código em Python usando Clean Code e Object Calisthenics, incluindo livros clássicos, artigos influentes e materiais específicos para Python:


Aplicando em Python

1. Clean Code & Boas Práticas em Python

Livro mais referenciado (Clean Code - Robert C. Martin)

Martin, R.C. (2008) Clean Code: A Handbook of Agile Software Craftsmanship. 1st ed. Upper Saddle River, NJ: Prentice Hall.

Adaptação para Python

Van Rossum, G., Warsaw, B. & Coghlan, N. (2001) PEP 8 -- Style Guide for Python Code. [Online] Python Software Foundation.

Livro específico para Python

Meier, K. (2023) Clean Code in Python: Develop maintainable and efficient code. 2nd ed. Birmingham: Packt Publishing.


2. Object Calisthenics & Design Orientado a Objetos em Python

Origem do Object Calisthenics

Bay, J. (2008) Object Calisthenics. In: The ThoughtWorks Anthology. 1st ed. Raleigh, NC: Pragmatic Bookshelf, pp. 117–136.

Aplicação Prática em Python

Artigo: "Python and the Principles of Object-Oriented Design" (2020) por Brandon Rhodes.

Livro Avançado (Python OO)

Lott, S.F. (2019) Python Object-Oriented Programming. 4th ed. Birmingham: Packt Publishing.


3. Artigos Acadêmicos Complementares

  1. "How to Write Clean Code?" (2019) – Uma revisão sistemática de boas práticas.

  2. "Pythonic Code Review" (2021) – Critérios para código limpo em Python.


4. Outras Referências?


Exemplo

Aqui está um exemplo prático em Python aplicando a regra "No else" do Object Calisthenics, com comparação entre o código antes e depois da refatoração:


Cenário: Validar acesso de usuário

Suponha que precisamos verificar se um usuário tem permissão para acessar um recurso, com duas condições:

  1. O usuário deve estar logado.
  2. O usuário deve ser admin ou ter idade ≥ 18.

Versão Inicial (Com else)

Problemas:


Versão Refatorada (Sem else)

Regra aplicada: Substituir else por early returns ou lógica booleana.

Opção 1: Early Returns

Melhorias:

Opção 2: Lógica Booleana Explícita

Melhorias:


Exemplo Completo em Python


Por Que Evitar else?

  1. Reduz complexidade ciclomática: Menos ramificações = código mais testável.
  2. Legibilidade: Condições positivas são mais fáceis de entender.
  3. Alinhamento com Python: O Zen of Python diz: "Flat is better than nested".

Outras Técnicas para Eliminar else**

Quer ver um exemplo com polimorfismo ou outra técnica? Posso adaptar!


Aplicando em C++

Os princípios de Clean Code e Object Calisthenics são totalmente aplicáveis em C++ e podem melhorar significativamente a qualidade do seu código. Abaixo estão as melhores referências (livros, artigos e páginas web) para guiar essa prática em C++:


1. Referências para Clean Code em C++

Livros Clássicos

1. "Clean Code: A Handbook of Agile Software Craftsmanship"

2. "Clean C++: Sustainable Software Development Patterns and Best Practices"

3. "Effective C++: 55 Specific Ways to Improve Your Programs and Designs"


2. Referências para Object Calisthenics em C++

Origem do Conceito

Aplicação em C++

Artigo: "Object Calisthenics Applied to C++"

Discussão no Stack Overflow


3. Artigos Acadêmicos e Guias Práticos

1. "Modern C++ Best Practices" (Microsoft Docs)

2. "C++ Core Guidelines" (Bjarne Stroustrup & Herb Sutter)

3. "SOLID Principles in C++" (Artigo Medium)


4. Exemplo Prático (C++ com Object Calisthenics)

Regra: "No else"

Antes

Depois (Sem else)

Melhorias:


5. Ferramentas para Aplicar Clean Code em C++

  1. Clang-Tidy: Analisa código C++ seguindo boas práticas.

  2. Cppcheck: Verificador estático para C++.


Resumo


Aplicações em Sistemas Embarcados

Os princípios de Clean Code e Object Calisthenics podem ser aplicados em C/C++ para sistemas embarcados, mas com adaptações devido às restrições de RAM, processamento e armazenamento. Abaixo, listo as referências mais citadas e como adaptar essas práticas para ambientes de baixo recurso.


1. Princípios Adaptados para Embarcados

A. Clean Code em Embarcados (C/C++)

  1. Funções pequenas e legíveis

    • Mantenha funções curtas (< 20 linhas) para facilitar depuração em sistemas limitados.

    • Exemplo:

  2. Evite alocação dinâmica

    • Use buffers estáticos ou pools de memória pré-alocados.
  1. Macros vs. Funções inline

    • Prefira inline ou macros para otimização, mas sem sacrificar legibilidade.

B. Object Calisthenics Adaptado

  1. Regra: "Nenhuma classe com >2 variáveis de instância"

    • Em C, use structs pequenas (ex: struct Sensor { int value; bool valid; }).
  2. Regra: "Não use else"

    • Substitua por early returns ou máquinas de estado (switch-case).
  3. Regra: "Encapsule primitivos"

    • Em C, use typedef para dar semântica (ex: typedef uint32_t speed_mps_t).

2. Referências para Embarcados

Livros

  1. "Test-Driven Development for Embedded C" (James W. Grenning, 2011)

    • ISBN: 978-1934356623
    • Foco: Clean Code + TDD em sistemas embarcados.
  2. "Embedded C Coding Standard" (Barr Group, 2018)

    • Link: Barr Group
    • Foco: Boas práticas para evitar bugs críticos.
  3. "Making Embedded Systems" (Elecia White, 2011)

    • ISBN: 978-1449302146
    • Foco: Design limpo para microcontroladores.

Artigos e Guias Online

  1. NASA C Coding Standard

  2. MISRA C/C++ (Padrão industrial para segurança crítica)

    • Link: MISRA
    • Foco: Restrições para código previsível (ex: sem goto).
  3. "Embedded Systems Best Practices" (ARM Developer)


3. Exemplo Prático (C para Embarcados)

Antes (Código Não Otimizado)

Depois (Clean Code + Embarcados)

Melhorias:


4. Ferramentas para Embarcados

  1. Cppcheck

    • Verificador estático para C/C++ em sistemas limitados.
    • Link: Cppcheck
  2. PVS-Studio

    • Analisa código C/C++ para bugs críticos.
    • Link: PVS-Studio
  3. FreeRTOS Best Practices

    • Guia para sistemas RTOS.
    • Link: FreeRTOS

Resumo


Exemplo de máquina de estados sem else

Segue um exemplo prático de máquina de estados (FSM - Finite State Machine) em C para sistemas embarcados, substituindo condicionais aninhadas (if/else ou switch-case) por uma implementação mais limpa e eficiente, seguindo os princípios de Clean Code e Object Calisthenics:


Cenário: Controlador de Motor DC com 3 Estados

  1. IDLE: Motor parado.
  2. ACCELERATING: Motor acelerando até a velocidade desejada.
  3. RUNNING: Motor em velocidade constante.

Versão Ruim (Com if/else Aninhados)

Problemas:


Versão Refatorada (Máquina de Estados sem else)

Passo 1: Definir os Estados

Passo 2: Implementar Transições sem else

Vantagens:


Versão com Table-Driven FSM (Avançado)

Para sistemas mais complexos, use uma tabela de transições:

Vantagens:


Quando Usar?

  1. Sistemas embarcados com RTOS (ex: FreeRTOS).
  2. Protocolos de comunicação (ex: UART, CAN).
  3. Controle de hardware (ex: motores, sensores).

Referências

Para Máquinas de Estados em Embarcados:

  1. "Practical Statecharts in C/C++" (Miro Samek, 2002)

    • ISBN: 978-1578201105
    • Foco: FSMs para sistemas embarcados.
  2. Artigo: "State Machines for Event-Driven Systems" (Embedded.com)

  3. MISRA C Guidelines (Regra 15.1: Evite switch aninhados)


Exemplo no Mundo Real


Exemplo para STM32

Segue um exemplo com hardware real (ex: STM32 + PWM)...

Aqui está um exemplo completo de máquina de estados (FSM) para controlar um motor DC com PWM em uma placa STM32 (usando HAL e CubeMX), seguindo princípios de Clean Code e sem else desnecessários:


Hardware Utilizado


1. Definindo os Estados e Hardware (CubeMX)

Configuração do PWM (CubeMX)

  1. Abra o CubeMX e selecione um timer (ex: TIM3).

  2. Ative um canal PWM (ex: TIM3_CH1 em PB4).

  3. Configure:

    • Prescaler: 0.
    • Counter Period: 1000 (para PWM de 10 bits).

Código: Estados e Inicialização


2. Máquina de Estados sem else

Implementação da FSM


3. Loop Principal (main.c)


4. Explicação das Melhorias

  1. Sem else:

    • Transições são tratadas diretamente nos if dos estados.
    • Exemplo: Em STATE_ACCELERATING, a mudança para STATE_RUNNING ocorre sem else.
  2. Baixo Acoplamento:

    • A lógica de cada estado está isolada.
  3. Eficiência em Embarcados:

    • Sem alocação dinâmica.
    • PWM controlado diretamente pelo hardware.

5. Teste no Hardware Real

  1. Conecte um motor DC ao PB4 (saída PWM) e um botão em PC13.

  2. Ao pressionar o botão:

    • O motor acelera suavemente até a velocidade máxima.
    • Pressione novamente para voltar ao estado IDLE.

Referências para STM32

  1. Manual do PWM no STM32 (AN4776):
  1. Projeto no GitHub:
  1. Livro: "Mastering STM32" (Carmine Noviello):

    A step-by-step guide to the most complete ARM Cortex-M platform, using the official STM32Cube development environment.


Próximos Passos ?


Fernando Passold, 02/05/2025