كود نظيف في Swift: كيف تكتبه حتى لا يلعنك زملاؤك

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

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

ابدأ الدورة

كيفية كتابة كود نظيف في Swift: دليل لمن يحترم نفسه وزملاءه

\n\n

كل مطور قام مرة على الأقل بفتح مشروع كتبه قبل ستة أشهر، ولم يستطع فهم ما يحدث فيه. أو تلقى في مراجعة الكود تعليقًا: "كان يمكن كتابة هذا بشكل أبسط". هل هذا مألوف؟ إذا كانت الإجابة بنعم، فهذه المقالة لك.

\n\n

الكود النظيف في Swift ليس مجرد نزوة للمثاليين. إنه أداة توفر ساعات من التصحيح والأعصاب. عندما تكتب بدقة، فإنك لا تسرّع عملك فحسب، بل تجعل المشروع شفافًا للفريق. دعنا نستعرض كيف تحوّل كود Swift الخاص بك إلى عمل فني.

\n\n

القاعدة رقم 1: التسمية هي الأساس

\n\n

الخطيئة الأكثر شيوعًا هي تسمية متغير بـ x أو temp. ثم يأتي مطور آخر ويتساءل: "ما هذا x؟ إحداثي؟ عدد؟"

\n\n

في Swift، من المعتاد إعطاء أسماء تُقرأ كجمل. هذا ليس جميلًا فحسب، بل يساعد في فهم ما يفعله الكود فورًا.

\n\n
// سيء\nlet a = 5.0\nvar b = "John"\n\n// جيد\nlet discountRate = 5.0\nvar userName = "John"
\n\n

بالنسبة للدوال والطرق، تنطبق نفس القاعدة. يجب أن يجيب الاسم على السؤال "ماذا تفعل هذه الدالة؟". استخدم الأفعال في صيغة الأمر:

\n\n
// سيء\nfunc data() -> [String] { ... }\n\n// جيد\nfunc fetchUsers() -> [String] { ... }
\n\n

وإذا كانت الدالة تُرجع قيمة منطقية، ابدأ الاسم بـ is أو has أو contains:

\n\n
func isUserLoggedIn() -> Bool\nfunc hasValidEmail() -> Bool
\n\n

القاعدة رقم 2: الخيارات (Optionals) ليست أعداء، بل أدوات

\n\n

كثير من المبتدئين يخافون من الخيارات ويحاولون التخلص منها بأي ثمن. يكتبون if let في كل مكان، أو الأسوأ من ذلك، يقومون بفك التغليف القسري (force unwrap). لكن الكود النظيف في Swift هو الكود الذي يعمل بأمان مع nil.

\n\n

تذكر: ! هو صرخة استغاثة. استخدمه فقط إذا كنت متأكدًا تمامًا أن القيمة ليست nil (مثلًا عند العمل مع IBOutlet).

\n\n
// كود خطير\nlet name = optionalName!\n\n// خيار آمن\nguard let name = optionalName else {\n    return\n}\nprint(name)
\n\n

ولسلاسل الخيارات، استخدم ? وعامل الدمج مع nil (nil-coalescing):

\n\n
let userCity = user?.address?.city ?? "غير معروف"
\n\n

هذا الكود لن يتعطل حتى لو كان user أو address يساوي nil. ويُقرأ كجملة عادية: "مدينة المستخدم أو 'غير معروف'".

\n\n

القاعدة رقم 3: الهياكل (Structs) بدلاً من الفئات (Classes) حيثما أمكن

\n\n

في Swift، هناك فئات وهياكل. لكن الكثيرين يستخدمون الفئات في كل مكان بدافع العادة. وهذا خطأ. الهياكل هي أنواع قيمية (value types)، وهي أكثر أمانًا في الكود متعدد الخيوط. بالإضافة إلى أنها تُنسخ بدلاً من أن تُشار إليها، مما يقلل من خطر الآثار الجانبية.

\n\n

استخدم الهيكل إذا:

\n
    \n
  • كنت بحاجة لتخزين بيانات بدون منطق معقد
  • \n
  • لا حاجة للوراثة
  • \n
  • لا يجب أن يكون الكائن قابلًا للتعديل بعد الإنشاء
  • \n
\n\n
// الأفضل استخدام هيكل\nstruct User {\n    let id: Int\n    var name: String\n}\n\n// الفئة فقط إذا كنت بحاجة للوراثة أو دلالات المرجع (reference semantics)\nclass ViewController: UIViewController { ... }
\n\n

بالمناسبة، توصي Apple باستخدام الهياكل لنماذج البيانات. هذا أحد المبادئ الرئيسية للكود النظيف في Swift.

\n\n

القاعدة رقم 4: البروتوكولات هي أفضل أصدقائك

\n\n

البروتوكولات في Swift ليست مجرد واجهات. إنها طريقة لجعل الكود مرنًا وقابلًا للاختبار. بدلاً من الارتباط بفئة معينة، اعمل من خلال البروتوكول.

\n\n
protocol NetworkServiceProtocol {\n    func fetchData(completion: @escaping (Result<Data, Error>) -> Void)\n}\n\nclass APIService: NetworkServiceProtocol { ... }\nclass MockService: NetworkServiceProtocol { ... }
\n\n

الآن يمكنك بسهولة استبدال الخدمة الحقيقية بنسخة وهمية (mock) للاختبارات. ولست بحاجة لتغيير الكود في أماكن أخرى.

المدونات

توصيات الكتب