Skip to content

Padrões de Código

Este documento descreve os padrões de codificação e convenções para o projeto Hatcher. Seguir esses padrões garante consistência, manutenibilidade e código de alta qualidade em toda a base de código.

📊 Status de Conformidade: Em dezembro de 2024, nossa base de código atinge 100% de conformidade com esses padrões após auditoria abrangente e melhorias no código.

Princípios Gerais

Qualidade do Código

  • Clareza sobre esperteza: Escrever código que seja fácil de ler e entender
  • Consistência: Seguir padrões estabelecidos em toda a base de código
  • Manutenibilidade: Escrever código que seja fácil de modificar e estender
  • Performance: Considerar implicações de performance, mas priorizar legibilidade primeiro
  • Documentação: Todo código deve ser autodocumentável com comentários claros quando necessário

Padrões de Idioma

  • Apenas Inglês: Todos os comentários, documentação e nomes de variáveis devem estar em inglês
  • Nomenclatura clara: Usar nomes descritivos que indiquem claramente o propósito
  • Sem abreviações: Evitar abreviações a menos que sejam amplamente compreendidas (ex: API, URL)

Organização de Arquivos

  • Responsabilidade única: Cada arquivo deve ter um propósito único e bem definido
  • Agrupamento lógico: Organizar funcionalidades relacionadas juntas
  • Nomenclatura clara: Usar nomes descritivos que indiquem claramente o propósito

Padrões de Formatação

Estilo de Código (Aplicado pelo ESLint)

typescript
// ✅ Bom: Aspas simples, sem ponto e vírgula, indentação de 2 espaços
const message = 'Hello World'
const config = {
  apiUrl: 'https://api.hatche.rs',
  timeout: 5000,
}

// ❌ Evitar: Aspas duplas, ponto e vírgula, indentação inconsistente
const message = "Hello World";
const config = {
    apiUrl: "https://api.hatche.rs",
    timeout: 5000;
};

Tratamento de Erros

typescript
// ✅ Bom: Tratamento de erro descritivo
try {
  const result = await fetchUserData()
  return result
} catch (error) {
  console.error('Failed to fetch user data:', error)
  throw new Error(`User data fetch failed: ${error.message}`)
}

// ❌ Evitar: Tratamento de erro genérico
try {
  const result = await fetchUserData()
  return result
} catch (e) {
  console.error(e)
  throw e
}

Padrões TypeScript

Definições de Tipos

typescript
// ✅ Bom: Usar interfaces para formas de objetos
interface UserData {
  id: string
  name: string
  email: string
  isActive: boolean
}

// ❌ Evitar: Type aliases para formas de objetos simples
type UserData = {
  id: string
  name: string
}

Convenções de Nomenclatura

typescript
// ✅ Bom: PascalCase para tipos, interfaces, classes
interface ApiResponse {}
class UserService {}
type ComponentProps = {}

// ✅ Bom: camelCase para variáveis, funções, métodos
const userName = 'john'
function getUserData() {}
const handleClick = () => {}

// ✅ Bom: SCREAMING_SNAKE_CASE para constantes
const API_BASE_URL = 'https://api.hatche.rs'
const MAX_RETRY_ATTEMPTS = 3

Padrões Vue.js

Estrutura de Componente

vue
<!-- ✅ Bom: Usar Composition API com <script setup> -->
<script setup lang="ts">
interface Props {
  title: string
  isVisible?: boolean
}

interface Emits {
  close: []
  submit: [data: FormData]
}

const props = withDefaults(defineProps<Props>(), {
  isVisible: true,
})

const emit = defineEmits<Emits>()

// Composables no topo
const { user } = useAuth()
const { theme } = useTheme()

// Dados reativos
const isLoading = ref(false)
const formData = reactive({
  name: '',
  email: '',
})

// Propriedades computadas
const isFormValid = computed(() => {
  return formData.name.length > 0 && formData.email.includes('@')
})

// Métodos
function handleSubmit() {
  if (!isFormValid.value) return

  isLoading.value = true
  emit('submit', formData)
}
</script>

<template>
  <div v-if="isVisible" class="modal">
    <h2>{{ title }}</h2>
    <form @submit.prevent="handleSubmit">
      <!-- Conteúdo do formulário -->
    </form>
  </div>
</template>

<style scoped>
.modal {
  /* Styles */
}
</style>

Padrões de Estilo

Arquitetura CSS

scss
// ✅ Bom: Usar propriedades customizadas CSS para temas
:root {
  --hatcher-primary: #646cff;
  --hatcher-secondary: #42b883;
  --hatcher-background: #1a1a1a;
  --hatcher-text: #ffffff;

  --spacing-xs: 0.25rem;
  --spacing-sm: 0.5rem;
  --spacing-md: 1rem;
  --spacing-lg: 1.5rem;
  --spacing-xl: 2rem;
}

// ✅ Bom: Metodologia BEM para nomes de classes
.code-editor {
  /* Block */
}

.code-editor__toolbar {
  /* Element */
}

.code-editor__button {
  /* Element */
}

.code-editor__button--active {
  /* Modifier */
}

Padrões de Teste

Testes Unitários

typescript
// ✅ Bom: Estrutura de teste descritiva
describe('useVisualSelection', () => {
  describe('startSelection', () => {
    it('should set isSelecting to true', () => {
      const { isSelecting, startSelection } = useVisualSelection()

      startSelection()

      expect(isSelecting.value).toBe(true)
    })
  })
})

Padrões de Documentação

Comentários de Código

typescript
// ✅ Bom: Explicar PORQUÊ, não O QUÊ
function calculateOptimalAIPrompt(context: ProjectContext): string {
  // Limitamos o tamanho do contexto para prevenir overflow de tokens nos modelos AI
  // enquanto garantimos informações suficientes para geração de código precisa
  const maxContextSize = 4000

  if (context.size > maxContextSize) {
    return compressContext(context, maxContextSize)
  }

  return buildPrompt(context)
}

Convenções Git

Mensagens de Commit

Seguimos Conventional Commits:

bash
# ✅ Bom: Mensagens de commit claras e descritivas
feat: add visual element selection to code generation
fix: resolve memory leak in AI response processing
docs: update installation guide for macOS
style: improve code formatting in user service
refactor: extract common AI prompt logic

Aplicação

Esses padrões são aplicados através de:

  • ESLint: Verificação automatizada de estilo de código
  • TypeScript: Segurança de tipos e consistência
  • Prettier: Formatação de código
  • Husky: Hooks de pré-commit
  • CI/CD: Testes e linting automatizados

Desenvolvimento Local

bash
# Executar linting
pnpm lint

# Corrigir problemas auto-corregíveis
pnpm lint:fix

# Verificação de tipos
pnpm typecheck

# Executar testes
pnpm test

Esses padrões são documentos vivos que evoluem com o projeto e feedback da comunidade.

Released under the MIT License. Built with ❤️ by Chriss Mejía and the Hatcher community.