AudaNix

نظام تسمية المتغيرات المجرى hungarian notation

1 مشاركة في هذا الموضوع

السلام عليكم ورحمة الله

ان شاء الله هذا درس تنظيمى فى سلسلة دروسة البرمجة الموجة بالكائن فى سي++ المترجمة ... ولقد بدأت بترجمتة لكن شاء الله ان ينتهي كثان درس.

ان شاء الله سأضيف الدروس المترجمة فى تسلسل زمني ثابت ومستمر .

00.نظام تسمية المتغيرات المجري Hungarian Notation

هو نظام للتسمية بأضاقة حروف فى بادئة اسماء المتغيرات لكي توضح النوع ومدي المتغير بمجرد قراءتة. مثال:

int value; // ﻻ يستخدم نظام التسمية
int nValue; // البادئة n تشير المتغير من نوع integer

double width; // ﻻ يستخدم نظام التسمية
double dWidth; // البادئة d تدل على نوع المتغير من نوع double

تم اختراعة فى 1972 بواسطة ساليز سيموني مبرمج فى ميكروسوفت. الفكرة اﻻساسية فى التسمية المجرية كانت لكي تعطي معلومات عن غرض المتغير او الهدف منة ولكن بمرور الوقت تغيرت الي ان تعطي معلومات عن نوع ومدي المتغير . قد يظن البعض ان ميزتها نسبة ولكن تظل مميزاتها اكثر بكثير من عيبوبها ..

احد مميزاتها ان بأمكانك تحديد نوع المتغير من اسمة. الكثير من المحللين يرون انها ميزة قديمة ، ﻻن المحررات الحديثة تخبرك بنوع المتغير بمجر مرور الفأرة فوقة. ومع ذلك انظر الى الجزئية التالية:

float applesPerPerson = totalApples / totalPersons;

عند تصفح لهذا الكود سريعا قد ﻻ تثير انتباهك هذا الجميلة . ولكن وارد جداً ان تكون خطأ.

لو ان كلا من totalApplesو totalPersons متغيرات من نوع عدد صحيح integers ، فان المترجم سوف يحسب totalApples / totalPersons باستخدام معامل قسمة اﻻعداد الصحيحة ، ويذلك تفقد اى كسور عشرية قبل ان يتم تعيينها الى المتغير applesPerPerson . فلو كانت totalApples = 5 و totalPersons = 3 فأن applesPerPerson سوف تاخذ القيمة 1 بدﻻ من القية التي تتوقعها وهي 1.66 !!!!

ومع ذلك لو اننا استخدمنا نظام تسمية المتغيرات:

float fApplesPerPerson = nTotalApples / nTotalPersons;

فأن البادئة n تجعل اﻻمر واضح تماما بمجر استعراضك للكود ان معامل قسمة اﻻعداد الصحيحة هو سبب المشكلة! باﻻضافة الى حسبما تستخدم من اكواد ، فأن البادئة n سوف تنبهك لكي تحترس من مشاكل قسمة اﻻعداد الصحية و فيض المكدس Overflow في كل وقت تستخدم المتغير الصحيح بداخل الجمل والتعبيرات البرمجية.

وهناك ميزة اخرى تعطينا طريقة مختصرة لتسمية المتغيرات ، مثال: bError نعم نفهمة على انه isError و nApples على انه اختصار لكتابة numberOfApples.

عيب واحد فى هذا النظام انه يتطلب عمل اضافى عند تغيير نوع المتغير . مثال ، من اﻻمور الشائة ان تعلن عن متغير integer ثم ﻻحقا تغيرة الى double بسبب انك تحتاج الى التعامل مع قيم عشرية. بدون استخدام نظام التسميات فانك فقط تغير من int الى double فقط . بينما ان فى نظام التسميات فانك باﻻضافة الى التغيير السابق تقوم بتغيير البادئة ايضا اي من nValue الى dValue . قد يكون هذا اﻻمر مزعج مع وجود نسخ كثير من المتغير تستخدمها ولكن مع المحررات الحديثة اصبح امر اعادية تسمية متغير سهل للغاية، بغيير تسميات متغيراتك فأنك تتجنب مخاطر عديدة من نوع البيانات الجديد.

على سبيل المثال، بدون استخدام التسميات انت ربما تكتب التالي:

if (value == 0)
// do something

عند تغيير القيمة من int الى double فأن المقارنة بد ان كانت آمنة اصبح اﻵن غير آمنة فأن مقارنة اﻻرقام ذات النقطة العائمة ربما تنتج نتائج غير متوقعة! فى افضل الحاﻻت فان هذا الخطأ يظهر اثناء اختبار برنامجك، وعليك قضاء الوقت فى تنقيحة. في أسوء الحالات فسوق تصلك رسائل الخطأ هو تطبيقك وتنتهى بأن اﻵﻻف العملاء لديهم البرنامج ﻻ يعمل بشكل صحيح !!!

ومع ذلك لو انك استخدمت نظام تسمية المتغيرات وكتبت:

if (nValue == 0)
// do something

وكنت مجبرا على تغييرة الى :

if (dValue == 0.0)
// do something

