إعادة هيكلة الكود القديم بلغة Swift: دليل خطوة بخطوة لتطبيقات iOS/macOS

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا يتطلب الكود القديم (Legacy) في Swift إعادة هيكلة

العمل مع الكود القديم (Legacy) هو جزء لا مفر منه في حياة مطور iOS/macOS. حتى لو كان المشروع مكتوبًا في البداية بلغة Swift، فإنه مع الوقت يتراكم عليه الديون التقنية: أنماط قديمة، نقص في الاختبارات، بنية متجانسة، وخلط بين Swift وObjective-C. إعادة هيكلة هذا الكود لا تحسن قابلية القراءة فحسب، بل تقلل تكلفة الصيانة، وتسريع إضافة الميزات الجديدة، وتقلل عدد الأخطاء.

في هذه المقالة، سنستعرض تقنيات محددة لإعادة هيكلة كود Swift القديم: من التخلص من force unwrapping إلى الانتقال من MVC إلى MVVM. جميع الأمثلة قابلة للتطبيق على مشاريع iOS وmacOS.

1. التقييم والتحضير: من أين نبدأ إعادة الهيكلة

قبل تغيير الكود، من المهم فهم حالته الحالية. استخدم الأدوات المدمجة في Xcode والمقاييس.

1.1. تحليل التحذيرات والأخطاء

افتح المشروع في Xcode وانتقل إلى Report Navigator (Cmd+9). انتبه إلى:

  • Yellow warnings — واجهات برمجة تطبيقات قديمة (deprecated)، متغيرات غير مستخدمة.
  • Red errors — أخطاء نحوية قد تكون نتيجة ترحيل غير كامل لـ Swift.
  • SwiftLint/SwiftFormat — قم بتوصيل linter للكشف تلقائيًا عن انتهاكات أسلوب الكود.

1.3. كتابة الاختبارات قبل التغييرات

إعادة الهيكلة بدون اختبارات هي مخاطرة. إذا لم تكن هناك اختبارات، ابدأ بإضافتها للوحدات الحرجة. استخدم XCTest لاختبارات الوحدة وXCUITest لواجهة المستخدم.

مثال لاختبار بسيط لدالة قديمة:

class LegacyCalculatorTests: XCTestCase {
    func testCalculateTotal() {
        let calculator = LegacyCalculator()
        let result = calculator.calculateTotal(items: [10, 20, 30])
        XCTAssertEqual(result, 60)
    }
}

2. التقنيات الأساسية لإعادة هيكلة كود Swift

لننتقل إلى الخطوات العملية التي يمكن تطبيقها فورًا.

2.1. استبدال force unwrapping بأنماط آمنة

المشكلة الأكثر شيوعًا في الكود القديم هي الاستخدام المفرط لـ !. استبدلها بـ guard let أو if let أو ?? (nil-coalescing).

// قبل إعادة الهيكلة
func getUserName() -> String {
    return user.name!
}

// بعد إعادة الهيكلة
func getUserName() -> String {
    return user.name ?? "Unknown"
}

2.2. التخلص من Massive View Controller (MVC → MVVM)

المشاريع القديمة غالبًا ما تعاني من "وحدات التحكم الضخمة". افصل منطق الأعمال إلى خدمات منفصلة أو ViewModel.

// Legacy ViewController (جزء)
class ProfileViewController: UIViewController {
    @IBOutlet weak var nameLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // منطق الأعمال مباشرة في وحدة التحكم
        let user = DataManager.shared.fetchUser()
        nameLabel.text = user.name?.capitalized
    }
}

// بعد إعادة الهيكلة
class ProfileViewModel {
    private let userService: UserService
    
    var userName: String {
        return userService.currentUs                

المدونات

توصيات الكتب