Clean Code على Swift: المبادئ والأمثلة
الكود النظيف (Clean Code) ليس مجرد مصطلح عصري، بل هو فلسفة تطوير تؤثر بشكل مباشر على سرعة إنشاء الميزات، وعدد الأخطاء، والمتعة في العمل. لمطوري Swift الذين يعملون على تطبيقات iOS وmacOS، من المهم بشكل خاص كتابة كود يسهل قراءته وصيانته، لأن المشاريع تعيش لسنوات والفِرق تتغير. في هذه المقالة، سنشرح المبادئ الرئيسية لـ Clean Code كما تنطبق على Swift، وسنستعرض أمثلة محددة.
1. التسمية: تحدث بلغة مجال العمل
التسمية الصحيحة هي أساس الكود القابل للقراءة. يجب أن تجيب أسماء المتغيرات والدوال والكلاسات على أسئلة "ماذا؟" و"لماذا؟". تجنب الاختصارات والأسماء المكونة من حرف واحد (باستثناء i في الحلقات القصيرة).
مثال سيء:
func calc(a: Int, b: Int) -> Int { return a * b + 10}مثال جيد:
func calculateTotalPriceWithShipping(itemPrice: Int, shippingCost: Int) -> Int { return itemPrice + shippingCost}للمتغيرات المنطقية، استخدم البادئات is، has، should:
var isUserLoggedIn: Bool = falsevar hasCompletedOnboarding: Bool = trueيجب أن تكون أسماء الكلاسات أسماء ( UserManager, NetworkService )، والدوال أفعالاً أو عبارات فعلية ( fetchData(), validateEmail() ).
2. الدوال: صغيرة وذات مسؤولية واحدة
يجب أن تقوم كل دالة بشيء واحد فقط وأن تفعله بشكل جيد. الطول المثالي للدالة هو 10-20 سطراً. إذا تجاوزت الدالة 30 سطراً، قم بتقسيمها إلى دوال أصغر.
مثال سيء: دالة تقوم بالتحقق من الصحة، والحفظ، وإرسال الإشعار.
func processUser(_ user: User) { // التحقق من الصحة guard !user.name.isEmpty else { return } guard user.age > 18 else { return } // الحفظ CoreDataManager.shared.save(user) // الإشعار NotificationCenter.default.post(name: .userDidRegister, object: nil)}مثال جيد: تقسيم إلى ثلاث دوال منفصلة.
func processUser(_ user: User) { guard isValid(user) else { return } saveUser(user) notifyUserRegistration()}
private func isValid(_ user: User) -> Bool { return !user.name.isEmpty && user.age > 18}
private func saveUser(_ user: User) { CoreDataManager.shared.save(user)}
private func notifyUserRegistration() { NotificationCenter.default.post(name: .userDidRegister, object: nil)}تجنب أيضاً وجود عدد كبير من المعاملات. إذا كان هناك أكثر من ثلاثة، قم بدمجها في هيكل (struct).
struct SearchConfig { let query: String let category: String? let page: Int let pageSize: Int}
func search(with config: SearchConfig) -> [Result] { ... }3. SOLID في Swift: أمثلة عملية
مبادئ SOLID هي حجر الزاوية للكود النظيف في اللغات الموجهة للكائنات. سننظر في مبدأين رئيسيين من خلال أمثلة Swift.
مبدأ المسؤولية الواحدة (SRP)
يجب أن يكون للكلاس سبب واحد فقط للتغيير. لا تخلط بين منطق الشبكة والواجهة.
// انتهاك SRPclass UserViewController: UIViewController { func fetchUser() { URLSession.shared.dataTask(with: URL(string: "...")!) { ... } } func updateUI() { ... }}
// التصحيحclass UserNetworkService { func fetchUser(completion: (User) -> Void) { ... }}
class UserViewController: UIViewController { let networkService = UserNetworkService() func loadUser() { networkService.fetchUser { [weak self] user in DispatchQueue.main.async { self?.updateU