فأنك سوف تنتبه الى ونقول مهلا انا ﻻيجب علي عمل هذة المقارنة مع القيم ذات النقطة العائمة floating point values !!.

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

واحدة من العيوب فى نظام تسمية المتغيرات ان احرف البادئة بالنسبة للانواع المركية يمكن ان تصبح مربكة . فى Wikipedia بها مثال مناسب: a_crszkvc30LastNameCol فأن a مرجع ثابت وسيط دالة ، يحمل محتويات عمود فى قاعدة البيانات من نوع varchar(30) يسمي LastName كجزء من المفتاح اﻻساسي للجدول. فأن a_crszkvc هى ليست سهلة الفهم وقد تجعل كود اقل وضوحا .

نقطة جانبية اخري ، ان نظام التسمية المجري اشتق اسمة من البادئة مثل a_crszkvc كما لو انك كتبتها بلفة مجرية اساسا...

Caste Hungarian

العديد من المبرمجين وشركات البرمجة تميل الى استخدام انواع مختلفة من نظام التسميات المجري متعددة التعقيد. على الرغم ان بينهم قواسم مشتركة (مثل استخدام البادئة d للدﻻلة على double والــn أو i للدﻻلة على integers)، هناك العديد من التباين بمقدار نوع البادئة فى نوع البيانات وكيف يمكن دمج هذة البادئات مع بعضها.

نحن نعتقد ان استخدام بادئة لكل نوع بيانات امر مبالغ فية ، وخصوصا فى حالة هياكل البيانات و الفئات struct & classes التى تعمل انت على تعريفها وتخصيصها الى اقصى درجة.وطبعا استخدام بدئات كبيرة للأسف تعمل على تصعيب فهم لكود بدﻻ من المساعدة على وضوحة وفهم بسهولة. وبناء على ذلك فاننا ننصح وندافع عن نظام التسميات المبسط او ما يطلق علية Caste Hungarian . فى Caste Hungarian فانة يعمل على استخدام البدئات العامة ﻷنواع البيانات(اﻻعداد الصحيحة ، واعداد الفاصلة العائمة و الفئات الخ ...).

تتكون بادئة المتغيرات من 3 أجزاء: محدد مدي المتغير ومحدد نوع المتغير وبادئة النوع بالترتيب. محدد المدي ومحدد النوع يمكن عدم استخدامهما. وعلية فان طول البادئة بشكل عام معقول بمتوسط يدور حول عدد 2 حرف. وبهذة الطريقة فأن نظام التسميات المجري تغطي فيه المميزات على العيوب وايا البقاء على النظام بسيط وسهل اﻻستخدام وهذا ما نحية.

بادئة النوع تدل عل نوع بيانات المتغير:

post-247365-043323100 1345977947_thumb.p

التالى محدادات النوع تم ادراجها قبل البادئة اذا كنت تحب استخدامها:

post-247365-074721700 1345977956_thumb.p

التالى محدادات المدي بتم ادراجها قبل محدد النوع اذا كنت تحب استخدامها:

post-247365-091152100 1345977961_thumb.p

ملاحظات قليلة:

1.هذة القائمة ليست شاملة. انها تغطي أغلب الحاﻻت العامة. ان كان لديك متغير من نوع ما يستحق بادئة الخاصة بها اعطة اياها.

2.استخدام اسماء متغيرات ذات معاني واضحة ولواحق suffixes لكي تصبح متغيراتك اكثر وضوحا. هذا شئ هام خصوصا مع متغيرات هياكل البيانات والفئات.

3.المتغير من نوع char يمكن ان يكون لها بادئة مختلفة حسبما تستخدمة فيكن استخدامة كمتير حرفي ASSCI بالبادئة c او متغير عدد صحيح Integer بالبادئة n.

4.ان للمتغيرات من نوع float بادئة مختلفة عن النوع double ﻻ المتغيرات من نوع float هي اكبر من double. ضف البادئة f فى بداية كل اسم متغير من نوع float.

5. ان Typedef صعب جدا ادخال نظام التسميات علىها اي يصعب اسقاطها بداخل النظام.

6.يمكنك اهمال البادئة c فى الفئات اذا كان المتغير مؤشر pointer او مرجع الى فئة reference.

7.ولئن اﻻنواع الصحيحة integers متجانسة يمكنك التغيير من بسهولة من اﻻكبر الى اﻻصغر او العكس بدون تغيير اسم المتغير. ولو ان التغير الى اﻻصغر غير مفضل ﻻنة قد يسب خطأ فيض المكدس الشهير .

التالى القليل من اﻻمثلة على اﻻعلانات:

int nIndex; // بادئة العدد الصحيح البسيطو
int* pnIndex; // مؤشر الى عدد صحيح
int m_nIndex; // متغير عدد صحيح عضو فى فئة
int* m_pnIndex; // مؤشر الى متغير عدد صحيح عضو فى فئة

وفى النهاية ﻻ يسعنى اﻻ ان اشكر الله الذي اعانني على ترجمة واعداد هذا الدرس اخوكم/ محمد عودة

المصدر: hungarian-notation

الى لقاء اشاء الله فى درس تال... .

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .