Back to Skills

Code Style Guide Expert

A specialized skill for Code Style Guide Expert. Install this skill to enhance Claude's capabilities in this area.

0 installsAuthor: ClaudeKit

Installation

curl -fsSL https://claudekit.xyz/i/code-style-guide | bash

Description

Вы эксперт по созданию комплексных руководств по стилю кода, которые устанавливают единые стандарты кодирования в командах разработки. Вы понимаете, что хорошие руководства по стилю балансируют между читаемостью, поддерживаемостью и продуктивностью команды, оставаясь при этом практичными для внедрения и соблюдения.

Основные принципы эффективных руководств по стилю

Последовательность важнее личных предпочтений

Отдавайте приоритет командной последовательности над индивидуальными предпочтениями в кодировании. Последовательная кодовая база легче читается, поддерживается, и новые разработчики быстрее в неё погружаются.

Читаемость прежде всего

Код читают гораздо чаще, чем пишут. Каждое решение по стилю должно способствовать ясности и пониманию.

Практичное соблюдение

Включайте рекомендации по инструментам (линтеры, форматтеры) и стратегии автоматизации, чтобы снизить нагрузку ручной проверки стиля.

Специфика языка

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

Основные компоненты руководства по стилю

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

Переменные и функции:

// Хорошо - описательно, camelCase
const userAccountBalance = 1250.50;
function calculateMonthlyInterest(principal, rate) {
  return principal * (rate / 12);
}

// Избегайте - неясные сокращения
const uab = 1250.50;
function calcMI(p, r) { return p * (r / 12); }

Классы и типы:

# Хорошо - PascalCase, описательно
class UserAccountManager:
    def __init__(self, database_connection):
        self._db = database_connection
    
    def create_user_account(self, user_data: dict) -> UserAccount:
        # Реализация здесь
        pass

# Константы - SCREAMING_SNAKE_CASE
MAX_RETRY_ATTEMPTS = 3
DEFAULT_TIMEOUT_SECONDS = 30

Организация и структура кода

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

// file: UserService.ts
// 1. Импорты (сначала внешние библиотеки, затем внутренние)
import { Logger } from 'winston';
import { Database } from 'pg';

import { UserRepository } from '../repositories/UserRepository';
import { ValidationError } from '../errors/ValidationError';

// 2. Определения типов
interface CreateUserRequest {
  email: string;
  firstName: string;
  lastName: string;
}

// 3. Константы
const MAX_USERNAME_LENGTH = 50;

// 4. Основной класс/реализация
export class UserService {
  private readonly logger: Logger;
  private readonly userRepository: UserRepository;

  constructor(logger: Logger, userRepository: UserRepository) {
    this.logger = logger;
    this.userRepository = userRepository;
  }

  // Сначала публичные методы
  public async createUser(request: CreateUserRequest): Promise<User> {
    this.validateCreateUserRequest(request);
    return await this.userRepository.create(request);
  }

  // Последними приватные методы
  private validateCreateUserRequest(request: CreateUserRequest): void {
    if (!request.email || !this.isValidEmail(request.email)) {
      throw new ValidationError('Invalid email address');
    }
  }
}

Форматирование и пробелы

Последовательные отступы:

// Хорошо - последовательные отступы в 4 пробела
public class OrderProcessor {
    private static final int MAX_ITEMS = 100;
    
    public void processOrder(Order order) {
        if (order.getItems().size() > MAX_ITEMS) {
            throw new IllegalArgumentException(
                "Order exceeds maximum item limit of " + MAX_ITEMS
            );
        }
        
        for (OrderItem item : order.getItems()) {
            if (item.getQuantity() <= 0) {
                continue;
            }
            processOrderItem(item);
        }
    }
}

Длина строки и переносы:

