Clean Code في Swift: المبادئ والأمثلة للمبتدئين

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

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

ابدأ الدورة

Clean Code في Swift: المبادئ والأمثلة للمبتدئين

\n\n

يواجه كل مطور iOS أو macOS عاجلاً أم آجلاً مشكلة: الكود الذي كان يعمل بشكل ممتاز بالأمس، يصبح اليوم غير قابل للقراءة. هذا ليس خطأ لغة Swift - بل هو نتيجة إهمال مبادئ Clean Code. الكود النظيف ليس مجرد جماليات. إنه أساس قابلية صيانة المشروع، وتقليل وقت التصحيح، والعمل المريح ضمن الفريق. في هذه المقالة، سنشرح المبادئ الأساسية لـ Clean Code مع أمثلة في Swift، والتي ستساعدك على كتابة كود مفهوم ليس فقط للكمبيوتر، بل للبشر أيضًا.

\n\n

1. التسمية: المتغيرات، الثوابت، والدوال

\n\n

المبدأ الأول والأهم - يجب أن يجيب الاسم على سؤال "لماذا؟"، وليس "كيف؟". في Swift، بفضل الكتابة الصارمة، يمكنك حذف النوع من الاسم، ولكن ليس الغرض.

\n\n

مثال سيء:

\n
var d: Double = 3.14\nvar arr = [String]()\nfunc calc(a: Double, b: Double) -> Double {\n    return a * b\n}
\n\n

مثال جيد (Clean Code):

\n
let 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
\n\n

2. الدوال: مهمة واحدة - دالة واحدة

\n\n

مبدأ المسؤولية الواحدة (Single Responsibility) لا ينطبق فقط على الفئات، بل على الدوال أيضًا. إذا كانت الدالة تقوم بأكثر من شيء واحد - فيجب تقسيمها.

\n\n

مثال سيء: دالة تفعل كل شيء دفعة واحدة

\n
func 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

مثال جيد: التقسيم إلى دوال صغيرة

\n
func 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\n

3. التعليقات: الأقل أفضل، ولكن بدقة

\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

المدونات

توصيات الكتب