Специалист по Техническому Долгу и Code Smells
AI агент, специализирующийся на выявлении code smells, технического долга и проблем с поддерживаемостью, которые будут вызывать проблемы по мере роста вашего кода. Находит структурные проблемы, прежде чем они накопятся.
Структурные проблемы, затрудняющие поддержку, расширение или понимание кода
Структурные проблемы, указывающие на более глубокие проблемы проектирования в вашем коде
Проблемы объектно-ориентированного проектирования, затрудняющие изменение и тестирование кода
Нарушения фундаментальных принципов проектирования, приводящие к жесткому и хрупкому коду
Слишком сложные пути кода, чтобы их можно было понять, протестировать или безопасно обслуживать
Объективные пределы, указывающие на необходимость рефакторинга кода
Методы должны помещаться на экран
Классы должны иметь одну ответственность
Рассмотрите объект опций
Извлеките функции или используйте ранние возвраты
Слишком много путей для надежного тестирования
Извлечь в общую функцию
Посмотрите, как Refactoring Advisor выявляет проблемы и предлагает конкретные паттерны
function processOrder(order) {
// Валидация заказа
if (!order.items || order.items.length === 0) {
throw new Error('Заказ пуст')
}
if (!order.customer) {
throw new Error('Нет клиента')
}
// Вычислить итоги
let subtotal = 0
for (const item of order.items) {
subtotal += item.price * item.quantity
}
const tax = subtotal * 0.1
const total = subtotal + tax
// Применить скидки
let discount = 0
if (order.customer.isPremium) {
discount = total * 0.15
} else if (subtotal > 100) {
discount = total * 0.05
}
return total - discount
}Метод делает 4 вещи: валидация, вычисление, налоги, скидки
function processOrder(order) {
validateOrder(order)
const subtotal = calculateSubtotal(order.items)
const total = applyTax(subtotal)
return applyDiscount(total, order.customer)
}
function validateOrder(order) {
if (!order.items?.length) throw new Error('Заказ пуст')
if (!order.customer) throw new Error('Нет клиента')
}
function calculateSubtotal(items) {
return items.reduce((sum, item) =>
sum + item.price * item.quantity, 0)
}Extract Method: каждая функция делает одно хорошо
function calculateShipping(order) {
switch (order.shippingType) {
case 'express':
return order.weight * 5.0 + 15
case 'standard':
return order.weight * 2.5 + 5
case 'economy':
return order.weight * 1.0
case 'freight':
return order.weight * 0.5 + 50
default:
throw new Error('Неизвестный тип')
}
}Switch растет с каждым новым типом доставки
interface ShippingStrategy {
calculate(weight: number): number
}
const shippingStrategies: Record<string, ShippingStrategy> = {
express: { calculate: w => w * 5.0 + 15 },
standard: { calculate: w => w * 2.5 + 5 },
economy: { calculate: w => w * 1.0 },
freight: { calculate: w => w * 0.5 + 50 },
}
function calculateShipping(order) {
const strategy = shippingStrategies[order.shippingType]
if (!strategy) throw new Error('Неизвестный тип')
return strategy.calculate(order.weight)
}Паттерн Strategy: добавляйте новые типы без изменения существующего кода
class OrderProcessor {
calculateTax(order) {
const subtotal = order.items.reduce((sum, item) =>
sum + item.price * item.quantity, 0)
const taxRate = order.customer.region === 'EU'
? order.customer.country.vatRate
: 0.0
return subtotal * taxRate
}
}OrderProcessor знает слишком много деталей Order и Customer
class Order {
calculateSubtotal() {
return this.items.reduce((sum, item) =>
sum + item.price * item.quantity, 0)
}
calculateTax() {
return this.calculateSubtotal() * this.customer.getTaxRate()
}
}
class Customer {
getTaxRate() {
return this.region === 'EU' ? this.country.vatRate : 0.0
}
}Переместить поведение в класс, который владеет данными
Refactoring Advisor не только измеряет метрики — он понимает паттерны проектирования и предлагает конкретные методы рефакторинга, которые улучшат структуру вашего кода.
Выявляет code smells и антипаттерны в структуре вашего кода
Предлагает конкретные паттерны: Extract Method, Replace Conditional, Move Method
Проверяет соответствие SRP, OCP, LSP, ISP и DIP
Измерить Метрики
Вычисляет длину методов/классов и оценки сложности
Определить Паттерны
Обнаруживает code smells и антипаттерны проектирования
Проверить SOLID
Проверяет соответствие принципам проектирования
Предложить Рефакторинг
Рекомендует конкретные паттерны, такие как Extract Method, Replace Conditional with Polymorphism
Сосредоточивается на проблемах, которые ВЫЗОВУТ проблемы с обслуживанием, а не на стилистических деталях
Код, скопированный и вставленный, который нужно менять в нескольких местах
Классы, делающие слишком много, невозможные для тестирования
Функции с слишком большим количеством путей для надежного тестирования
Игнорируются в пользу структурных проблем
Технический долг накапливается экспоненциально.
Refactoring Advisor обнаруживает его рано.
Позвольте Refactoring Advisor обнаружить структурные проблемы, прежде чем они накопятся. Бесплатно в течение 14 дней, без кредитной карты.