Этот документ описывает стандарты кодирования для проекта HH Auto Respond.
-
Файлы и папки:
camelCaseuserService.ts,orderHandler.ts,hhApiClient.ts
-
Vue компоненты:
PascalCaseUserProfile.vue,ResumeCard.vue,ApplicationList.vue
-
Параметры функций:
_camelCase(с префиксом подчеркивания)function getUser(_userId, _options) { ... }
-
Переменные и функции:
camelCaseconst userName = "Ivan"function fetchVacancies() { ... }
-
Классы и интерфейсы:
PascalCaseclass UserService { ... }interface IApplicationData { ... }
-
Константы:
UPPER_CASEconst MAX_APPLICATIONS_PER_DAY = 40
-
Приватные переменные:
p_camelCase(префиксp_)const p_internalCache = new Map()
-
Async функции: суффикс
Asyncasync function fetchVacanciesAsync() { ... }
Проект организован по модулям с четкой иерархией:
src/
├── modules/ # Функциональные модули
│ ├── auth/
│ │ ├── authService.ts
│ │ ├── parts/ # Внутренняя реализация (скрыта от других модулей)
│ │ │ └── tokenHelper.ts
│ │ └── index.ts # Экспорты модуля
│ └── applications/
│ ├── applicationService.ts
│ └── index.ts
├── services/ # Общие сервисы
├── repositories/ # Работа с базой данных
└── shared/ # Переиспользуемые компоненты
-
Папка
parts/— только внутри модулей- Используется для скрытия внутренней реализации
- НЕ может находиться в корне проекта
-
Ограничение файлов — не более 7-10 файлов в одной папке
- Если больше — создавайте подпапки
-
Индексные файлы — создавайте
index.tsв каждой папке// modules/auth/index.ts export { authService } from './authService' export { AuthModule } from './authModule'
- Используйте
<script setup lang="ts">для компонентов - Composition API вместо Options API
- Pinia для управления состоянием
- Vue Router для маршрутизации
<script setup lang="ts">
import { ref, computed } from 'vue'
import { useUserStore } from '@/stores/userStore'
const userStore = useUserStore()
const count = ref(0)
</script>- Избегайте
any, если не абсолютно необходимо - Используйте интерфейсы для структур данных
- Включайте строгую типизацию
interface IApplication {
id: string
vacancyId: string
status: 'sent' | 'viewed' | 'invited' | 'rejected'
appliedAt: Date
}- Используйте
async/awaitвместо промисов - Называйте асинхронные функции с суффиксом
Async
async function fetchVacanciesAsync(_resumeId: string): Promise<IVacancy[]> {
try {
const response = await hhApiClient.get(`/resumes/${_resumeId}/similar_vacancies`)
return response.data
} catch (error) {
console.error('Ошибка загрузки вакансий:', error)
throw error
}
}- Используйте
try/catchдля API запросов - Логируйте ошибки с контекстом
try {
await sendApplicationAsync(_vacancyId)
} catch (error) {
console.error(`Ошибка отправки отклика на вакансию ${_vacancyId}:`, error)
// Обработка ошибки
}- Язык: Русский
- Цель: Объяснять "почему", а не "что"
- Стиль: Краткие, без боковых комментариев
// ✅ Хороший комментарий (объясняет причину)
// HH.ru разрешает максимум 200 откликов в день для предотвращения спама
const MAX_APPLICATIONS_PER_DAY = 200
// ❌ Плохой комментарий (описывает очевидное)
// Увеличиваем счетчик на 1
count++Комментарии должны уменьшать технический долг и упрощать поддержку кода.
- Читаемость — код должен быть понятен другим разработчикам
- Модульность — разделяйте ответственность между модулями
- Типобезопасность — используйте TypeScript строго
- Простота — избегайте излишней сложности
Следование этим стандартам помогает поддерживать качество кода и упрощает командную разработку.