إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

البرمجة الكائنية في بيرل (الجزء الثالث) " الطريقة الحديثة"

تقليص
X
تقليص

  • البرمجة الكائنية في بيرل (الجزء الثالث) " الطريقة الحديثة"

    بسم الله الرحمن الرحيم

    نواصل الكلام عن البرمجة الكائنية في بيرل و هذه المرة سنستعرض النموذج الحديث او ما يعرف بـ Moose و قد تقدم الكلام عن الجانب التاريخي و النظري في المقالة الاولى . هذه المرة لن استرسل في شرح المصطلحات و المفاهيم فقد قمنا بهذا الامر في المقالتين الاولى و الثانية و مهمتنا هنا فقط استعراض طريقة الكتابة و التنبيه الى اوجه الاختلاف ان وجدت.
    نبدأ بتعريف كلاس جديد باسم car بهذه الطريقة :
    كود PHP:
      package Car
     use 
    Moose
    انتهى ! هذا كلاس كامل و في النموذج الجديد Moose تقوم بتوفير الكونستركتر الافتراضي بالاضافة الى توفير الـ getters و الـ setters فلا نحتاج لكتابة اكواد خاصة لها ! حسنــــاً لنجعل من هذا الكلاس كلاسا مجردا Abstract اي انه لا يمكن انشاء اي كائن من هذا الكلاس فالغرض الرئيسي منه هو غرض تنظيمي ، و ذلك يتم باضافة هذا السطر :
    كود PHP:
         use MooseX::ABC
    الان نأتي لطريقة كتابة الخصائص في النموذج الجديد :
    كود PHP:
         has 'make' => (is => 'rw' isa => 'Str'); 
     
    has 'type' => (is => 'rw' isa => 'Str'); 
    في مثالنا قلنا ان الكلاس هذا يحتوي على خاصية باسم make "اسم الشركة المصنعة" و ان تصريح الوصول اليه rw و هي اختصار لـ read write اي يمكن الوصول الى هذا الخاصية و يمكن تغيير محتواها . في نهاية التعريف قلنا اننا نتوقع قيمة نصية لهذه الخاصية . نلاحظ ان الاعلان عن الخصائص في النموذج الجديد مفصل و واضح و افضل بكثير من النموذج القديم يكفي فقط خاصية تحديد نوع البيانات . قلنا ايضا ان Moose ستنشئ لنا ميثودات مساعدة بدون الحاجة الى كتابتها يدويا فالان يمكننا ان نصل الى قيم الخصائص هكذا ( لو على فرض ان الكلاس ليس كلاسا مجردا و يمكن فعليا انشاء كائنات منه ) :
    كود PHP:
         use v5.12
     
    my $car Car->newmake => 'toyota' type =>'camry'); 
     
    say $car->make(); #toyota 
    بل يمكننا ان نعدل قيم الخصائص ايضا فلو على فرض ان شركة نيسان قامت بشراء فئة الكامري من تويوتا فيمكننا ان ننقل الملكية هكذا:
    كود PHP:
         $car->make('Nissan'); 
     
    say $car->make(); #Nissan 
    الان لانشاء كلاس Salon يرث هذا الكلاس المجرد :
    كود PHP:
         package Salon
     use 
    Moose
     extends 
    'Car'
    فكلمة extends هنا هي من تقوم بتحديد العلاقة بين الكلاسين بأنها وراثية . طبعا كلاس صالون سيرث كل شيء من الكلاس الاب و يمكننا ان نضيف اشياء خاصة به مثلا:
    كود PHP:
         has 'options' => (is => 'rw' isa => 'Str'); 
    طبعا انشاء الخصائص في النموذج الجديد مفصل جدا و لو تقصينا الكلام عن امكانياته فسيطول بنا المقام . لكن هنا احببت الكلام عن الـ roles و هي شيء يشبه الـ interfaces في جافا حيث انها كلاسات مهمتها تنظيمية و يمكن استخدامها تماما مثلما تستخدم في جافا او بطرق اخرى حيث في بيرل يمكن اضافة الاكواد الخاصة بالميثودز و ليس فقط الاكتفاء باعلان اسماء الميثودز . لنأخذ مثالا لتتضح الصورة فمثلا بعض الكلاسات توفر آلية لحفظ الكائنات و استرجاعها لاحقا هذه الالية من الافضل ان تطبق على انها واجهة بدلا من علاقة التوارث . و في النموذج الجديد الامر بهذه البساطة :
    كود PHP:
            package Storable
     use 
    Moose::Role
        
    requires 'store'
    فهنا قلنا ان Storable تتطلب ان يكون الكلاس المطبق يحتوي على ميثود باسم store. و الان عندما نعلن عن كلاس ما بأنه يطبق هذه الواجهة بالامر :
    كود PHP:
         with 'Storable'
    فعلينا ان نقوم بإنشاء ميثود باسم store و الا سيرجع لنا المفسر خطأ :
    كود PHP:
         sub store{
          
    #some code to store the object
          
    }; 
    و لو اردنا ان نستعلم عن كلاس ما في كونه يطبق واجهة معينة او لا فيمكننا ذلك من خلال الامر DOES :
    كود PHP:
      say "it is storable" if $car->DOES('Storable'); 
    بشكل عام ينصح باستخدام الـ roles بدلا من استخدام التعدد في التوارث . على كل حال لن اطيل في استعراض نموذج Moose فهناك الكثير ليقال هنا و لكن فيما تقدم استعراض لاهم المزايا التي نستخدمها بشكل متكرر .
    ختاما تجدر الاشارة الى ان هناك مكتبات اخرى متوافقة مع Moose مثل Moo و Mouse و لكن هناك مكتبات اخرى تقدم نماذج كائنية خاصة بها و لها فلسفتها الخاصة ، هذا بالاضافة الى الكثير من المكتبات المساعدة التي تقدم آليات لتسهيل البرمجة الكائنية في النموذج القديم مثلا Object::Tiny تقدم ابسط اشكال بناء الكلاسات و اكثرها اختصارا :
    كود PHP:
      # Define a class
     
    package Foo
     use 
    Object::Tiny qwbar baz };
     
    1
     
    # Use the class
     
    my $object Foo->newbar => ); 
     print 
    "bar is " $object->bar "\n"
    خلاصة المطلب في هذه السلسلة من المواضيع ان بيرل مختلفة عن اكثر لغات البرمجة من حيث انها تحتوي على اكثر من نموذج كائني . و قد استعرضنا النموذج القديم و بعض النماذج الجديدة من هنا قد يلحظ القارئ الكريم قوة هذه اللغة من حيث امكانية تطويعها الى حدود قصوى .
    دمتم في الرضا ،

    http://alyassen.com/blog.pl/modern-oo.html
      لا يمكن إضافة تعليقات.

    التصانيف

    تقليص

    Latest Articles

    تقليص

    • تجربة تثبيت توزيعة ديبيان بجانب ويندوز بدون usb او cd
      أحمد غريب
      التجربة تمت على VirtualBox النظام ويندوز اكسبي قرص صلب واحد قسمين c و d

      التجربة قسمين القسم الاول تجهيز ملف iso دبيان لعملية الاقلاع لايف من الهاردسك والقسم الثاني عملية الثتبيت تحتاج الى
      27-11-2016, 03:08 PM
    • عداد الإستغفار
      مبتدى في للينكس
      السلام عليكم ورحمة الله و بركاته

      شرح فكرة السكربت:

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


      شرح إعداد السكربت:

      1. قم بفتح مجلد Home وقم بإنشاء مجلد بإسم counter

      2. في داخل المجلد counter قم بإنشاء ملف نصي بإسم Counter.java , ثم قم بنسخ السكربت التالية و ضعه في داخل الملف ثم قم بالحفظ



      :
      package counter; import java.awt.BorderLayout; import java.awt.Event; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.PrintWriter; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JButton; import javax.swing.SwingConstants; public class Counter extends JFrame { private static String fileName = System.getProperty("user.dir") + "/counter/count.txt"; public Counter() { this.setTitle("Counter"); this.setResizable(false); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); this.setSize(150, 150); this.setVisible(true); } public static void main(String[] args) { Counter obj = new Counter(); int count = 0; try { try { try { String countString = readFile(fileName, StandardCharsets.UTF_8).trim(); count = (int) Integer.parseInt(countString); } catch (Exception e) { outResult(fileName, String.valueOf(count)); } finally { if (count
      ...
      23-11-2016, 02:11 AM
    • سكربت بايثون لتسهيل تثبيت بعض الأشياء في فيدورا
      yucef
      بسم الله الرحمن الرحيم
      السلام عليكم ورحمة الله وبركاته




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

      https://github.com/yucefsourani/arfedy

      ...
      23-11-2016, 02:09 AM
    • إعادة تسمية الملفات باستخدام rename
      OtmanGX
      لينكس على السّريع : إعادة تسمية الملفات باستخدام rename


      تذكير بالموضوع السابق : إعادة تسمية الملفات باستخدام mv

      كما في المرة السابقة سنتحدث اليوم عن إعادة تسمية مجموعة من الملفات لكن باستخدام أداة أخرى وهي rename ؛ بحيث أنّنا لن نضطر لاستعمال حلقات التكرار والأمر مشابه نوعا ما لما يقوم به الأمرsed ، لكن الأداة rename تستخدم التعابير النظامية perlexpr لكننا سنذكر فقط التعابير النظامية المشتركة بين الاثنين .
      بعض خصائص الأمر :
      n, –no-act- : يوصى باستخدام هذه الخاصية كثيرا ، فمن خلالها يتم إظهار التغييرات التي ستتم بدون إجراء أي تعديل
      f, –force : الكتابة على الملفات بدون أدنى تحذير
      v, –verbose – : تفعيل وضع verbose ليتم إظهار التغييرات الجارية
      ويكون الشكل العام للأمر كالتالي :

      :
      rename [option] 's/old-name/new-name/' file
      باستبدال file بالملفات التي تود تغيير أسمائها
      كمثال أوّلي مثلا نريد استبدال المسافات الفارغة المتواجدة في أسماء الملفات أو المجلدات بالرمز _ :

      المثال 1 :
      :
      rename 's/ /_/g' *
      g ليتم الاستبدال في أكثر من موضع إن وجد
      الآن سنقوم كالعادة بإنشاء مجلد نقوم فيه بأمثلتنا
      ...
      23-11-2016, 02:05 AM
    • المراقبة العالمية ! Global surveillance
      عبدالرحمـن محمد
      السلام عليكم ورحمة الله

      مقدمة :
      في يونيو 2013، سرَّب إدوارد سنودين، وهو عميل متعاقد مع وكالة الأمن القومي، مستندات تّصِف بريسم "ومجموعة برامج أخري" بأنه برنامج يتيح مراقبة معمقة للاتصالات الحية والمعلومات المخزنة. ويمكن من استهداف أي عميل لشركة منخرطة في برنامج بريسم، في حال كان هذا العميل يسكن خارج الولايات المتحدة، أو كان مواطنًا أمريكيًا له اتصالات تتضمن محتويات وِب خاصة بأشخاص خارج الولايات المتحدة. البيانات التي يقال أن بريسم يمكِّن من الحصول عليها تتضمن، رسائل البريد الإلكتروني، ومحادثات الفيديو والصوت، والصور، والاتصالات الصوتية ببرتوكول الإنترنت، وعمليات نقل الملفات، وإخطارات الولوج وتفاصيل الشبكات الاجتماعية.
      كشفت الوثائق المسرّبة أن NSA كانت قادرة على الدخول مباشرة إلى الخوادم الخاصة لكل من
      ...
      23-11-2016, 02:04 AM
    • اضافة مستخدم لينيكس جديد و استعمال نفس اسم الحساب لMySQL و قاعدة بيانات بإسمه ايضًا.
      superlinux
      طبعًا هذه استعملها لفتح حساب جديد لشخص يريد ان يستعمل مجلده المنزل (او home directory بالانجليزي) لحفظ موقع الويب خاصته. يعني هذه طريقة ارجو تكون خفيفة ظريفة لإدارة الخادم عليكم. و هكذا ابدؤوا بيع المواقع عالسريع.

      انا استعمل دبيان 8.0 جسي هنا.

      قبل أي شيء, لتوظيف المجلدات المنزل كلها لتكون محافظ لصفحات ويب لكل مستخدم. نفعّل الوحدة userdir:
      كود:
      a2enmod userdir
      بس على شان تفهم كيف تحفظ الامر السابق: a2 = apache2 web server , enmod =enable module
      هناك الكثير من الاوامر تخص خادم الويب اباتشي تبدأ بــ a2 .

      ثم حرر بأي محرر نصي مثل vi او pico ملف اعدادات الاباتشي:

      كود:
      vi /etc/apache2/apache2.conf
      ضع في آخر سطر في الملف على سطر مستقل لوحده ما يلي:
      كود:
      UserDir public
      UserDir disable root
      الكلمة public_html هو اسم مجلد موجود في المجلد المنزل مباشرة. بمعنى لو كان عندك اسم مستخدم اسمه saleem (سليم) , لازم سليم يضع موقعه على الخادم داخل مسار القرص /home/saleem/public_html/ . و التعل...
      23-11-2016, 02:03 AM
    يعمل...
    X