Scope Rules for Variables and Attributes

مرحبا…

موضوع اليوم  يتحدث عن قواعد استخدام وتعريف ال “Variables“و “attributes” في أماكن مختلفة [Global,Classes,Objects,Methods,Functions] لتفادي المشاكل التي تحدث عند التعريف.وسوف نوضح تلك القواعد مجمعة في نهاية المقالة.


Lexical scoping

يعنى ان نطاق ظهور المتغير يتوقف على مكانه فى الكود.

Defining Variables and Variables access

يوجد ثلاث نطاقات يتم فيها تعريف المتغيرات

  • Global Scope:قبل تعريف ال Classes و Functions و ال Objects
  • Local Scope: بداخل ال Methods and Functions
  • Object Scope: بداخل ال Object بداخل اقواس ال Object {}.

2.jpg

ملحوظة:

  • عندما اذكر منطقة ال Class فأنا أعني بالمنطقة بعد اسم ال Class وقبل تعريف اي Method.
  • وعندما اذكر منطقة ال Local فأنا أعني بالمنطقة داخل ال Function و ال Method.
  • عندما اذكر ال “attributes” فأنا أعني بصفات ال “Object” وعندما أذكر ال “Variables” فأنا أعني بالمتغيرات التي تحمل  قيمة متغيرة كما يمكن أن تحتوي علي ال “attributes” كقيمة لها.

يوجد ثلاث نطاق في منطقة ال Class للوصول الي ال Object:

  1. Global Scope: يشير الي Global Scope 
  2. Object Scope: يشير الي objects accessed from its class
  3. Local Scope: يشير الي objects accessed from its class

 ملحوظة:

  •  self تعني الإشارة الي ال object الحالي.
  • استخدام أقواس ال Object يغير ال Scope لل Object الحالي اذا كان في منطقة Local وليس في منطقة ال Class.

في هذه الصورة التوضيحية يوجد Object  من Class   يحتوي علي attributes داخل Local أو method في Class  اخر:

3.PNG

وفي هذه الصورة التوضيحية يوجد Object  من Class   لايحتوي علي attributes داخل Local في Class  اخر وبالتالي يتغير ال Scope ما بعد الاقواس {} ولذلك تشير ال attributes ما يعد الاقواس علي ال object وليس علي ال Class وللوصول الي ال Class attributes نستخدم self.attributes_name


 

4.PNG

How Ring find the variables

في حالة البحث عن المتغيرات يكون بالترتيب التالي من اليمين لليسار:

Local” ثم “Object” ثم “Global” أي يبحث من أقرب مكان له.

Conflict between Global Variables and Class Attributes

يحدث خلط في الأسماء المشابهة المستخدمة لتعريف variables في منطقة “global” وال attributes

