Clean Code في Swift: المبادئ والأمثلة للمبتدئين
\n\nيواجه كل مطور iOS أو macOS عاجلاً أم آجلاً مشكلة: الكود الذي كان يعمل بشكل ممتاز بالأمس، يصبح اليوم غير قابل للقراءة. هذا ليس خطأ لغة Swift - بل هو نتيجة إهمال مبادئ Clean Code. الكود النظيف ليس مجرد جماليات. إنه أساس قابلية صيانة المشروع، وتقليل وقت التصحيح، والعمل المريح ضمن الفريق. في هذه المقالة، سنشرح المبادئ الأساسية لـ Clean Code مع أمثلة في Swift، والتي ستساعدك على كتابة كود مفهوم ليس فقط للكمبيوتر، بل للبشر أيضًا.
\n\n1. التسمية: المتغيرات، الثوابت، والدوال
\n\nالمبدأ الأول والأهم - يجب أن يجيب الاسم على سؤال "لماذا؟"، وليس "كيف؟". في Swift، بفضل الكتابة الصارمة، يمكنك حذف النوع من الاسم، ولكن ليس الغرض.
\n\nمثال سيء:
\nvar d: Double = 3.14\nvar arr = [String]()\nfunc calc(a: Double, b: Double) -> Double {\n return a * b\n}\n\nمثال جيد (Clean Code):
\nlet piValue: Double = 3.14159\nvar userNames: [String] = []\nfunc calculateRectangleArea(width: Double, height: Double) -> Double {\n return width * height\n}\n\nقواعد التسمية في Swift:
\n- \n
- استخدم camelCase للمتغيرات والدوال. \n
- تجنب الاختصارات (
btn←submitButton). \n - للمتغيرات المنطقية، استخدم البادئات
is،has،should(مثال:isUserLoggedIn). \n - يجب أن تبدأ أسماء الدوال بفعل:
fetchData()،saveToCache(). \n
2. الدوال: مهمة واحدة - دالة واحدة
\n\nمبدأ المسؤولية الواحدة (Single Responsibility) لا ينطبق فقط على الفئات، بل على الدوال أيضًا. إذا كانت الدالة تقوم بأكثر من شيء واحد - فيجب تقسيمها.
\n\nمثال سيء: دالة تفعل كل شيء دفعة واحدة
\nfunc processUserData(user: User) {\n // التحقق\n guard user.email.contains("@") else { return }\n // الحفظ في قاعدة البيانات\n Database.shared.save(user)\n // إرسال الإشعار\n NotificationCenter.default.post(name: .userDidRegister, object: nil)\n // تحديث واجهة المستخدم\n DispatchQueue.main.async {\n self.label.text = "مرحبًا بك، \\(user.name)"\n }\n}\n\nمثال جيد: التقسيم إلى دوال صغيرة
\nfunc registerUser(_ user: User) {\n guard validateUser(user) else { return }\n saveUserToDatabase(user)\n postRegistrationNotification()\n updateUI(for: user)\n}\n\nprivate func validateUser(_ user: User) -> Bool {\n return user.email.contains("@") && !user.name.isEmpty\n}\n\nprivate func saveUserToDatabase(_ user: User) {\n Database.shared.save(user)\n}\n\nprivate func postRegistrationNotification() {\n NotificationCenter.default.post(name: .userDidRegister, object: nil)\n}\n\nprivate func updateUI(for user: User) {\n DispatchQueue.main.async {\n self.welcomeLabel.text = "مرحبًا بك، \\(user.name)"\n }\n}\n\nنصيحة: إذا لم تستطع ابتكار اسم قصير للدالة، فمن المحتمل أنها تقوم بأكثر من اللازم.
\n\n3. التعليقات: الأقل أفضل، ولكن بدقة
\n\nفي Clean Code، التعليقات هي علامة على كود سيء. الكود الجيد يجب أن يوثق نفسه بنفسه. ولكن هناك استثناءات: منطق الأعمال المعقد، العمل مع الكود القديم (Legacy)، أو واجهات برمجة التطبيقات العامة (APIs).
\n\nتعليق زائد عن الحاجة (سيء):
\n// زيادة العداد بمقدار 1\ncounter += 1\n\nتعليق مفيد (جيد):
\n// نستخدم Decimal لتجنب أخطاء التقريب عند التعامل مع العملات\nlet price = Decimal(string: "19.99") ?? .zero\n\nقواعد التعامل مع التعليقات:
\n- \n
- لا تكتب الواضح - الكود يُقرأ بنفسه. \n
- استخدم
// MARK: -لـ \n