الحلقة الثالثة عشرة من سلسلة تعلم البرمجة باسهل طريقة mt5

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • الحلقة الثالثة عشرة من سلسلة تعلم البرمجة باسهل طريقة mt5

    البرمجة كائنية التوجه ( أو غرضية التوجه او البرمجة الشيئية )
    Object-oriented Programming



    واحدة من أكثر الميزات الجديدة إثارة في MQL5 هي إضافة البرمجة الكائنية الموجهة. البرمجة الكائنية الموجهة (OOP اختصارًا) تشجع إعادة استخدام الشفرات وتخفي التفاصيل غير الضرورية للتنفيذ عن المستخدم. يسمح هذا بأسلوب برمجة أكثر مرونة وإيجازًا.

    مفاهيم البرمجة الكائنية الموجهة مجردة بطبيعتها وغالباً ما تكون محيرة بسبب المصطلحات الفنية. يمكن أن تكون صعبة على المبرمج الجديد لفهمها. لكن بمجرد أن تتعلم أسس OOP، ستجدها مفيدة للغاية.

    تقوم البرمجة الكائنية الموجهة على مفاهيم الفئات والكائنات. الفئة هي مجموعة من المتغيرات والوظائف التي تؤدي مجموعة من المهام ذات الصلة. يشار إلى المتغيرات والوظائف الموجودة داخل فئة بأنها أعضاء الفئة.

    الفئة هي مثل المخطط لكائن. خذ السيارة على سبيل المثال. السيارة لديها عجلة قيادة وذراع ناقل حركة وإشارة انعطاف ومصابيح أمامية وما إلى ذلك. ستحتوي فئة لكائن سيارة على جميع المتغيرات التي تصف حالة السيارة (السرعة والترس وما إذا كانت المصابيح الأمامية مضاءة أم لا)، وجميع الوظائف لأداء مهمة محددة (التسارع أو التباطؤ، تغيير التروس، تشغيل المصابيح الأمامية وإطفائها، وما إلى ذلك).

    يتم إنشاء كائن باستخدام الفئة كقالب. تصف الفئة السيارة، بينما الكائن هو السيارة نفسها. لكل كائن اسم فريد، مثل كل سيارة لديها رقم تعريف مركبة فريد. يمكنك إنشاء عدد كبير من الكائنات كما هو ضروري، تمامًا مثل شركة التصنيع التي يمكنها بناء العديد من السيارات من نفس الطراز.

    تختلف متغيرات كائن عن متغيرات الكائنات الأخرى، تمامًا كما أن السيارات المختلفة لديها سرعات مختلفة على الطريق السريع.

    على سبيل المثال، في مستشار خبير قد يكون لديك العديد من المؤشرات. للحصول على تقاطع متوسط متحرك، سيكون لديك على الأقل مؤشرين متوسطين متحركين. سيكون لكل متوسط متحرك فترة مختلفة، وقد يكون لديه أوضاع حساب وإعدادات أسعار مختلفة.

    يمكن تمثيل مؤشر متوسط متحرك بواسطة فئة. تحتوي فئة مؤشر المتوسط المتحرك على جميع المتغيرات والوظائف اللازمة لإنشاء المؤشر واسترداد قيمة المؤشر الحالية أثناء تشغيل البرنامج. باستخدام هذه الفئة، ننشئ كائنًا واحدًا أو أكثر، سيكون لكل منها معرفها الخاص وإعداداتها وقيم المؤشرات.

    لا نحتاج إلى القلق بشأن إنشاء مصفوفة سلسلة ديناميكية لتخزين قيم المؤشر، ولا نحتاج إلى التفكير في تهيئة المؤشر وتخزين مقبض المؤشر ونسخ قيم المؤشر من المجاريات إلى المصفوفة. تتم معالجة جميع هذه التفاصيل في تنفيذ الفئة. كل ما علينا فعله هو إنشاء كائن، واستخدام وظائف الفئة لأداء هذه المهام.



    الصفوف
    Classes



    تُعلن الصفوف على نطاق عالمي، تمامًا مثل الوظائف. يمكن وضع الصف في داخل برنامجك أو داخل ملف تضمين. تستخدم إعلانات الصف كلمة مفتاحية للصف متبوعة بمعرف فريد. يتم وضع أعضاء الصف داخل القوسين، مرتبة حسب الكلمات الرئيسية للوصول. يتم إنهاء القوس الختامي لإعلان الصف بفاصلة منقوطة.
    وفيما يلي مثال على إعلان لصف لكائن مؤشر:


    كود PHP:
    class CIndicator
    {
    protected:
    int handle;
    double main[];
    public:
    double Main(int pShift=0);
    void Release();
    CIndicator();
    }; 
    

    اسم الصف هو CIndicator. لديه ثلاثة أعضاء عامة واثنين من الأعضاء المحمية. لاحظ أن كل تصريح لدالة أو متغير داخل إعلان الصف يتم إنهاؤه بفاصلة منقوطة. القوس الختامي لإعلان الصف نفسه يتم إنهاؤه بفاصلة منقوطة أيضًا. يشمل أعضاء CIndicator العامة دالة Main() ودالة Release()، ومنشئ افتراضي بنفس اسم الصف. أما الأعضاء المحمية فتشمل المتغير handle والمصفوفة main[].
    سنناقش صف CIndicator بمزيد من التفاصيل في الفصل 17، لذا لا داعي للقلق إذا لم تفهم كيفية عمله بعد الآن. في هذا الفصل، سنستخدم صف CIndicator كمثال لشرح مفاهيم البرمجة الشيئية.

    الكلمات الرئيسية للوصول
    الكلمات الرئيسية public و private و protected هي كلمات رئيسية للوصول. تحدد ما إذا كانت متغيرًا أو دالة متاحة للاستخدام خارج الصف. فيما يلي وصف للكلمات الرئيسية للوصول:

    يتوفر أعضاء العامة للصف للاستخدام خارج الصف. هذه هي الطريقة التي يتفاعل بها البرنامج مع كائن. الأعضاء العامة عادة ما تكون دوالًا تقوم بمهام مهمة. يمكن للدوال العامة الوصول إلى وتعديل أعضاء الخاصة والمحمية للصف.

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

    أعضاء الحماية في الصف عمومًا هي أعضاء خاصة ستورثها الصفوف المشتقة. استخدم كلمة الرئيسة protected ما لم تكن متأكدًا من عدم تشتق أي صفوف من الصف الحالي.

    هذا المفهوم لإخفاء أعضاء الصف من بقية البرنامج هو مفهوم برمجة شيئية يُشار إليه باسم التجميع. من خلال إخفاء أعضاء الصف، نضمن أنها لن تُستخدم أو تعدل بشكل غير ضروري.

    يُعتَبَر صف CIndicator مصممًا للاستخدام كصف أب لصفوف المؤشرات الأخرى، مثل صف المؤشر المتحرك المتوسط. لقد أنشأنا هذا الصف لتنفيذ الميزات التي ستستخدمها كل مؤشر. على سبيل المثال، يتطلب كل مؤشر متغيرًا لتخزين مقبض المؤشر، لذا قمنا بإنشاء متغير صحيح يُسمى handle. سنحتاج أيضًا على الأقل إلى مصفوفة ديناميكية واحدة لتخزين قيم المؤشر. يُشار إلى الوسيطة الأولى (وأحيانًا الوحيدة) في مؤشر بواسطة الاسم الرئيسي، لذا قمنا بتعريف مصفوفة ذات أعداد مزدوجة تُسمى main[ ].

    كلا هذين المتغيرين محميين، مما يعني أنهما لا يمكن الوصول إليهما خارج صفنا، ويمكن الوصول إليهما فقط من قبل الأعضاء العامة للصف.
    بالنسبة لأعضاء صفنا العامة، قمنا بإنشاء دالة تسمى Main() لتحديث قيم المؤشر والوصول إلى القيم في مصفوفة main[]، ودالة Release() لإطلاق المؤشر من الذاكرة.

    دعونا نلقي نظرة أقرب على الدوال العامة لصفنا. سنبدأ بدالة Main(). تقوم هذه الدالة بنسخ بيانات المؤشر إلى مصفوفة main[] باستخدام متغير المقبض لتحديد المؤشر، وتُعيد القيمة للشريط المحدد. إليك تصريح الدالة لدالة Main():

    كود PHP:
    double CIndicator::Main(int pShift=0)
    {
    CopyBuffer(handle,0,0,MAX_COUNT,main);
    double value = NormalizeDouble(main[pShift],_Digits);
    return(value);
    } 
    

    تم وضع تصريح هذه الدالة على النطاق العالمي، بعد إعلان صف CIndicator. لاحظ CIndicator:: مباشرةً قبل مُعرف الدالة. العامل المزدوج (::) هو عامل الفصل بالنطاق. يحدد الدالة كجزء من نطاق محدد - في هذه الحالة، النطاق هو صف CIndicator.
    لاحظ أيضًا أن المتغيرين handle و main[] المحميين لدينا يُستخدمان كمعلمات لدالة CopyBuffer(). الطريقة الوحيدة التي يمكننا من خلالها الوصول إلى أعضاء الصف المحمية والخاصة هي من خلال دالة الصف العامة. إذا حاولت الوصول إلى هذه الأعضاء من أي مكان آخر في برنامجك، ستحصل على خطأ في الترجمة.

    الطريقة المفضلة لتصريح دوال الصف هي الأسلوب المستخدم أعلاه. لكن يمكنك أيضًا تصريح الدالة بشكل مباشر داخل إعلان الصف نفسه. هذا مفيد للدوال القصيرة جدًا التي تتكون من سطر واحد أو سطرين. إليك مثال باستخدام دالتنا Release():



    كود PHP:
    class CIndicator
    {
    public:
    void Release() { IndicatorRelease(handle); }
    // ...
    }; 
    

    تم تصريح دالة Release() على سطر واحد داخل إعلان صفنا. تتكون من استدعاء دالة IndicatorRelease(). تحتوي محتويات الدالة داخل القوسين. ليس من الضروري وضع فاصلة منقوطة بعد القوس الختامي، على الرغم من أن المترجم لن يشكو إذا فعلت.



    المُنشئات
    Constructors


    عند إنشاء كائن من صف، يُنفّذ تلقائيًا دالة تُسمى المُنشئ. يُستخدم المُنشئ لتهيئة المتغيرات داخل كائننا. إذا لم يتم تعريف مُنشئ بوضوح، فإن المترجم ينشئ مُنشئًا افتراضيًا لتهيئة المتغيرات. لا يمكن للمبرمج رؤية هذا المُنشئ الافتراضي.

    في دالة CIndicator لدينا، قمنا بتعريف مُنشئ افتراضي خاص بنا، يُسمى أيضًا CIndicator(). يجب أن يتطابق اسم المُنشئ مع معرف الصف. ليس من الضروري تحديد نوع العودة لمُنشئ افتراضي، حيث أن النوع دائمًا فارغ. مستوى الوصول لمُنشئ يجب أن يكون عامًا.
    فيما يلي تعريف المُنشئ CIndicator() داخل إعلان الصف CIndicator:



    كود PHP:
    class CIndicator
    {
    public:
    CIndicator();
    // ...
    }; 
    

    وهنا هو مُنشئ الصف الذي تم تعريفه بشكل صريح. الغرض الوحيد من مُنشئنا هو تعيين مصفوفة main[ ] كمصفوفة سلسلة.


    كود PHP:
    CIndicator::CIndicator(void)
    {
    ArraySetAsSeries(main,true);
    } 
    
    تذكر، لا حاجة لتعريف مُنشئ افتراضي بشكل صريح إذا لم تكن بحاجة إليه. إذا كانت هناك إجراءات ترغب في تنفيذها تلقائيًا عند إنشاء كائن، فقم بإنشاء مُنشئ افتراضي للقيام بذلك.

    هناك أشياء أكثر تقدمًا يمكنك القيام بها باستخدام المُنشئات، مثل المُنشئات المعلمة وقوائم التهيئة. هناك أيضًا المُدمر، الذي يُستدعى عند تدمير كائن. نظرًا لأننا لن نستخدم تلك الميزات في هذه الدروس.




يعمل...
X