Scope Rules for Variables and Attributes

مرحبا…

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


Lexical scoping

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

Defining Variables and Variables access

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

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

2.jpg

ملحوظة:

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

يوجدثلاث نطاقات في منطقة ال 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 يغير فقط ال Object الحالي.
  • يظل ال Local Scope يشير على ال  Class objects حتى بعد أقواس ال Objects طالما في منطقة ال Class ولكن في منطقة ال Local يغير ال Object Scope فقط.
  •  Object. Attribute يشير الي object attributes فقط.

How Ring find the variables

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

Local” ثم “Object” ثم “Global

عند عدم إيجاد المتغير يتم تعريفه في النطاقات الحالية.

  • النطاق الحالي لمنطقة ال class هو ” Object attributes
  • النطاق الحالي لمنطقة ال Global هو “ Global Scope
  • النطاق الحالي لمنطقة ال Local هو “ Local Scope

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

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

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

  1. نغير اسم المتغير المحلي “local”باسم اخر أو وضع علامات قبل الاسم لتغييره مثل “$، _”
  2. نستخدم النقطة “dot“+كلمة self قبل ال Attribute لتخصيص ال Attribute ل object
  3. نستخدم اسم ال object+النقطة “dotقبل ال Attribute لتخصيصه  لل object

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

مثال

5.jpg


Using Braces to access objects inside Class Methods

عندما نكون داخل method نكون في منطقة ال“local”وبالتالي يمكننا الدخول الي ال object التابع ل “method”.ولكن كما قلنا أذا كان هناك أقواس داخل ال 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

ملحوظة:

  • عند وجود self في منطقة ال Class يعني Class Object
  • عند وجود self في منطقة ال Class داخل أقواس ال Object يعني Class Object
  • عند وجود self في منطقة ال Local قبل وبعد أقواس ال Objectيعني Class Object
  • عند وجود self في منطقة ال Local داخل أقواس ال Object يعني ال object بداخل الاقواس ل Class اخر.

مثال 1:

6.jpg

7.jpg

فتح البرنامج

Conflict between Self inside Braces and Self in the Class region

يحدث خلط في الأسماء المشابهة المستخدمة لتعريف attributes بداخل ال object و attributes بداخل ال Class، لان في منطقة ال Class، أي تعريف أو ادخال ل object فيه يكون مرئيا ل Class

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

  • نستخدم Method و نستدعي الدالة لوضع[set] قيم ال attribute لل Object.
  • عن طريق استخدام دالة ال getter بحيث نحصل على قيمة ال attribute بداخل object بدالة.
  • نعمل قائمة–ونضيف ال objects اليها، وندخل قيم ال attributeبداخل ال Object عن طريق القائمة List 

variable + new class_name

List [Index]. Attribute name=new value

  • بطريقة ال “Declarative” للحصول على قيمة ال attribute في ال object عن طريق “Reference”

طريقة 1:

8.jpg

فتح البرنامج

طريقة2:

9.jpg

فتح البرنامج

طريقة3:

10.jpg

فتح البرنامج


Scope Rules in Ring Language

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

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

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


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

وننهي مقالتنا الان واذا كان هناك ملاحظات أو اقتراحات أرجو ابرازها في التعليقات

والي اللقاء…

يمكنك فتح المقالات الاخري المتعلقة باللغة من خلال هذا اللينك :  المحتوي

موقع اللغة

http://ring-lang.net

 

 

 

 

 

 

Advertisements

فكرة واحدة على ”Scope Rules for Variables and Attributes

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

اترك رد

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

WordPress.com Logo

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

صورة تويتر

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

Facebook photo

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

Google+ photo

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

Connecting to %s