لان كل من Object scope[وما يحتوي عليGlobal scope & [attributes[وما يحتوي علي ال variables]

يكونوا مرئيين في منطقة ال Class.

واليكم الحلول التالية لحل هذه المشكلة:

  1. نستخدم دالة ال Main في البداية لمنع النطاق العام
  2. نغير اسم المتغير العام “global”باسم اخر أو وضع علامات قبل الاسم لتغييره مثل “$، _”
  3. نستخدم النقطة “dot“+كلمة self قبل ال Attribute لتخصيص ال Attribute ل class
  4. نستخدم دالة AddAttribute لإضافة وتخصيص Attribute ل Object

(AddAttribute (self, attribute name

ملحوظة:

ينبغي تقليل النطاق المرئي أو العام لتقليل المشاكل – وينبغي وضع علامة “$” قبل المتغير العام أو استخدام دالة ال “Main”.

مثال 1

3.jpg

مثال 2

4.jpg

الكود


Conflict between Local Variables and Class Attributes

يحدث خلط في الأسماء المشابهة المستخدمة لتعريف variables في منطقة “local“وال attributes

لان كل من Class scope [وما يحتوي علي  Local scope &  [attributes [وما يحتوي علي ال variables]يكونوا مرئيين في منطقة ال Class.

واليكم الحلول التالية لحل هذه المشكلة:

  1. نغير اسم ال “Class attributes” باسم اخر أو وضع علامات قبل الاسم لتغييره مثل “@”
  2. نستخدم النقطة “dot“+كلمة self قبل ال Attribute لتخصيص ال Attribute لل Class
  3. نقوم بادخال أو تعريف ال Attribute لل object بال dot” لتخصيصه.

(طريقة ادخال ال object عن طريق ال dot وحذف الاقواس {})

مثال

5.jpg


Using Braces to access objects inside Class Methods

عندما نكون داخل method نكون في منطقة ال“local” و كما قلنا أذا كان هناك أقواس داخل ال methods،فعندئذ يتغير الاتجاه الي ال object الجديد المدخل والتابع ل classاخر.

طرق الوصول الي Class attributes من داخل أقواس object ل Class اخر:

  1. كتابة الكود اللازم للوصول الي Class attributes خارج اقواس ال object حتى يكون في منطقة ال local المرئية ل class.
  2. عن طريق عمل نسخ ل object “self” الي متغير في منطقة ال local حتى يشير الي class object، وبالتالي نستطيع استخدام هذا المتغير بدلا من self داخل الاقواس حتى يشير الي object الذي تم عمل نسخ له-ويمكننا الوصول الي Class attributes.

لتعديل قيم ال Class attributes  من داخل أقواس ال object الجديد الموجود في منطقة ال “Local”يكون عن طريق الاتي:

  • النسخ خارج الاقواس[نسخ القيم الجديدة الي ال Class attributes]باستخدام “Self”

Self.ClassAttribute=value  | variable

  • عن طريق الوصول المباشر الي Class attributes باستخدام كلمة this من داخل الاقواس:

this.ClassAttribute= new value

مثال 1:

6.jpg

7.jpg

الكود

Conflict between Self inside Braces and Self in the Class region

يحدث مشاكل عند تعريف attribute في منطقة ال Class بنفس اﻻسم في منطقة ال Object ومن ثم استخدام Self داخل ال Object فعندئذ يشير  ال Class

واليكم الطرق التاليه لحل هذه المشكلة:

  • عن طريق دالة ال getter نحصل على قيمة ال attribute بداخل object.
  • عن طريق “Reference ” أو ال declarative كما وضحنا من قبل.
  1. طريقة 1و2 يوضح ال Declarative مع ال Reference 
  2. طريقة 3 يوضح ارجاع ال Object عن طريق ال Reference عند تمرير ال Object في دالة.

طريقة 1:

8.jpg

الكود

طريقة2:

9.jpg

الكود

طريقة3:

10.jpg

الكود


ملحوظة:

في الاصدار 1.7 للغة البرمجة رينج تم اضافة load package لفصل ال global Scope من الملفات التي يتم تحميلها داخل ملف المشروع . حتي لا يحدث Conflict عند تشابة المتغيرات في الملفات. فيتم كتابة load package  ثم يلية اسم الملف الذي نريد أن نفصل متغيراته عن المشروع التنفيذي.

Load Package filename

Scope Rules in Ring Language

لكل لغة برمجة Scope بناء على هدف اللغة-وينبغي مراعاة القوانين الخاصة بذلك.

ويوجد في لغة رينج القوانين التي تحكم الدخول الي النطاقات المختلفة لزيادة المرونة والأمان وخصوصا مع التطبيقات الكبيرة ونذكرها في تلك النقاط التالية:

  • في منطقة ال Class قبل تعريف ال method يكون كلا من ال “Local ) – وال “Object” وال “Global”يشيروا الي ال Class Object.
  • ولابد من استخدام ال attribute في منطقة ال class فإما أن يجده ويعطي له قيمة أو ينشئه ويعطي قيمة له.
  • عند تعريف المتغيرات في منطقة ال Class باستخدام “self. Attribute” ،فذلك يمنع الخلط مع المتغيرات العامة.
  • يمكنك تغيير ال scope Object عن طريق الاقواس { }
  • يمكنك استخدام النقطة بدلا من الاقواس ” Attribute “اذا أردت الا تغيير النطاق.
  • استخدام Self في منطقة ال”local” قبل أقواس ال Object أو بعد أقواس ال Object يعني الإشارة الي ال Object ال Class.
  • استخدام Self داخل الاقواس {} في منطقة ال “local ” يعني الإشارة الي ال Object المدخل.
  •  [Object. Attribute] يتم البحث في ال Attributes الخاصة بال Object.
  • [Self. Attribute] يتم البحث أولا في  “self” ثم ال Attributes.
  • في حالة الحاجة الي استخدام  ال attributes أو ال method لل Class الحالي من داخل أقواس Object لClass اخر نستخدم this. Attribute


    من المهم أن تعرف تلك القواعد حتي لا تقع في الاخطاء عند انشاء مشروعك الذي يحتوي علي الكثير من المتغيرات و ال attributes و  عندما تريد أن تأخذ متغيرات و attributes من مكان لاخر،  فيجب عندها أن تعرف مدي السماحية لذلك.

للاطلاع علي المقالات الاخري من هنا

تستطيع الاطلاع علي المشاريع مفتوحة المصدر من الموقع  GitHub
الموقع الرسمي للغة  http://ring-lang.net

وشكرا لكم والي اللقاء

 

 

 

 

 

 

Advertisements

3 أفكار على ”Scope Rules for Variables and Attributes

  1. تعقيب: Reflection and Meta-Programming | لغة البرمجة رينج Ring programming language

  2. تعقيب: (2)Object-oriented programming – OOP | لغة البرمجة رينج Ring programming language

  3. تعقيب: Scope Rules for Functions and Methods | لغة البرمجة رينج Ring programming language

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   /  تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   /  تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   /  تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   /  تغيير )

w

Connecting to %s