الدرس(20) نطاق المتغيرات (Variable Scope).
الدرس 20: نطاق المتغيرات - أين تعيش بياناتك؟
تخيل أنك تبني مدينة ضخمة (برنامجك). كل منزل في هذه المدينة (كل دالة) له عنوان بريدي فريد. الآن، ماذا لو أرسلت رسالة موجهة إلى “أحمد” في المنزل رقم 10 بشارع الياسمين؟ هل يتوقع “أحمد” الذي يعيش في المنزل رقم 5 بشارع الورد أن يستلمها؟ بالطبع لا. هذه الفكرة البسيطة عن الخصوصية والعناوين هي جوهر أحد أهم المفاهيم وأكثرها تسببًا للأخطاء في البرمجة: نطاق المتغيرات (Variable Scope).
اليوم، ستتعلم كيف تصبح مهندسًا معماريًا لمدينتك الرقمية، وتفهم أين “تعيش” متغيراتك، ومن له الحق في رؤيتها، ولماذا لا يمكنك الوصول إلى كل شيء من أي مكان.
في هذا الدرس ستتعلم
ما هو نطاق المتغير (Variable Scope) ولماذا هو أساسي للبرمجة المنظمة.
الفرق بين النطاق المحلي (Local Scope) ومتغيرات الفئة (Class Scope / Member Variables).
فهم “دورة حياة” المتغير المحلي وكيف يتم إنشاؤه وتدميره.
لماذا يساعد النطاق في منع الأخطاء غير المتوقعة وتضارب الأسماء.
كيفية تجنب الخطأ الشائع “cannot find symbol”.
الفصل الأول: المدينة المفتوحة (مشكلة بدون نطاق)
تخيل لو أن كل متغير تعلنه في برنامجك كان متاحًا في كل مكان. هذا يشبه العيش في مدينة بدون جدران أو أبواب، حيث يمكن لأي شخص دخول أي منزل وأخذ أي شيء. في البداية قد يبدو هذا مريحًا، لكنه سرعان ما سيتحول إلى فوضى عارمة.
تضارب الأسماء: ماذا لو كان لديك دالتان، وكلتاهما تحتاجان إلى متغير عداد اسمه i؟ في عالم بلا نطاق، ستتداخلان وتفسدان عمل بعضهما البعض.
أخطاء جانبية: قد تقوم دالة بتغيير قيمة متغير بالخطأ، مما يتسبب في انهيار دالة أخرى تعتمد عليه في مكان آخر من البرنامج، وسيكون من المستحيل تقريبًا تعقب الخطأ.
لهذا السبب، لغات البرمجة مثل جافا تفرض قواعد صارمة حول “مكان إقامة” كل متغير.
الفصل الثاني: المنزل الخاص (النطاق المحلي – Local Scope)
النطاق الأكثر شيوعًا الذي تعاملت معه حتى الآن هو النطاق المحلي (Local Scope).
المتغير المحلي (Local Variable)
هو أي متغير يتم الإعلان عنه داخل دالة (Method) أو كتلة كود (مثل حلقة for أو جملة if). هذا المتغير “يولد” عند دخول الدالة، “يعيش” فقط داخل تلك الدالة، و”يموت” (يتم تدميره من الذاكرة) بمجرد انتهاء تنفيذ الدالة.
إنه مثل الأدوات التي تشتريها لمطبخك. يمكنك استخدامها بحرية داخل المطبخ، لكن لا يمكن لشخص في غرفة النوم الوصول إليها مباشرة. لا أحد خارج المطبخ يعرف حتى بوجودها.
اضغط على "تشغيل" لعرض النتيجة هنا.
رسائل النظام ستظهر هنا.
الخطأ cannot find symbol: variable result هو أشهر دليل على أنك تحاول الوصول إلى متغير محلي خارج نطاقه. أنت تحاول فتح باب غرفة النوم باستخدام مفتاح المطبخ.
الفصل الثالث: الميدان العام (متغيرات الفئة – Class Scope)
لكن ماذا لو أردنا معلومة تكون متاحة لكل المنازل (الدوال) في مدينتنا (الفئة)؟ مثل اسم المدينة نفسها أو عدد سكانها. هنا يأتي دور متغيرات الفئة، والتي تسمى أيضًا متغيرات العضو (Member Variables) أو الحقول (Fields).
متغير الفئة (Class Variable / Member Variable)
هو متغير يتم الإعلان عنه داخل الفئة (Class) ولكن خارج أي دالة. هذا المتغير يكون متاحًا لكل الدوال (غير الثابتة) داخل تلك الفئة.
إنه مثل تمثال في ميدان عام. كل سكان المدينة يمكنهم رؤيته والتعامل معه.
اضغط على "تشغيل" لعرض النتيجة هنا.
رسائل النظام ستظهر هنا.
النطاق المحلي هو الأفضل (عادةً)
كقاعدة عامة، اجعل متغيراتك محلية قدر الإمكان. هذا يسمى مبدأ “تقليل النطاق”. إنه يجعل الكود أكثر أمانًا وقابلية للتنبؤ، حيث لا يمكن لدالة أن تغير بالخطأ متغيرًا تستخدمه دالة أخرى. لا تستخدم متغيرات الفئة إلا للبيانات التي تمثل حالة (state) الكائن بأكمله (مثل اسم اللاعب ودرجته).
الفصل الرابع: نطاق الكتلة (Block Scope)
جافا تأخذ الخصوصية إلى مستوى أبعد. أي متغير يتم الإعلان عنه داخل كتلة من الكود (أي شيء بين { … }، مثل حلقة for أو جملة if) يكون متاحًا فقط داخل تلك الكتلة.
اضغط على "تشغيل" لعرض النتيجة هنا.
رسائل النظام ستظهر هنا.