بتذكرها زي كأنها مبارح، ليلة من ليالي الشتا في رام الله، والكهربا بتقطع وبتيجي، وأنا قاعد بشتغل على مشروع لعميل “مستعجل”، كالعادة. المشروع كان عبارة عن لوحة تحكم (Dashboard) فيها عشرات الواجهات المتشابهة: جداول، نماذج إدخال، بطاقات عرض. وكل واجهة بدها مكون React جديد، وكل مكون بده نفس البنية الأساسية: استيراد `React` و `useState` و `useEffect`، تعريف الدالة، قسم الـ `return` مع `JSX` فاضي، وأخيراً `export default`.
بعد ما عملت المكون الخامس بنفس الطريقة، حسيت أصابعي بتتمرد عليّ. كل نقرة على الكيبورد كانت صرخة صامتة: “كمان مرة؟ والله زهقنا!”. كنت بنسخ الكود من ملف قديم وألصقه في الجديد وأعدل الاسم، عملية ميكانيكية مملة بتقتل الإبداع وبتفتح مجال كبير للغلط. وقتها صفنت مع حالي ومع كاسة الشاي بالمرمية اللي بردت جنبي، وقلت: “يا زلمة مش معقول! إنت مبرمج، شغلتك تعمل أتمتة، معقول مش قادر تأتمت شغلك إنت؟”.
ومن هاي الصفنة، بلشت رحلتي الحقيقية مع عالم صغير بس عظيم، اسمه مقتطفات الشفرة (Code Snippets). عالم أنقذني من جحيم التكرار وخلاني أركز على اللي بحبه عنجد: حل المشاكل وبناء الأشياء الحلوة.
ما هو الـ Boilerplate يا أبو عمر؟ وليش لازم نكرهه؟
قبل ما نغوص في الحل، خلينا نحكي بصراحة عن المشكلة. الـ “Boilerplate Code” هو أي كود بتحتاج تكتبه مرة بعد مرة في أماكن مختلفة بدون أي تغيير في المنطق تبعه. هو الأساس اللي لازم تبني عليه، بس عملية البناء نفسها مكررة ومملة.
تخيل حالك طباخ شاطر، وكل مرة بدك تطبخ طبخة جديدة، لازم ترجع تصنع الطنجرة من الصفر! مش منطق، صح؟ الطنجرة هي الـ Boilerplate، إنت كطباخ بدك تركز على البهارات والمكونات والنكهة (يعني منطق البرنامج)، مش على صناعة الأداة اللي بتطبخ فيها كل مرة.
هذا الكود المتكرر مش بس ممل، هو كمان خطير لأنه:
- مضيعة للوقت: كل دقيقة بتقضيها في كتابة كود مكرر هي دقيقة مسروقة من وقت الإبداع وحل المشاكل الحقيقية.
- مصدر للأخطاء: مع كثرة النسخ واللصق، رح تنسى تعدل اسم متغير أو تستدعي دالة غلط، وتضل تدور على الخطأ ساعات.
- غير متناسق: ممكن اليوم تكتب المكون بطريقة، وبعد أسبوع تكتبه بطريقة تانية شوي، ومع الوقت بصير عندك كود “مشرشح” وصعب الصيانة.
بطل القصة: مقتطفات الشفرة (Code Snippets)
ببساطة شديدة، مقتطف الشفرة هو قالب كود جاهز ومحفوظ عندك في محرر الأكواد (زي VS Code, Sublime Text, وغيرهم). كل ما عليك هو كتابة “اختصار” معين (trigger)، والمحرر بيكمل عنك الباقي وبيفردلك القالب كامل.
فكر فيه كأنه “علي بابا” البرمجي الخاص فيك. بدل ما تقول “افتح يا سمسم”، بتكتب “rfc” مثلاً، وباب الكهف (ملف الكود) بينفتح وبيطلعلك كنز (مكون React كامل جاهز للتعبئة).
يلا نشتغل عملي: كيف تبني أول مقتطف خاص فيك على VS Code؟
الحكي حلو، بس الشغل أحلى. خلينا نفتح VS Code ونبني كم مقتطف مع بعض. الشرح هان على VS Code لأنه الأكثر استخداماً، بس المبدأ نفسه في كل المحررات.
الخطوة الأولى: وين نلاقي ملف المقتطفات؟
الموضوع بسيط جداً. افتح VS Code واضغط على Ctrl+Shift+P (أو Cmd+Shift+P على ماك) عشان تفتح لوحة الأوامر (Command Palette). اكتب فيها “Configure User Snippets” واضغط Enter.
رح تظهرلك قائمة، بتقدر تختار منها:
- لغة برمجة معينة (مثلاً `javascript.json`): وهيك المقتطف بشتغل بس في ملفات الجافاسكريبت.
- ملف عام (New Global Snippets file…): وهيك المقتطف بشتغل في كل أنواع الملفات.
خلينا نختار javascript.json عشان أمثلتنا.
الخطوة الثانية: تشريح بنية المقتطف
لما تفتح الملف، رح تلاقي ملف JSON فاضي مع شوية شرح. بنية أي مقتطف بتكون كالتالي:
{
"اسم المقتطف هنا": {
"prefix": "الاختصار اللي رح تكتبه",
"body": [
"سطر الكود الأول",
"سطر الكود الثاني",
"وهكذا..."
],
"description": "وصف بسيط بيظهرلك لما تكتب الاختصار"
}
}
مثال 1: مقتطف `console.log` للمبتدئين (الحق على حالك)
أكثر اشي بنكتبه كـ JavaScript developers هو `console.log()`. خلينا نعمله مقتطف سريع.
في ملف `javascript.json`، ضيف الكود التالي:
{
"Print to console": {
"prefix": "clg",
"body": [
"console.log('$1');",
"$2"
],
"description": "Log output to console"
}
}
شرح سريع:
prefix: "clg": هذا هو الاختصار.body: هذا هو الكود اللي رح ينطبع.$1: هذه اسمها “Tab Stop”. بعد ما المقتطف يظهر، المؤشر رح يوقف تلقائياً عند `$1` عشان تكتب اللي بدك اياه.$2: بعد ما تخلص كتابة عند `$1` وتضغط `Tab`، المؤشر رح يقفز لـ `$2`، يعني سطر جديد تحت الكود.
الآن، احفظ الملف، روح على أي ملف جافاسكريبت، اكتب `clg` واضغط `Enter`. السحر صار!
مثال 2: مقتطف مكون React (هون الشغل الصح)
هذا هو المقتطف اللي كان رح ينقذني في هذيك الليلة. بدنا نعمل مقتطف لمكون React Function Component.
افتح ملف `javascriptreact.json` (مخصص لملفات JSX) بنفس الطريقة اللي فوق، وضيف الكود التالي:
{
"React Functional Component": {
"prefix": "rfc",
"body": [
"import React, { useState, useEffect } from 'react';",
"",
"function ${1:${TM_FILENAME_BASE}}() {",
" const [state, setState] = useState(null);",
"",
" useEffect(() => {",
" // Your effect here",
" }, []);",
"",
" return (",
" ",
" ${1:${TM_FILENAME_BASE}} Component
",
" ",
" );",
"}",
"",
"export default ${1:${TM_FILENAME_BASE}};"
],
"description": "Creates a React Functional Component with Hooks"
}
}
هذا المقتطف فيه شغل محترفين، خلينا نفصصه:
prefix: "rfc": اختصارنا المعتمد.${1:${TM_FILENAME_BASE}}: هان السحر الحقيقي.TM_FILENAME_BASEهو متغير داخلي في VS Code بجيب اسم الملف بدون الامتداد. يعني لو اسم الملف `UserProfile.jsx`، هذا المتغير رح يكون قيمته `UserProfile`. وإحنا حطيناه كقيمة افتراضية للمؤشر `$1`. يعني المقتطف رح يكتب اسم المكون تلقائياً بناءً على اسم الملف!- باقي الكود هو بنية المكون اللي بنعرفها، جاهزة ومستورد فيها الـ Hooks الأساسية.
جرب الآن اعمل ملف جديد اسمه `MyComponent.jsx`، واكتب فيه `rfc` واضغط `Enter`. شوف كيف بنالك المكون كامل بالاسم الصح وبكل التفاصيل. اشي مرتب!
نصائح من الخبير: ارتقِ بمقتطفاتك لمستوى الوحوش!
المقتطفات مش بس لكتابة كود ثابت. بتقدر تخليها تفاعلية وذكية أكثر.
استخدام المتغيرات (Variables)
زي ما شفنا $TM_FILENAME_BASE، في متغيرات كثيرة مفيدة مثل:
$CLIPBOARD: يلصق محتوى الحافظة (Clipboard) الحالي.$CURRENT_YEAR: يكتب السنة الحالية (ممتاز لحقوق النشر).$TM_SELECTED_TEXT: يحيط النص اللي إنت محدده بالمقتطف.
خيارات متعددة (Choices)
بتقدر تعمل قائمة خيارات داخل المقتطف. مثلاً، لو بدك تختار بين `
"body": [
"",
" $0",
"${1|div,section,article|}>"
]
لما تستدعي المقتطف، رح تظهرلك قائمة تختار منها العنصر اللي بدك اياه.
إدارة مقتطفاتك كالمحترفين
لما يصير عندك مقتطفات كثيرة، إدارتها بتصير مهمة. بنصحك تستخدم إضافة (Extension) اسمها “Snippets Ranger” أو “Snippet Generator”. بتخليك تشوف كل مقتطفاتك في مكان واحد وتعدلها بسهولة.
فلسفة أبو عمر: متى يجب أن تتوقف عن استخدام المقتطفات؟
زي أي أداة قوية، استخدامها الخاطئ ممكن يضر. المقتطفات ممتازة للـ “هيكل” (Structure) وليس للـ “منطق” (Logic).
لا تعمل مقتطف لدالة كاملة فيها منطق معقد خاص بمشروعك. ليش؟ لأنك لو عدلت المنطق، رح تنسى تعدل المقتطف، وممكن تستخدمه بالغلط في مكان تاني. استخدم المقتطفات للأشياء اللي ما بتتغير: بنية ملف، بنية مكون، بنية دالة، حلقات تكرار، استعلامات `try-catch`… إلخ.
الهدف هو توفير الجهد الذهني من التفكير في الهيكل، عشان تتفرغ للتفكير في المنطق والإبداع.
الخلاصة (الزبدة)
يا جماعة الخير، البرمجة فن وحل مشاكل، مش طباعة ورص حروف. أي اشي بتقدر تأتمته في شغلك، لازم تأتمته بدون تردد. مقتطفات الشفرة هي أول وأسهل خطوة في هذا الطريق.
ابدأ اليوم، مش بكرة. فكر في أكثر 3 أشياء بتكررها في كتابة الكود، وحوّلها لمقتطفات. يمكن الموضوع ياخد منك نص ساعة في الأول، بس رح يوفر عليك ساعات وأيام لقدام، ويحمي أصابعك من التمرد، وعقلك من الملل. 🧠
استثمارك في بناء مكتبة مقتطفات خاصة فيك هو من أفضل الاستثمارات اللي رح تعملها في مسيرتك كمبرمج. رح تصير أسرع، أدق، وأكثر تناسقاً في شغلك. يلا، شدوا الهمة وورجوني إبداعاتكم! 🚀
سجل دخولك لعمل نقاش تفاعلي
آراء من النقاشات
لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!
آخر المدونات
كانت تبعياتنا قنبلة موقوتة: كيف أنقذنا ‘التحديث الآلي للتبعيات’ من جحيم الثغرات الأمنية المنسية؟
أشارككم قصة حقيقية عن ليلة كادت فيها ثغرة أمنية في إحدى المكتبات المنسية أن تدمر مشروعنا بالكامل. اكتشفوا معنا كيف تحولنا من الفوضى إلى الأمان...
كانت شفرتنا هرمًا من الهلاك: كيف أنقذتنا ‘شروط الحماية’ (Guard Clauses) من جحيم الـ if/else المتداخلة؟
في هذه المقالة، أشارككم قصة حقيقية من مسيرتي كمبرمج عن المعاناة مع الشفرات المتداخلة "هرم الهلاك". سنتعلم كيف تنقذنا تقنية "شروط الحماية" (Guard Clauses) من...
كانت خدماتنا متلاصقة كالغراء: كيف أنقذتنا ‘المعمارية الموجهة بالأحداث’ (EDA) من جحيم الاقتران المحكم؟
أنا أبو عمر، وهذا المقال ليس مجرد شرح تقني، بل هو قصة حقيقية من الخنادق البرمجية. سأروي لكم كيف كنا نغرق في بحر "الاقتران المحكم"،...
كانت نماذجنا تموت ببطء: كيف أنقذنا “انحراف النموذج” (Model Drift) من جحيم التنبؤات الفاسدة؟
في عالم الذكاء الاصطناعي، نماذجنا ليست منحوتات حجرية، بل كائنات حية تتنفس البيانات. أشارككم قصة حقيقية عن "انحراف النموذج" (Model Drift)، هذا الشبح الذي كاد...
من الجحيم إلى النعيم: كيف أنقذتنا خوارزمية LSH من “لعنة الأبعاد” في نظام التوصيات؟
أتذكر جيدًا ذلك اليوم الذي كادت فيه أنظمة التوصيات لدينا أن تنهار تحت وطأة "لعنة الأبعاد". في هذه المقالة، أشارككم قصة حقيقية عن كيف كانت...
كانت نقرتنا الأخيرة تسرق المجد: كيف أنقذنا التسويق بنماذج الإحالة متعددة اللمس؟
هل تتخذ قرارات تسويقية بناءً على بيانات منقوصة؟ في هذه المقالة، أسرد لكم قصة حقيقية عن كيف تسرق "النقرة الأخيرة" مجهوداتكم التسويقية، وكيف يمكن لنماذج...
كانت واجهاتنا وحش فرانكشتاين: كيف أنقذنا ‘نظام التصميم’ (Design System) من جحيم الفوضى البصرية؟
في إحدى المشاريع، تحولت واجهاتنا إلى وحش فرانكشتاين مشوه بسبب الفوضى البصرية والتطوير العشوائي. في هذه المقالة، أشارككم يا جماعة الخير قصتنا وكيف كان 'نظام...
كنا نمزق الـ JSON إرباً: كيف أنقذنا نوع البيانات ‘JSONB’ من جحيم تطبيع ما لا يُطَبَّع؟
أتذكر جيداً ذلك المشروع الذي كاد أن يودي بنا إلى الجنون، كنا نحاول تخزين بيانات مرنة ومتغيرة في قاعدة بيانات علائقية. في هذه المقالة، سأشارككم...
كانت إشعاراتنا جحيمًا من الاستعلامات المتكررة (Polling): كيف أنقذتنا WebSockets من استنزاف الخوادم؟
أشارككم قصة حقيقية من تجربتي كمبرمج، كيف انتقلنا من جحيم تقنية الـ Polling التي كادت أن تدمر خوادمنا، إلى نعيم اتصالات الـ WebSockets اللحظية. رحلة...