المشاكل الهيكلية التي تجعل الكود صعب الصيانة والتوسيع والفهم
مشاكل هيكلية تشير إلى مشاكل أعمق في تصميم قاعدة الكود الخاصة بك
مشاكل تصميم البرمجة الكائنية التي تجعل الكود صعب التغيير والاختبار
انتهاكات مبادئ التصميم الأساسية التي تؤدي إلى كود جامد وهش
مسارات الكود المعقدة جداً للفهم أو الاختبار أو الصيانة بأمان
حدود موضوعية تشير إلى متى يحتاج الكود إلى إعادة هيكلة
يجب أن تتسع الدوال في شاشة واحدة
يجب أن تكون للفئات مسؤولية واحدة
فكر في استخدام كائن خيارات
استخرج دوالاً أو استخدم العودة المبكرة
مسارات كثيرة جداً للاختبار بشكل موثوق
استخرجها إلى دالة مشتركة
شاهد كيف يحدد مستشار إعادة الهيكلة المشاكل ويقترح أنماطاً محددة لتطبيقها
function processOrder(order) {
// Validate order
if (!order.items || order.items.length === 0) {
throw new Error('Empty order')
}
if (!order.customer) {
throw new Error('No customer')
}
// Calculate totals
let subtotal = 0
for (const item of order.items) {
subtotal += item.price * item.quantity
}
const tax = subtotal * 0.1
const total = subtotal + tax
// Apply discounts
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('Empty order')
if (!order.customer) throw new Error('No customer')
}
function calculateSubtotal(items) {
return items.reduce((sum, item) =>
sum + item.price * item.quantity, 0)
}استخراج الدالة: كل دالة تقوم بشيء واحد بشكل جيد
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('Unknown type')
}
}عبارة 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('Unknown type')
return strategy.calculate(order.weight)
}نمط الاستراتيجية: إضافة أنواع جديدة دون تعديل الكود الموجود
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
}
}نقل السلوك إلى الفئة التي تملك البيانات
مستشار إعادة الهيكلة لا يقيس المقاييس فقط — بل يفهم أنماط التصميم ويقترح تقنيات إعادة هيكلة محددة ستحسن بنية الكود الخاص بك.
يحدد روائح الكود والأنماط المضادة في بنية الكود الخاص بك
يقترح أنماطاً محددة: استخراج الدالة، استبدال الشرطية، نقل الدالة
يتحقق من الالتزام بـ SRP و OCP و LSP و ISP و DIP
قياس المقاييس
يحسب طول الدالة/الفئة ودرجات التعقيد
تحديد الأنماط
يكتشف روائح الكود وأنماط التصميم المضادة
التحقق من SOLID
يتحقق من الالتزام بمبادئ التصميم
اقتراح إعادة الهيكلة
يوصي بأنماط محددة مثل استخراج الدالة، استبدال الشرطية بتعدد الأشكال
يركز على المشاكل التي ستسبب مشاكل صيانة، وليس ملاحظات الأسلوب
كود منسوخ يجب تغييره في أماكن متعددة
فئات تفعل أشياء كثيرة جداً، مستحيلة الاختبار
دوال بها مسارات كثيرة جداً للاختبار بشكل موثوق
يتم تخطيها لصالح المشاكل الهيكلية
الديون التقنية تتراكم بشكل أسي.
مستشار إعادة الهيكلة يكتشفها مبكراً.
دع مستشار إعادة الهيكلة يكتشف المشاكل الهيكلية قبل أن تتراكم. مجاني لمدة 14 يوماً، لا حاجة لبطاقة ائتمان.