Skip to content

Стандарты Кодирования

Этот документ описывает стандарты кодирования и соглашения для проекта Hatcher. Следование этим стандартам обеспечивает согласованность, поддерживаемость и высокое качество кода во всей кодовой базе.

📊 Статус Соответствия: По состоянию на декабрь 2024 года наша кодовая база достигает 100% соответствия этим стандартам после комплексного аудита и улучшений кода.

Общие Принципы

Качество Кода

  • Ясность, а не хитроумность: Писать код, который легко читать и понимать
  • Согласованность: Следовать установленным паттернам во всей кодовой базе
  • Поддерживаемость: Писать код, который легко изменять и расширять
  • Производительность: Учитывать влияние на производительность, но в первую очередь приоритизировать читаемость
  • Документация: Весь код должен быть само-документированным с ясными комментариями при необходимости

Языковые Стандарты

  • Только английский: Все комментарии, документация и имена переменных должны быть на английском языке
  • Ясное именование: Использовать описательные имена, которые ясно указывают на назначение
  • Без сокращений: Избегать сокращений, кроме широко понимаемых (например, API, URL)

Организация Файлов

  • Единая ответственность: Каждый файл должен иметь единую, четко определенную цель
  • Логическая группировка: Организовывать связанный функционал вместе
  • Ясное именование: Использовать описательные имена, которые ясно указывают на назначение

Стандарты Форматирования

Стиль Кода (Принудительно через ESLint)

typescript
// ✅ Хорошо: Одинарные кавычки, без точек с запятой, отступ в 2 пробела
const message = 'Hello World'
const config = {
  apiUrl: 'https://api.hatche.rs',
  timeout: 5000,
}

// ❌ Избегать: Двойные кавычки, точки с запятой, непоследовательные отступы
const message = "Hello World";
const config = {
    apiUrl: "https://api.hatche.rs",
    timeout: 5000;
};

Обработка Ошибок

typescript
// ✅ Хорошо: Описательная обработка ошибок
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}`)
}

// ❌ Избегать: Общая обработка ошибок
try {
  const result = await fetchUserData()
  return result
} catch (e) {
  console.error(e)
  throw e
}

Стандарты TypeScript

Определения Типов

typescript
// ✅ Хорошо: Использовать интерфейсы для форм объектов
interface UserData {
  id: string
  name: string
  email: string
  isActive: boolean
}

// ❌ Избегать: Псевдонимы типов для простых форм объектов
type UserData = {
  id: string
  name: string
}

Соглашения по Именованию

typescript
// ✅ Хорошо: PascalCase для типов, интерфейсов, классов
interface ApiResponse {}
class UserService {}
type ComponentProps = {}

// ✅ Хорошо: camelCase для переменных, функций, методов
const userName = 'john'
function getUserData() {}
const handleClick = () => {}

// ✅ Хорошо: SCREAMING_SNAKE_CASE для констант
const API_BASE_URL = 'https://api.hatche.rs'
const MAX_RETRY_ATTEMPTS = 3

Дизайн Функций и Методов

typescript
// ✅ Хорошо: Ясные сигнатуры функций с правильной типизацией
function processUserData(user: UserData): Promise<ProcessedUser> {
  // Реализация
}

// ✅ Хорошо: Использовать JSDoc для публичных API
/**
 * Генерирует модификации кода на основе визуальных выборок
 * @param selection - Выбранные DOM элементы
 * @param context - Текущий контекст проекта
 * @returns Promise, разрешающийся в сгенерированный код
 */
async function generateCodeFromSelection(
  selection: DOMSelection[],
  context: ProjectContext
): Promise<CodeModification[]> {
  // Реализация
}

Стандарты Vue.js

Структура Компонента

vue
<!-- ✅ Хорошо: Использовать Composition API с <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>()

// Композиции в верхней части
const { user } = useAuth()
const { theme } = useTheme()

// Реактивные данные
const isLoading = ref(false)
const formData = reactive({
  name: '',
  email: '',
})

// Вычисляемые свойства
const isFormValid = computed(() => {
  return formData.name.length > 0 && formData.email.includes('@')
})

// Методы
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">
      <!-- Содержимое формы -->
    </form>
  </div>
</template>

<style scoped>
.modal {
  /* Стили */
}
</style>

Стандарты Стилей

CSS Архитектура

scss
// ✅ Хорошо: Использовать CSS кастомные свойства для тем
: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;
}

// ✅ Хорошо: Методология BEM для имен классов
.code-editor {
  /* Block */
}

.code-editor__toolbar {
  /* Element */
}

.code-editor__button {
  /* Element */
}

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

Стандарты Тестирования

Модульные Тесты

typescript
// ✅ Хорошо: Описательная структура тестов
describe('useVisualSelection', () => {
  describe('startSelection', () => {
    it('should set isSelecting to true', () => {
      const { isSelecting, startSelection } = useVisualSelection()

      startSelection()

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

Стандарты Документации

Комментарии к Коду

typescript
// ✅ Хорошо: Объяснять ПОЧЕМУ, а не ЧТО
function calculateOptimalAIPrompt(context: ProjectContext): string {
  // Мы ограничиваем размер контекста для предотвращения переполнения токенов в AI моделях
  // при этом обеспечивая достаточно информации для точной генерации кода
  const maxContextSize = 4000

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

  return buildPrompt(context)
}

Git Соглашения

Сообщения Коммитов

Мы следуем Conventional Commits:

bash
# ✅ Хорошо: Ясные, описательные сообщения коммитов
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

Применение

Эти стандарты применяются через:

  • ESLint: Автоматизированная проверка стиля кода
  • TypeScript: Безопасность типов и согласованность
  • Prettier: Форматирование кода
  • Husky: Pre-commit хуки
  • CI/CD: Автоматизированное тестирование и линтинг

Локальная Разработка

bash
# Запустить линтинг
pnpm lint

# Исправить автоматически исправимые проблемы
pnpm lint:fix

# Проверка типов
pnpm typecheck

# Запустить тесты
pnpm test

Эти стандарты являются живыми документами, которые развиваются вместе с проектом и обратной связью сообщества.

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