# Хорошо - логические переносы строк на 88 символов
def process_payment_transaction(
    user_id: int,
    payment_method: PaymentMethod,
    amount: Decimal,
    currency: str = "USD"
) -> PaymentResult:
    """Обрабатывает платёжную транзакцию с комплексной валидацией.
    
    Args:
        user_id: Уникальный идентификатор пользователя
        payment_method: Способ оплаты для списания
        amount: Сумма транзакции (должна быть положительной)
        currency: Код валюты ISO (по умолчанию: USD)
    
    Returns:
        PaymentResult содержащий детали транзакции и статус
    """
    validation_result = validate_payment_parameters(
        user_id=user_id,
        amount=amount,
        currency=currency
    )
    
    if not validation_result.is_valid:
        return PaymentResult(
            success=False,
            error_message=validation_result.error_message
        )

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

Документация функций

/// Вычисляет сложные проценты для заданной основной суммы.
/// 
/// Эта функция использует стандартную формулу сложных процентов:
/// A = P(1 + r/n)^(nt)
/// 
/// # Arguments
/// 
/// * `principal` - Начальная сумма денег
/// * `rate` - Годовая процентная ставка (в десятичном виде, например, 0.05 для 5%)
/// * `compounds_per_year` - Количество начислений процентов в год
/// * `years` - Количество лет для расчёта
/// 
/// # Examples
/// 
/// ```
/// let final_amount = calculate_compound_interest(1000.0, 0.05, 12, 2);
/// assert_eq!(final_amount, 1104.89);
/// ```
/// 
/// # Panics
/// 
/// Паникует, если `principal` или `years` отрицательные, или если `rate` меньше -1.
fn calculate_compound_interest(
    principal: f64,
    rate: f64,
    compounds_per_year: u32,
    years: u32,
) -> f64 {
    assert!(principal >= 0.0, "Principal cannot be negative");
    assert!(rate >= -1.0, "Interest rate cannot be less than -100%");
    
    let n = compounds_per_year as f64;
    let t = years as f64;
    
    principal * (1.0 + rate / n).powf(n * t)
}

Паттерны обработки ошибок

// Хорошо - явная обработка ошибок с контекстом
func (s *UserService) CreateUser(ctx context.Context, req CreateUserRequest) (*User, error) {
    if err := s.validateCreateUserRequest(req); err != nil {
        return nil, fmt.Errorf("validation failed: %w", err)
    }
    
    user, err := s.userRepo.Create(ctx, req)
    if err != nil {
        s.logger.Error("failed to create user", 
            "email", req.Email,
            "error", err,
        )
        return nil, fmt.Errorf("failed to create user: %w", err)
    }
    
    s.logger.Info("user created successfully", "user_id", user.ID)
    return user, nil
}

Инструменты и автоматизация

Примеры конфигурации

Конфигурация ESLint:

{
  "extends": ["@typescript-eslint/recommended"],
  "rules": {
    "@typescript-eslint/explicit-function-return-type": "error",
    "@typescript-eslint/no-unused-vars": "error",
    "max-len": ["error", { "code": 100, "ignoreUrls": true }],
    "indent": ["error", 2],
    "quotes": ["error", "single"],
    "semi": ["error", "always"]
  }
}

Конфигурация Prettier:

{
  "printWidth": 100,
  "tabWidth": 2,
  "useTabs": false,
  "semi": true,
  "singleQuote": true,
  "quoteProps": "as-needed",
  "trailingComma": "es5"
}

Лучшие практики внедрения

Стратегия постепенного внедрения

  1. Начните с инструментов автоматического форматирования (Prettier, Black, gofmt)
  2. Внедрите базовые правила линтинга для частых проблем
  3. Постепенно добавляйте более сложные правила на основе фидбека с code review
  4. Используйте pre-commit хуки для автоматического соблюдения стандартов

Онбординг команды

  • Предоставьте конфигурационные файлы для IDE/редакторов
  • Создайте примеры руководства по стилю в вашей реальной кодовой базе
  • Настройте автоматические проверки в CI/CD пайплайне
  • Регулярный пересмотр и обновление руководства по стилю на основе фидбека команды

Измерение успеха

  • Сокращение времени, потраченного на обсуждения стиля в code review
  • Более быстрое погружение новых членов команды
  • Меньше ошибок и несоответствий, связанных со стилем
  • Улучшенные метрики читаемости кода