مراجعة كود Swift: 7 أخطاء تثير غضب المطورين الخبراء

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

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

ابدأ الدورة

مراجعة كود Swift: كيف تتوقف عن إزعاج زملائك وتكتب كودًا بمستوى خبير



هل سبق لك أن أرسلت Pull Request، وبعد ساعة تلقيت 15 تعليقًا من قائد الفريق؟ "Force unwrap؟ بجدية؟"، "أين معالجة الأخطاء؟"، "وحدة التحكم في التدفق هذه معلقة في الذاكرة منذ ثلاثة أيام". هل يبدو الأمر مألوفًا؟ مرحبًا بك في عالم مراجعة كود Swift — المكان الذي يشعر فيه حتى المطورون ذوو الخبرة أحيانًا وكأنهم متدربون.



في هذه المقالة، جمعت أكثر الملاحظات شيوعًا التي يتركها الخبراء في مراجعة الكود. سنحلل أمثلة حقيقية من الكود، والأنماط المضادة، وكيفية إصلاحها. هذه ليست نظرية مملة — بل هي خبرة قتالية من مئات المراجعات التي ستساعدك على كتابة كود لا يثير الرغبة في إعادة كتابته بالكامل. هيا بنا!



1. Force Unwrap — الحب الأول والألم الأكبر



لنبدأ بالأكثر بديهية ولكن الأبدية. Force unwrap (!) يشبه القيادة بدون حزام أمان. يبدو مريحًا، لكن كبوة واحدة وستجد نفسك في قسم الطوارئ.



كود سيء (نموذجي للمبتدئين):

func getUserName() -> String {    let name: String? = UserDefaults.standard.string(forKey: "user_name")    return name!}


ماذا سيقول الخبير: "ماذا لو لم يكن هناك شيء في UserDefaults؟ تعطل. دائمًا. أضف guard let أو defaultValue."



كود جيد:

func getUserName() -> String {    guard let name = UserDefaults.standard.string(forKey: "user_name") else {        return "ضيف"    }    return name}


استثناء: Force unwrap مسموح به فقط في حالة واحدة — عندما تكون متأكدًا بنسبة 146% من وجود القيمة. على سبيل المثال، عند العمل مع IBOutlets التي سيتم تهيئتها بالتأكيد. ولكن حتى هنا، سينصح الخبير باستخدام private var label: UILabel! — هذه اتفاقية، وليست حلاً مؤقتًا.



2. الأرقام والسلاسل السحرية: الكود لا يجب أن يكون لغزًا



ثاني ما يلفت الانتباه في مراجعة كود Swift هو الثوابت السحرية. "لماذا 0.75 بالضبط؟ آه، هذا معامل الحركة... أي حركة بالضبط؟". إذا كنت تكتب أرقامًا وسلاسل نصية مباشرة في الكود، فأنت تجبر زملاءك على لعب دور المحقق.



كود سيء:

if user.age > 18 {    showAdultContent()}button.layer.cornerRadius = 12let url = "https://api.example.com/v1/users"


ماذا سيقول الخبير: "18 رقم سحري. ضعه في ثابت. URL — في enum. cornerRadius — في ثابت أسلوبي. يجب أن يُقرأ الكود ككتاب، وليس كشيفرة."



كود جيد:

private enum Constants {    static let adultAgeLimit = 18    static let defaultCornerRadius: CGFloat = 12    static let baseURL = "https://api.example.com/v1"}

enum APIEndpoint { case users var url: String { switch self { case .users: return Constants.baseURL + "/users" } }}

if user.age > Constants.adultAgeLimit { showAdultContent()}


3. تسرب الذاكرة: كيف تعلق التطبيق عن طريق الخطأ



نادرًا ما تخلو مراجعة كود Swift من مناقشة دورات الاحتفاظ. يحب الخبراء هذا الموضوع لأنه يظهر ما إذا كنت تفهم كيفية عمل ARC. النمط المضاد الأكثر شيوعًا هو التقاط self في الإغلاق بدون مرجع weak.



كود سيء:

class NetworkManager {    func fetchData(completion: @escaping (Data) -> Void) {        URLSession.shared.dataTask(with: url) { data, _, _ in            self.process(data) // self ملتقط بقوة            completion(data)        }    }}


ماذا سيقول الخبير: "أنت تحتفظ بمرجع قوي لـ self داخل الإغلاق. طالما أن الإغلاق حي — لن يتم حذف الكائن. أضف [weak self] وتحقق من nil. أو استخدم [unowned self] إذا كنت متأكدًا تمامًا من أن self سيعيش أكثر من الإغلاق."



كود جيد:

func fetchDa                

المدونات

توصيات الكتب