Clean Code على TypeScript: المبادئ والأمثلة للمطورين

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

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

ابدأ الدورة

Clean Code على TypeScript: كيفية كتابة كود لا تخجل من عرضه



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



1. تسمية المتغيرات والدوال والكلاسات

يجب أن يجيب اسم المتغير أو الدالة على السؤال "ما هذا؟" أو "ماذا يفعل؟". في TypeScript، بفضل الكتابة (typing)، تصبح الأسماء أكثر إفادة. تجنب الأسماء المكونة من حرف واحد (باستثناء عدّادات الحلقات) والاختصارات التي تفهمها أنت فقط.



// سيءconst d = new Date();const fn = (a: number, b: number) => a + b;

// جيدconst currentDate = new Date();const sum = (firstNumber: number, secondNumber: number): number => firstNumber + secondNumber;


استخدم الأسماء (الأسماء) للكلاسات، والأفعال أو التراكيب الفعلية للدوال. يجب أن تبدأ المتغيرات المنطقية (boolean) بـ is أو has أو should.



// سيءconst flag = true;function validate() { /* ... */ }

// جيدconst isUserActive = true;function validateEmail(email: string): boolean { /* ... */ }


2. مبدأ المسؤولية الواحدة (SRP) للدوال

يجب أن تقوم كل دالة بشيء واحد فقط وأن تفعله بشكل جيد. إذا كانت الدالة تؤدي عدة إجراءات، فقم بتقسيمها إلى دوال أصغر. يسمح TypeScript بكتابة (typing) صارمة للبيانات المدخلة والمخرجة، مما يسهل عملية إعادة الهيكلة (refactoring).



// سيء: الدالة تبحث عن المستخدم، وتتحقق من كلمة المرور، وترسل بريدًا إلكترونيًاasync function loginUser(email: string, password: string): Promise<void> {    const user = await findUserByEmail(email);    if (user && user.password === password) {        await sendLoginEmail(user.email);        console.log('Login successful');    }}

// جيد: نفصل المسؤولياتasync function findUserByEmail(email: string): Promise<User | null> { /* ... */ }function isPasswordValid(inputPassword: string, storedHash: string): boolean { /* ... */ }async function notifyUserLogin(email: string): Promise<void> { /* ... */ }

async function loginUser(email: string, password: string): Promise<boolean> { const user = await findUserByEmail(email); if (!user || !isPasswordValid(password, user.passwordHash)) { return false; } await notifyUserLogin(user.email); return true;}


3. استخدام الأنواع (Types) والواجهات (Interfaces) بدلاً من any

إحدى الميزات الرئيسية لـ TypeScript هي نظام الأنواع. تجنب any بأي ثمن. إذا كان النوع غير معروف مسبقًا، استخدم unknown أو generics أو اتحادات الأنواع (union types). هذا يجعل الكود موثقًا ذاتيًا ويحمي من الأخطاء.



// سيءfunction getData(id: any): any {    return fetch(`/api/${id}`);}

// جيدinterface ApiResponse<T> { data: T; error?: string;}

async function getData<T>(id: string): Promise<ApiResponse<T>> { const response = await fetch(`/api/${id}`); return response.json();}


استخدم واجهات صارمة لوصف هيكل الكائنات. هذا يبسط إعادة الهيكلة ويساعد بيئة التطوير المتكاملة (IDE) على اقتراح الخصائص.



interface User {    readonly id: number;    name: string;    email: string;    role: 'admin' | 'user';}

function updateUserName(user: User, newName: string): User { return { ...user, name: newName };}


4. معالجة الأخطاء والبرمجة الدفاعية

المدونات

توصيات الكتب