كيفية كتابة كود نظيف في Swift: دليل لمن يحترم نفسه وزملاءه
\n\nكل مطور قام مرة على الأقل بفتح مشروع كتبه قبل ستة أشهر، ولم يستطع فهم ما يحدث فيه. أو تلقى في مراجعة الكود تعليقًا: "كان يمكن كتابة هذا بشكل أبسط". هل هذا مألوف؟ إذا كانت الإجابة بنعم، فهذه المقالة لك.
\n\nالكود النظيف في Swift ليس مجرد نزوة للمثاليين. إنه أداة توفر ساعات من التصحيح والأعصاب. عندما تكتب بدقة، فإنك لا تسرّع عملك فحسب، بل تجعل المشروع شفافًا للفريق. دعنا نستعرض كيف تحوّل كود Swift الخاص بك إلى عمل فني.
\n\nالقاعدة رقم 1: التسمية هي الأساس
\n\nالخطيئة الأكثر شيوعًا هي تسمية متغير بـ x أو temp. ثم يأتي مطور آخر ويتساءل: "ما هذا x؟ إحداثي؟ عدد؟"
في 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:
func isUserLoggedIn() -> Bool\nfunc hasValidEmail() -> Bool\n\nالقاعدة رقم 2: الخيارات (Optionals) ليست أعداء، بل أدوات
\n\nكثير من المبتدئين يخافون من الخيارات ويحاولون التخلص منها بأي ثمن. يكتبون if let في كل مكان، أو الأسوأ من ذلك، يقومون بفك التغليف القسري (force unwrap). لكن الكود النظيف في Swift هو الكود الذي يعمل بأمان مع nil.
تذكر: ! هو صرخة استغاثة. استخدمه فقط إذا كنت متأكدًا تمامًا أن القيمة ليست nil (مثلًا عند العمل مع IBOutlet).
// كود خطير\nlet name = optionalName!\n\n// خيار آمن\nguard let name = optionalName else {\n return\n}\nprint(name)\n\nولسلاسل الخيارات، استخدم ? وعامل الدمج مع nil (nil-coalescing):
let userCity = user?.address?.city ?? "غير معروف"\n\nهذا الكود لن يتعطل حتى لو كان user أو address يساوي nil. ويُقرأ كجملة عادية: "مدينة المستخدم أو 'غير معروف'".
القاعدة رقم 3: الهياكل (Structs) بدلاً من الفئات (Classes) حيثما أمكن
\n\nفي Swift، هناك فئات وهياكل. لكن الكثيرين يستخدمون الفئات في كل مكان بدافع العادة. وهذا خطأ. الهياكل هي أنواع قيمية (value types)، وهي أكثر أمانًا في الكود متعدد الخيوط. بالإضافة إلى أنها تُنسخ بدلاً من أن تُشار إليها، مما يقلل من خطر الآثار الجانبية.
\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\nprotocol NetworkServiceProtocol {\n func fetchData(completion: @escaping (Result<Data, Error>) -> Void)\n}\n\nclass APIService: NetworkServiceProtocol { ... }\nclass MockService: NetworkServiceProtocol { ... }\n\nالآن يمكنك بسهولة استبدال الخدمة الحقيقية بنسخة وهمية (mock) للاختبارات. ولست بحاجة لتغيير الكود في أماكن أخرى.