لماذا كود TypeScript النظيف ليس ترفاً بل ضرورة
كل مطور واجه مرة واحدة على الأقل موقفاً: تفتح مشروعاً كتبته قبل بضعة أشهر، ولا تفهم ما يحدث فيه. المتغيرات تُسمى a، b، data، الدوال تحتل 200 سطر، والأنواع موزعة بشكل عشوائي. هل هذا مألوف؟
يمنحنا TypeScript أداة قوية - الكتابة الثابتة للأنواع. لكنه بمفرده لا يجعل الكود نظيفاً. يمكنك كتابة كود سيئ في TypeScript وفي أي لغة أخرى. الكود النظيف هو انضباط وأسلوب واحترام لنفسك ولزملائك.
في هذه المقالة، سنناقش كيفية كتابة كود TypeScript نظيف يسهل قراءته وصيانته وتوسيعه. ستتعرف على مبادئ SOLID، الكتابة الصارمة للأنواع، التسمية، العمل مع الواجهات، وأكثر من ذلك. هيا بنا!
1. التسمية - وجه الكود الخاص بك
التسمية الصحيحة للمتغيرات والدوال والكلاسات تمثل 50% من النجاح. الاسم الجيد يجب أن يجيب على الأسئلة: "ما هذا؟" أو "ماذا تفعل هذه الدالة؟".
المتغيرات والثوابت
استخدم الأسماء و camelCase. تجنب الأسماء المكونة من حرف واحد (باستثناء الحلقات).
// سيءconst d = new Date();const u = users.find(u => u.id === 5);
// جيدconst currentDate = new Date();const activeUser = users.find(user => user.id === 5);الدوال
يجب أن تبدأ أسماء الدوال بفعل. هذا يوضح فوراً الإجراء الذي يتم تنفيذه.
// سيءfunction data(id: number) { ... }
// جيدfunction fetchUserData(id: number): Promise<UserData> { ... }الكلاسات والواجهات
الكلاسات - أسماء في PascalCase. الواجهات - أيضاً، لكن غالباً مع البادئة I (على الرغم من وجود جدل في المجتمع). الأفضل إعطاء اسم واضح بدون بادئة.
// سيءinterface IUser { name: string;}
// جيدinterface User { name: string; email: string;}2. الكتابة الصارمة للأنواع - أفضل صديق لك
TypeScript صُمم لتعمل الأنواع لصالحك. لا تستخدم any إلا للضرورة القصوى. في كل مرة تكتب فيها any، فإنك تعطل حماية المترجم.
تجنب any
// سيءfunction process(data: any) { return data.name;}
// جيدinterface Item { name: string; price: number;}
function process(data: Item): string { return data.name;}استخدم أنواع Union و Intersection
عندما يمكن للمتغير أن يأخذ عدة أنواع، استخدم Union (|). للدمج - Intersection (&).
type Status = 'active' | 'inactive' | 'pending';type AdminUser = User & { role: 'admin' };Generic - دوال عامة
تسمح Generic بكتابة كود مرن دون فقدان الكتابة الصارمة للأنواع.
function firstElement<T>(arr: T[]): T | undefined { return arr[0];}
const num = firstElement([1, 2, 3]); // numberconst str = firstElement(['a', 'b']); // string3. SOLID - مبادئ للمحترفين
تساعد مبادئ SOLID في بناء بنية مرنة وقابلة للصيانة. دعنا ننظر إلى كل منها بمثال في TypeScript.
المسؤولية الواحدة (SRP)
يجب أن يكون للكلاس أو الدالة سبب واحد فقط للتغيير.
// سيء: الكلاس يفعل كل شيءclass UserService { createUser() { ... } sendEmail() { ... } generateReport() { ... }}
// جيد: نقسم المسؤولياتclass UserCreator { ... }class EmailService { ... }class ReportGenerator { ... }مبدأ مفتوح/مغلق (OCP)
الكلاسات مفتوحة للتمديد ولكن مغلقة للتعديل. استخدم الواجهات والوراثة.
مبدأ استبدال ليسكوف (LSP)
يجب أن تحل الكلاسات الفرعية محل الكلاس الأساسي دون تغيير سلوك البرنامج.