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

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

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

تقليص
X
تقليص

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

    بسم الله الرحمن الرحيم
    في هذا الجزء سنحاول ان نستعرض النموذج القديم في بيرل و نتعرف على طريقة كتابة البرمجة الكائنية بشكلها القديم . هذه الايام نادرا ما نحتاج الى الكتابة بالطريقة القديمة و لكن المعرفة - و لو الاجمالية - ستكون مفيدة جدا و ذلك لنقاط نذكر منها :
    - قد نحتاج الى قراءة او تعديل اكواد مكتوب بالطريقة القديمة خاصة ان بيرل لغة قديمة و هناك الكثير من المشاريع و البرامج القديمة التي لا تزال قيد الاستخدام.
    - معرفة الطريقة القديمة تعطينا معرفة اجمالية بأساسيات البرمجة الكائنية في بيرل و بذلك يكون لدينا عمق اكبر في فهم الطريقة الجديدة .
    - معرفة الطريقة القديمة تعطينا بعدا جديدا في معرفة كيفية تطبيق النماذج الكائنية في لغات البرمجة فالاشخاص الذين تعلموا البرمجة الكائنية من خلال جافا او بايثون او سمولتولك قد تكون نظرتهم الى البرمجة الكائنية فقط من منظار ما يقدمه نموذج هذه اللغات لذلك معرفة طريقة بيرل المغايرة - او طريقة جافا سكربت كمثال اخر- يعطي سعة في الاطلاع و كأنه دراسة مقارنة.
    - الطريقة القديمة تقدم نموذجا شبه متكامل من خلال التوليف بين مزايا بسيطة موجودة في اصل اللغة، من خلالها ندرك ان النموذج الكائني قد لا يحتاج الى ذلك التعقيد .
    - النموذج القديم الى الان يستخدمه البعض خاصة في المشاريع البسيطة و المتوسطة لسرعته و لكونه مضمنا في لغة البرمجة و بذلك يقل عدد الاعتماديات الخارجية للبرنامج .
    طبعا لن نحاول ان نستقصي كل ما يتعلق بهذا النموذج فهذا يحتاج الى كتب مفصلة و يمكن الرجوع الى كتاب الدكتور دامين كانوي المعنون بـ البرمجة الكائنية في بيرل (1) ، و لكن سنحاول ان نستعرض الاساسيات التي تكلمنا عنها بشكل نظري في الجزء الاول .
    قلنا سابقا ان البرمجة الكائنية هي عملية محاكاة للواقع من خلال النظر الى الاجزاء البرمجية على انها كائنات تشبه الكائنات التي نراها في الواقع الخارجي . هذا كلام جميل من الناحية النظرية و لكن كمبرمجين نريد شيئا ملموسا اكثر ، فنقول ان الكائن هو عبارة عن بيانات مرفق معها العمليات التي يمكن ان تجري عليها او بعبارة اخرى كما احب ان اسميها بيانات ذكية ! لنأخذ مثالا لتتضح الصورة :
    عادة عندما يعلموننا لغات البرمجة يبداون بتعليمنا البرمجة الاجرائية و في البرمجة الاجرائية هناك بيانات data structures و هناك اجراءات procedures . لنقل ان لدي شكل من اشكال البيانات لنقل قيمة نصية :
    كود PHP:
     "this is a data " 
    و لنقل انني اريد ان اعرف كم طول النص (عدد الحروف فيه ) ففي البرمجة الاجرائية سأقوم بانشاء اجراء مفصل فيه خطوات معرفة طول القيم و سأسميه ()length ثم اقوم بتمرير القيم النصية كلما احتجت ان اعرف طولها بهذا الشكل :
    كود PHP:
     length("this is a data"
    نلاحظ ان هناك ثنائية فالبيانات شيء و الاجراءات شيء اخر و لكن في البرمجة الكائنية نقوم بتوحيد البيانات مع الاجراءات ان صح التعبير فتكون البيانات ذكية بحيث يمكنني ان اسالها مباشرة و هي تجيب عن اسئلتي ، فلو اردت ان اعرف طول النص فيمكنني ان اسال الكائن مباشرة :
    كود PHP:
     myString.length() 
    الان لندخل في الشرح التطبيقي لطريقة كتابة كلاسات بالطريقة القديمة :
    اول خطوة هي الاعلان عن كلاس جديد و ذلك باستخدام الكلمة المفتاحية package :
    كود PHP:
     package Person
    تجدر الاشارة هنا ان لغات مثل جافا تفرض ان يكون لكل كلاس ملفا خاصا به و لا يشاركه فيه غيره و لكن في بيرل لا يوجد شيء من هذا القبيل - الا اذا استخدمنا امر use parent كما سيأتي- ، فيمكننا ان نعلن عن عدة كلاسات في ملف مصدري واحد . و عادة نحفظ الملف المصدر لكلاسات بيرل بامتداد .pm . جميل ، بعد الاعلان عن اسم الكلاس يمكننا البدء في كتابة تفاصيل الكلاس. لنشرع في كتابة الكونستركتر و هو عبارة عن ميثود "فعل" يقوم بانشاء كائن جديد و هذا الميثود في جافا يجب ان يكون باسم new و لكن في بيرل مرة اخرى لا يوجد الزام بهذا الامر و يمكن ان نسمي هذا الميثود اي اسم اخر. مهمة هذا الميثود هو ان ينشيء كائنا جديدا من الكلاس المعني بالاضافة الى اسناد القيم الى الخصائص . نعلن عن الميثود بالكلمة المفتاحية sub :
    كود PHP:
     sub new { 
    ثم نقوم باستقبال نوع الكائن من خلال الامر shift
    كود PHP:
     my $class shift
    ثم نشرع بتحديد الخصائص و كيفية استقبالها للقيم (نلاحظ اننا لم نعلن عن تلك الخصائص سلفا كما في جافا و كما سيأتي في النموذج الجديد !)
    كود PHP:
     my $self = { 
            
    name => shift
            
    national_id  => shift 
        
    }; 
    هنا نقطة مهمة حيث اننا في الكود اعلاه حددنا اننا سنقوم بتخزين الخصائص على شكل هاش (قاموس ) و هذا هو الغالب عند مبرمجي بيرل و لكن في بيرل يمكن تغير ذلك الى اي نوع اخر مثلا قائمة array . الان يمكننا ان نستدعي دالة bless و هي التي تقوم بجمع البيانات و الاجراءات و تحويلها الى كائنات .
    كود PHP:
       bless $self$class
    اخيرا نرجع الكائن :
    كود PHP:
     return $self;
      }  
    #end of new() 
    الان هذا يعتبر كلاسا كاملا و لكن نحتاج الى ان ننهي تعريف الكلاسات في النموذج القديم بقيمة صحيحة:
    كود PHP:
     1
    الى الان لدينا كلاس و هذا الكلاس لا يحتوي الا على ميثود واحد اساسي يقوم باسناد القيم الى الخصائص و يرجع كائنا جديدا . اما طريقة انشاء كائن جديد من هذا الكلاس فبهذه الطريقة :
    كود PHP:
     my $person Person->new("Ali Yassen"110009823); 
    نلاحظ ان في بيرل 5 و على خلاف اغلب لغات البرمجة معامل تنفيذ الميثودز هو السهم -> و ذلك لان في بيرل معامل النقطة " . " محجوز لامر اخر الا و هو دمج ( وصل ) قيمتين . تجدر الاشارة الى ان في بيرل 6 تم استبدال هذا المعامل بمعامل النقطة .
    لو اردنا ان نعرف اسم الكلاس الذي ينتمي اليه اي كائن فبيرل توفر دالة مهمتها فقط ان ترجع نوع الكائن، هذه الدالة اسمها blessed و نمرر اليها اسم المتغير :
    كود PHP:
     use Scalar::Util qw(blessed);
    print 
    blessed($person); 
    حسنا لنعد الى الكلاس مرة اخرى و لنضف اليه ما يعرف بالميثودات المساعدة و هي عبارة عن ميثودات تقوم فقط باسترجاع قيم الخصائص gettersاو الاسناد اليها setters و هي بذلك تساعد على الكبسلة بدلا من الوصول المباشر الى قيم الخصائص. و هذا الامر مهم جدا خاصة في بيرل اذ اننا كما اشرنا اعلاه نستطيع ان نمثل البيانات باشكال مختلفة فعندما نعزلها عن الوصول المباشر سيكون بامكاننا لاحقا ان ننتقل الى تمثيل مختلف للبيانات و ان نجري اي تعديلات اخرى بدون التأثير على المبرمجين الذي يعتمدون على اكوادنا .
    كود PHP:
     sub get_name 
    my $self shift
    return 
    $self->{name}; 


    sub get_national_id {
    my $self shift;
    return 
    $self->{national_id};

    لا شيء مميز في الاكواد اعلاه مجرد ارجاع لقيم الخصائص . اما الـ setters :
    كود PHP:
     sub set_name 
    my ($self $name ) = (shiftshift); 
    if (
    defined $name)  { 
    $self->{name} = $name
    return 
    1;  } 

    هنا فقط قمنا باسناد القيمة الممررة الى خانة name و قمنا بارجاع قيمة 1 في حال لو اردنا الية للتشيك على نجاح العملية . اما الـ national_id فلا نحتاج الى انشاء setter لها لانها قيمة ثابتة فهل سمعتم عن شخص غير رقمه الوطني ؟! الان عرفنا طريقة انشاء الميثودز و نستطيع بنفس الطريقة ان ننشيء ما نشاء من الميثودز مثلا الميثود المشهور toString و هو ميثود يستخدم لانشاء نسخة مكتوبة تسهل قراءتها تشمل تفاصيل الكائن .
    لنواصل الكلام و لكن هذه المرة عن التوارث فقد قلنا سابقا ان في بيرل يمكن الوراثة من اكثر من كلاس و ان كان هذا الامر غير مستحسن و ينصح باستخدام الرولز roles بدلا عن ذلك . لنقل اننا نريد ان ننشيء كلاسا جديدا اسمه student هذا كلاس الطالب يعتبر نوعا من انواع كلاس person و يرث كل ما عند الكلاس الاب من خصائص و افعال و للحصول على هذه العلاقة و التي تعرف بعلاقة is-a نستخدم هذا الامر :
    كود PHP:
     package Student;
    use 
    parent 'Person'
    لنفترض الان اننا نريد ان نضيف قيمة جديدة الى خصائص الطالب مثلا عمر الطالب و لكن الكونستركتر الذي ورثناه من كلاس الاب لا يحتوي الا على الاسم و الرقم الوطني ؟ في هذه الحالة نقوم بما يعرف بالميثود اوفررايد override و هي بعبارة مبسطة عملية تعديل الميثودات الموروثة من الاب و ذلك من خلال الامر SUPER. اذا لنقم باعادة ترتيب الكونستركتر لكي يضيف خانة للعمر :
    كود PHP:
     sub new { 
    my $class shift
    my $self $class->SUPER::new(shift,shift); 
    $self->{age} = shift
    bless $self$class
    return 
    $self

    ثم نقوم بانشاء ميثودات مساعدة جديدة لـ age فقط اذ اننا ورثنا المساعدات الاخرى من كلاس الاب . هنا ايضا سأضيف ميثودا مساعدا لكلاس الطالب حيث سأسميه to_string مهمته فقط ان يرجع قيمة كتبية للكائن :
    كود PHP:
     sub to_string 
        
    my $self shift
        print 
    "Student name is : " $self->get_name "\n" 
              
    "Student national id is : " .  $self->get_national_id "\n" 
              
    "Student age is : " $self->get_age "\n" 
        

    الان عندما ننشيء كائنا جديدا من نوع طالب بالامر المعتاد :
    كود PHP:
     my $student Student->new("Ali"110009 23); 
    و عندما نستخدم الميثود المساعد :
    كود PHP:
     print $student->to_string
    فالنتيجة :
    كود PHP:
     Student name is Ali 
    Student national id is 
    110009 
    Student age is 
    23 
    الان بقي ان نذكر شيئا عن ما يعرف بـ "التركيب " composition و هذا المصطلح بكل بساطة يعني ان يكون احد الكائنات مكونا من كائن اخر او اكثر ، مثلا في مثالنا ممكن ان نضيف في خانة الخصائص للطالب خانة جديدة باسم bank account بحيث ان رقم الحساب هذا انما هو كائن في حد ذاته و ليس مجرد قيمة رقمية ، فمثلا قد يكون فيه رقم الحساب البنكي و اسم البنك و معلومات الدخول ...الخ. للوصول الى هذه النتيجة فقط نضيف خانة بإسم bank_account في الكونستركتر الخاص بالطلاب و عندما ننشيء كائنا من نوع طالب نمرر له كائن الحساب البنكي مثلا هكذا :
    كود PHP:
     my $student Student->new("Ali"110009 23$bank_account_object); 
    هل لاحظتم اننا تكلمنا عن الميثود اوفر رايد و لم نتكلم عن الميثود اوفر لود Overload و هو كما قلنا سابقا عملية انشاء ميثودات بنفس الاسم و لكن تختلف من ناحية عدد المتغيرات التي تقبلها مثلا :
    كود PHP:
     method() 
    method(String astring
    mehtod(String astringInt myNumber) ...etc 
    لم نتكلم عن هذا الجانب لان بيرل ديناميكية و يمكنها ان تتعامل مع اعداد مختلفة من المتغيرات باستخدام ميثود واحد بحيث هذا الميثود يختار الاوامر المناسبة على حسب عدد المتغيرات الممررة .
    على كل حال لنكتفي بهذا القدر و الا سيطول بنا المقام و لن نستوفي الموضوع و لكن هذه تقريبا خلاصة المطلب و اساس النموذج القديم .

    دمتم في الرضا ،
    --- (1) Object Oriented Perl: A Comprehensive Guide to Concepts and Programming Techniques
      لا يمكن إضافة تعليقات.

    التصانيف

    تقليص

    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