Chapter 7: Variables & Data Types - The Building Blocks of Code
الفصل 7: المتغيرات وأنواع البيانات.. حاويات المعلومات
الركيزة الأولى من أعمدة بناء الكود السبعة
تخيل أنك تحاول طهي وجبة معقدة في مطبخ فوضوي. لا توجد أوعية، لا أطباق، لا برطمانات للتوابل. كل المكونات مكدسة على الطاولة. كيف ستفصل الملح عن السكر؟ كيف ستقيس كمية الطحين؟ ستكون العملية كارثية.
هذه هي البرمجة بدون متغيرات.
عندما يبدأ المبتدئون رحلتهم، غالبًا ما يمرون على درس “المتغيرات” مرور الكرام، معتبرين إياه مجرد تحصيل حاصل. “حسنًا، x = 5، فهمت، ما التالي؟”. لكن هذا استخفاف خطير بأهم مفهوم في البرمجة على الإطلاق. المتغيرات ليست مجرد “أساسيات”، إنها النسيج الذي يُحاك منه كل برنامج. هي الطريقة التي نعطي بها معنى للبيانات الخام التي تتدفق عبر أنظمتنا.
بدون القدرة على تخزين قيمة وتسميتها واسترجاعها، لا يمكن لأي برنامج أن يتذكر أي شيء. لا يمكنه تذكر اسم المستخدم الذي سجل دخوله، أو عدد المنتجات في عربة التسوق، أو حتى ما إذا كان الوضع الليلي مفعلًا أم لا. بدون متغيرات، الكود يعاني من فقدان ذاكرة دائم.
هذا الفصل هو حجر الزاوية في “أعمدة بناء الكود السبعة”. قبل أن نتعلم كيف نبني الجمل الشرطية أو الحلقات التكرارية، يجب أن نتعلم كيف نصنع “الكلمات” نفسها. هذه الكلمات هي المتغيرات. فهمها بعمق هو الفرق بين من يكتب تعليمات برمجية، ومن يبني عوالم رقمية.
ما هي المتغيرات؟ الصناديق الرقمية
بأبسط تعريف، المتغير (Variable) هو حاوية مُسماة لتخزين قطعة من المعلومات. إنه مثل صندوق تضع عليه ملصقًا. الملصق هو “اسم المتغير”، وما بداخل الصندوق هو “القيمة”.
عندما تكتب كودًا، أنت تتعامل مع ثلاث عمليات أساسية تتعلق بالمتغيرات:
- التعريف (Declaration): هذا هو الفعل الذي تخبر به الحاسوب: “أنا بحاجة إلى صندوق جديد. سأطلق عليه هذا الاسم”. أنت تحجز مساحة في الذاكرة، لكنها فارغة بعد.
- في لغة مثل جافاسكريبت، قد يبدو هذا هكذا:
let userAge; - لقد أنشأنا للتو صندوقًا اسمه
userAge، لكنه فارغ. قيمته الحالية هيundefined(غير محدد).
- في لغة مثل جافاسكريبت، قد يبدو هذا هكذا:
- الإسناد (Assignment): هذا هو الفعل الذي تضع فيه شيئًا داخل الصندوق الذي حجزته.
userAge = 34;- الآن، الصندوق الذي يحمل اسم
userAgeيحتوي على الرقم34. علامة=ليست للمقارنة الرياضية، بل هي عامل إسناد. تقرأ من اليمين إلى اليسار: “خذ القيمة34وضعها في المتغيرuserAge”.
- التهيئة (Initialization): هذه هي عملية الجمع بين التعريف والإسناد في خطوة واحدة. إنها الطريقة الأكثر شيوعًا وكفاءة.
let userName = "Ali";- هنا، قمنا بحجز صندوق اسمه
userNameووضعنا فيه القيمة النصية"Ali"في نفس الوقت.
لماذا التسمية مهمة جدًا؟
يمكنك تسمية متغيراتك x و y و z. سيعمل الكود. لكن بعد أسبوع، عندما تعود لقراءة الكود، لن يكون لديك أي فكرة عما يمثله x. هل هو عمر المستخدم؟ عدد المحاولات الفاشلة؟ معرف المنتج؟
الاسم الجيد للمتغير هو وثيقة بحد ذاتها. قارن هذا:
let x = 3;
مع هذا:
let loginAttempts = 3;
الثاني لا يحتاج إلى تعليق لشرحه. إنه يصرخ بوظيفته. المحترفون لا يكتبون الكود للحاسوب فقط، بل يكتبونه للبشر (لأنفسهم في المستقبل ولزملائهم في الفريق). اختيار أسماء واضحة وذات معنى هو أول علامة على النضج البرمجي. إنه ليس رفاهية، بل ضرورة قصوى لكتابة كود قابل للصيانة.
ماذا يوجد داخل الصندوق؟ أنواع البيانات
إذا كانت المتغيرات هي الصناديق، فإن أنواع البيانات (Data Types) هي التي تحدد طبيعة الأشياء التي يمكنك وضعها داخل تلك الصناديق. لا يمكنك تخزين سائل في صندوق من الورق المقوى، وبالمثل، لا يمكنك إجراء عمليات حسابية على نص. نوع البيانات يخبر الحاسوب بنوع القيمة وكيفية التعامل معها.
هذه هي الأنواع الأساسية التي ستواجهها في 99% من الحالات:
- النص (String): أي سلسلة من الأحرف محاطة بعلامات اقتباس (مفردة
'أو مزدوجة"). تُستخدم لتخزين الأسماء، الرسائل، العناوين، أي شيء نصي.let greeting = "Hello, World!";
- الرقم (Number): يمثل القيم العددية، سواء كانت أعدادًا صحيحة (Integers) مثل
10أو أعدادًا عشرية (Floats) مثل3.14. تُستخدم في كل شيء من الحسابات المالية إلى تتبع النتائج في لعبة.let price = 99.99;let quantity = 5;
- القيمة المنطقية (Boolean): أبسط أنواع البيانات وأكثرها قوة. يمكن أن تحمل قيمتين فقط:
true(صحيح) أوfalse(خطأ). إنها مفتاح النور والظلام في الكود، الأساس الذي تُبنى عليه كل القرارات المنطقية. هل المستخدم مسجل دخوله؟true. هل المنتج متوفر؟false.let isAvailable = true;
- المصفوفة (Array): قائمة مرتبة من القيم. تخيلها كقائمة تسوق أو رف كتب. يمكنك تخزين مجموعة من العناصر من نفس النوع أو من أنواع مختلفة. يتم الوصول إلى كل عنصر عن طريق “فهرس” (index) يبدأ من الصفر.
let colors = ["red", "green", "blue"];- للحصول على اللون الأخضر، نكتب:
colors[1](لأن العد يبدأ من 0).
- الكائن (Object): حاوية للبيانات ذات الصلة، ولكن على عكس المصفوفة، فهي غير مرتبة وتستخدم أزواجًا من “المفتاح: القيمة” (key: value). تخيلها كبطاقة تعريف شخصية: لديك مفتاح “الاسم” وقيمته، ومفتاح “العمر” وقيمته. إنها الطريقة المثلى لنمذجة كيانات العالم الحقيقي (مستخدم، منتج، سيارة).
let car = { make: "Toyota", model: "Camry", year: 2023 };- للحصول على الموديل، نكتب:
car.model.
هناك أنواع أخرى مثل null (فارغ عمدًا) و undefined (لم يتم تعيين قيمة)، لكن هذه الخمسة هي جيشك الذي ستخوض به معظم معاركك البرمجية. فهمها ليس خيارًا، بل هو شرط أساسي لكتابة أي برنامج يتجاوز “Hello, World”.
لماذا النوع مهم؟ حرب الأنظمة الصارمة والديناميكية
الآن بعد أن عرفنا أنواع البيانات، نصل إلى سؤال فلسفي يقسم عالم المبرمجين: متى يجب على الحاسوب أن يتحقق من نوع البيانات؟ الإجابة على هذا السؤال تضع اللغات في معسكرين رئيسيين.
1. الربط الديناميكي (Dynamic Typing): في لغات مثل Python و JavaScript، لا تهتم بتعريف نوع المتغير صراحةً. اللغة ذكية بما يكفي لتكتشف النوع أثناء تشغيل البرنامج (at runtime).
let data = 42; // الآن، data هو Number
data = "Hello"; // لا مشكلة! الآن data هو String
data = true; // لا يزال الأمر على ما يرام! الآن data هو Boolean
- الميزة: مرونة وسرعة في الكتابة. رائعة للنماذج الأولية والبرامج النصية الصغيرة. تشعر بالحرية.
- العيب: يمكن أن تحدث أخطاء غير متوقعة أثناء التشغيل. قد تحاول إجراء عملية حسابية على متغير كنت تظنه رقمًا، لتكتشف أنه أصبح نصًا في مكان ما من الكود، مما يؤدي إلى انهيار البرنامج أمام المستخدم. إنه مثل السير على حبل مشدود بدون شبكة أمان.
2. الربط الثابت (Static Typing): في لغات مثل Java، C#، Go، أو عند استخدام TypeScript (وهي امتداد لجافاسكريبت)، يجب أن تعلن عن نوع المتغير مقدمًا، ولا يمكنك تغييره لاحقًا.
let age: number;
age = 30; // ممتاز
// age = "thirty"; // خطأ! المحرر سيصرخ في وجهك قبل أن تشغل الكود.
- الميزة: أمان وصلابة. يتم اكتشاف الأخطاء المتعلقة بالنوع في وقت مبكر جدًا (at compile time)، قبل أن يصل الكود إلى المستخدم. المحرر يساعدك بإكمال تلقائي دقيق لأنه يعرف بالضبط ما هو نوع كل متغير.
- العيب: تتطلب كتابة المزيد من الكود (boilerplate). قد تشعر بالتقييد في البداية.
أيهما أفضل؟ هذا ليس سؤالاً عن “الأفضل”، بل عن “الأداة المناسبة للمهمة”. اللغات الديناميكية رائعة للسرعة والمرونة، خاصة في علوم البيانات وتطوير الويب السريع. اللغات الثابتة تتألق في الأنظمة الكبيرة والمعقدة حيث يكون الأمان والموثوقية على رأس الأولويات.
كمبتدئ، ستبدأ على الأرجح بلغة ديناميكية مثل Python أو JavaScript. لكن كمحترف، يجب أن تفهم كلا النهجين. معرفة متى تحتاج إلى صرامة النظام الثابت هي علامة على الخبرة.
خلاصة القول: كيف تفكر كالمحترفين
لقد وضعنا أول وأهم لبنة في صرح معرفتك البرمجية. المتغيرات وأنواع البيانات ليست مجرد فصل في كتاب، إنها العدسة التي ترى بها البرمجة العالم. لإتقانها، لا يكفي أن تعرفها، بل يجب أن تتبناها كفلسفة.
إليك بعض القواعد العملية التي يفكر بها المحترفون:
-
سمِّ بنية واضحة (Name with Intent): قبل أن تكتب
=، توقف لثانية وفكر. ما هو أفضل اسم يصف هذه البيانات؟isUserAuthenticatedأفضل بألف مرة منflag.customerAddressأفضل منdata. اسم المتغير هو أرخص وأفضل شكل من أشكال التوثيق. -
احترم النوع (Respect the Type): لا تخلط الأنواع بشكل عشوائي. إذا كان لديك متغير لتخزين عمر المستخدم، فتأكد من أنه يبقى رقمًا دائمًا. اللغات الديناميكية تسمح لك بالفوضى، لكن المبرمج المحترف يفرض النظام بنفسه.
-
تبنَّ الثوابت (Embrace
const): في جافاسكريبت الحديثة، لديناlet(للمتغيرات التي قد تتغير قيمتها) وconst(للثوابت التي لا تتغير). القاعدة الذهبية: استخدمconstدائمًا بشكل افتراضي. لا تغير إلىletإلا إذا كنت تعرف أنك ستحتاج إلى إعادة تعيين القيمة. هذا يمنع فئة كاملة من الأخطاء الناتجة عن التعديلات غير المقصودة. -
اجعلها مقروءة (Prioritize Readability): الكود يُقرأ أكثر بكثير مما يُكتب. هدفك ليس كتابة أذكى أو أقصر كود، بل أوضحه. متغير جيد التسمية يساهم في المقروئية أكثر من أي تعليق.
لقد تعلمت الآن مفردات اللغة. لديك الكلمات (المتغيرات) وتصنيفاتها (أنواع البيانات). أنت جاهز لبناء جمل ذات معنى.
في الفصل القادم: سنستخدم هذه اللبنات الأساسية لبناء أول هيكل منطقي حقيقي. سنتعلم كيف نجعل برامجنا تتخذ قرارات. حان وقت الحديث عن الشروط والمنطق (Conditionals & Logic).