مفاهيم 6 أساسية حتى تبدأ التعامل مع الدوال في جافا

إذا كانت البرمجة كائنية المنحى OOP هي بناء، فإن فهم مفاهيم الدوال والأصناف methods and classes يعتبر الأساس لهذا البناء.

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

دعني أكُن صريحاً معك…

معرفتُك لهذه المعلومات عن الدوال في لغة جافا لن تجعلك خبيراً في لغة الجافا أو البرمجة كائنية المنحى OOP ولكن هذه المعلومات ستطور معارفك عن الدوال و استخداماتها، وستستطيع التعرّف على أغلب مهام الدوال أينما واجهتك كما ستستطيع إستخدام الدوال بكفاءة أعلى.

(1) كيف تكتب دالة في لغة جافا

قبل أن تتعلم أياً من الأمور المتقدمة عن الدوال لا بُد أن تتمكن من المعلومات الأساسية والمهمة عن الدوال في لغة جافا. وبالطبع لا يوجد أهم من معرفة كيف تكتب الدالة في لغة جافا.

الدالة method (وبعضهم يسميها الطريقة) هي ترجمة لكلمة method. وهي تحمل المعنيين (دالة وطريقة) سوياً.

تحدثتُ سابقاً عن الأصناف classes في جافا، إن لم تكن اطلعت على مفاهيم الأصناف والكائنات فأنصحك بالإطلاع عليها أولاً.

كما ذفكرنا، فالأصناف تمثل أصنافاً أو فئاتٍ حقيقية مثل (إنسان، سيارة، مكتب، …إلخ)، ومن ناحية منطقية أيضاً فالصفات المميزة لكل فئة هي:

  • الصفات Attributes (الإسم، العمر، نوع الماكينة، عدد الأدراج، …إلخ).
  • الأفعال (الدوال) methods (المشي، تناول الطعام، فتح الدرج، …إلخ).

ما نهتم به هنا هو الدوال، وهي الأفعال التي يستطيع الكائن الذي ينتمي إلى صنف محدد القيام بها.

مثلاً محمد الذي ينتمي إلى فئة الإنسان يستطيع هضم الطعام و التفكير و الجري والمشي و السلام وغيرها.

جميع هذه الأفعال تتم ترجمتها في مفهوم البرمجة كائنية المنحى Object Oriented Programming إلى دوال.

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

(2) كيف تعمل الدوال

الدوال كما ذكرنا هي أفعال، فإذا أنشأنا كائناً من فئة الإنسان إسمُهُ محمد، وأردنا أن نجعل هذا الكائن (محمد) يمشي لمسافة خمس خطوات فإننا ننادي الدالة Call method الخاصة بالمهمة التي نرغب بتنفيذها وهي المشي.

وحتى نستطيع الوصول إلى ما نرغب به حقاً وبالضبط دون زيادة أو نقصان فإن هناك مكونات يجب أن تتوفر في الدالة:

  • إسم الدالة method name: حتى نستطيع مناداتها وتمييز الدوال من بعضها.
  • العوامل Parameters: هي القيم التي تحدد طريقة عمل الدالة، مثلاً في حالة المشي فإن عدد الخطوات عامل يؤثر في طريقة عمل دالة المشي.
  • القيمة المرجعة return value: ألا ترغب بمعرفة هل نجح تنفيذ الدالة أم لا؟ هل استطاع محمد المشي أم سقط أثناء عمل الدالة؟ القيمة المرجعة هي ما تساعدك على معرفة ذلك. فبنهاية التنفيذ من الممكن أن ترجع لك الدالة كلمة success أو fail لتعرف نتيجة ما طلبت تنفيذه. كما أن هناك دوالاً تحتاج إلى إرجاع قيم. مثل دالة حساب مجموع رقمين (العوامل هي الرقم الأول والرقم الثاني، والقيمة المرجعة هي مجموع الرقمين).

هذه هي أهم الأمور التي يجب أن تتعرف عليها منطقياً الآن، الأمرُ بسيط أليس كذلك؟

دعنا ننتقل إلى هيكلة الدالة لنرى كيف يتم الأمر برمجياً..

(3) هيكلة الدالة في جافا

الشكلة العام للدالة في لغة جافا هو كما يلي، إطّلع على الشفرة التالية وبعدها أشرحُ كل جميع أجزاءها

   public static void main(String[] args){
       System.out.println("Hello World");
   }

الشفرة البرمجية التي تراها بالأعلى هي دالة ستراها كثيراً جداً في عملك المستقبلي، لأن جميع برامج الجافا تبدأ التنفيذ منها.

لذا دعنا نستعرض مكوناتها البسيطة لتتعرف عليها:

  • public: هذه الكلمة (أو بديلاتها) تحدد صلاحية الوصول إلى هذه الدالة. بشرح سريع، إذا اعتبرت أن الدالة موجودة بصنف class وهذا الصنف موجود بداخل مجلد وهناك مجلدات أخرى بها أصناف أخرى. في البرمجة كائنية المنحى عادةً ما تحاول الأصناف مناداة دوال موجودة بأصناف أخرى. لذا كنوع من الأمان يتم تحديد صلاحية الوصول إلى الدالة (لأعضاء الصنف فقط، أم الأصناف بداخل المجلد نفسه، أم…إلخ).
    هذه الكلمة إختيارية: بمعنى أنها من الممكن أن تختفي تماماً ويكتمل تعريف الدالة دون وجود أي محدد لصلاحية الوصول.
  • static: هذه الكلمة تحدد طريقة مشاركة الدالة بين الأصناف. إذا أردت الإستزادة إقرأ 5 إستخدامات لـ Static تقربك من الإحتراف، وهي كلمة اختيارية كذلك.
  • void: هل تذكر حين تحدثنا عن إرجاع قيمة بنهاية الدالة؟ void تعني فراغ، أي أنه لن تعيد الدالة أيّ شيء، ولكن إذا أردتها أن تعيد شيئاً يجب أن تحدد نوع البيانات الذي ستعيده. مثلاً إذا كانت ستعيد عمر إنسان فستكتب int بدلاً عن void.
  • main: هذا هو إسمُ الدالة، والذي تستطيع إختيارهُ وفقاً لمهمة الدالة، مثلاً إذا كانت الدالة التي ترغب بإنشائها هي المشي فسيكون إسم الدالة walk.
  • String[] args: هذه هي ما تسمى بالمعاملات parameters، هنا تستقبل الدالة مصفوفة من النوع String تسمى بـ args. من الممكن أن تستقبل الدالة أنواعاً مختلفة من المتغيرات وبإمكانك تسميتها كما تريد. مثلاً
    (int firstNumber, int secondNumber)
  • ما يوجد بين القوسين المعقوفين {}: كل ما يوجد هنا هو منطق الدالة، أي الخطوات التي يجب تنفيذها لإكمال هدف الدالة. مثلاً في حالة الجمع بين القوسين المعقوفين يتم إجراء عملية الجمع وتخزين الناتج في متغير آخر وإعادة قيمة الناتج.

مثال لدالة جمع عددين

البرنامج المبسط التالي يحتوي على الدالة الرئيسية main والتي منها تُنادى دالة الجمع sum ثم يطبع الناتج

   
   static int sum(int firstNumber, int secondNumber){
       int sum = firstNumber + secondNumber;
       return sum;
   }
   
   
   public static void main(String args[]){
       System.out.println("sum = " + sum(5,4));
   }
   

كما تلاحظ في البرنامج سمينا الدالة sum، هنا ألم يخطر ببالك تساؤلٌ ما؟؟؟

هل نستطيعُ تسمية الدوال كما نرغب فعلاً أم أن هنالك حدود لهذا الأمر؟

(4) هل تستطيع تسمية الدالة بأي طريقة تريد؟

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

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

أما من الأمور المتعارف عليها أن يبدأ إسمُ الدالّة بحرف صغير small letter، أما في حالة تكون إسم الدالة من أكثر من كلمة يتم إلصاقهما سوياً مع جعل الحرف الأول من الكلمة التالية حرفاً كبيراً capital letter.

تسمية الدوال في جافا
تسمية الدوال في جافا

(5) ما هو تأثير وجود static في الدالة؟

الكلمة المحجوزة static ذات تأثير مهم على شفراتك البرمجية، وعلى أداء برنامجك كذلك وحجمه. فلا تستهن بهذه الكلمة.

المفهوم العام لـ static هو أن وجودها بجانب الدالة يعني أن هذه الدالة تتبع للفئة class وليس الكائن Object.

لم يتضح الأمر بعد؟ دعني أوضّحهُ لك

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

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

مثلاً إذا كان الكائن الإنسان مثلما هو موجود بالمثال التالي

class Human{
    private int HumanAge;
    
    //static method
    static int convertYearsToDays(){
        //some logic
        return 0;
    }
    
    //non-static mehtod
    void setAge(int age){
        HumanAge=age;
    }
}

فإننا قد أنشأنا الدالة convertYearsToDays من أجل تحويل عمر الإنسان من سنين إلى أيام. هذه الدالة وضعنا أمامها static، هل تعلم لماذا؟

هذه الدالة من الدوال التي تحتاجها الفئة وليس الكائن، أي بمعنى آخر، هذه الدالة من الممكن إستخدامها والإستفادة منها حتى بدون إنشاء الكائن. أليس كذلك؟

وفي الإتجاه الآخر، أيضاً في المثال السابق مثلاً، لإنشاء الكائن تحتاج إلى أن تحدد عمر الإنسان، ومالم يُنشئ الكائن فلا فائدة لإستخدام الدالة setAge، لذلك لم تسبقها كلمة static.

هنالك فوائد متعددة لإستخدام static وأحايين يُفضّل أن تُدخل فيها static أمام متغيراتك و فئاتك أنصحك بالإطلاع عليها.

(6) ما هو تأثير وجود محددات الوصول Access Modifiers في تعريف الدالة؟

محددات الوصول هي كلمات محجوزة في لغة جافا تحدد صلاحية الوصول إلى ما يليها، وبما أننا نتحدث عن الدوال هنا فمحددات الوصول تحدد صلاحيات الوصول إل الدالة.

محددات الوصول 4 (public, protected, private, none) وهي موجودة من أجل التحكم في وصول الفئات الأخرى إلى هذه الدوال (الفئات، الحزم packages، الفئات الداخلية inner classes، العالم).

وضع محدد وصول مختلف يغير من صلاحية الوصول إلى الدالة وفق الجدول التالي:

 فئةحزمةفئة داخلية العالم
publicمسموحمسموحمسموحمسموح
protectedمسموحمسموحمسموحغير مسموح
noneمسموحمسموحغير مسموحغير مسموح
privateمسموحغير مسموحغير مسموحغير مسموح

هذا القدر من المعلومات عن الدوال في جافا يجعلك تمتلك المعرفة الأساسية لتنطلق وتبدأ التعامل مع الدوال، هناك مفاهيمٌ أخرى فضّلتُ عدم التطرق لها هنا حتى لا يختلط الحابل بالنابل، كما أنني أُرهقتُ من الكتابة ?

أنشر هذه التدوينة بين أصدقائك المبرمجين. شُكراً ?

سؤالي لك: كمبرمج، ما هو أكثر ما يُعجبك في التعامل مع الدوال؟
ضع إجابتك أدناه ?

مصطفى الطيب

صديقٌ لنُظمِ المعلُومات و عُلومِ الحَاسِب و مُختصٌ بهما، مُحبٌ للعِلمِ و نَشرِه. أُشاركُ معارفي و تَجاربي و خِبراتي في تَدويناتٍ و دوراتٍ من خلال مُدونةِ عُلوم.

مقالات ذات صلة

‫9 تعليقات

  1. أعرف تماماً أن هناك أهداف ومبررات لوجود الحماية لكني لم أستطع أن أستوعب الحماية ممن؟ يعني أحمي الصفاتAttributes ممن؟ هذه تقف في طريقي عقبة للمضي في تعلم الجافا- صراحة اطلعت على كثير من الفيديهات والمدونات لكنها لم تقنعني قط

    1. سؤالك رائع جداً أخي غازي،

      قبل كُل شيء، فلنضع شيئاً نتفق عليه. وهو أننا نحتاج إلى الحماية عندما توجد حاجةٌ لذلك.

      مفهومٌ بسيط. أليس كذلك؟
      وقبل أن تواصل، أعتقد أنك بنهاية هذا التعليق ستغيّر نظرتك إلى مفهوم كلمة الحماية قليلاً.

      أنت تعلم أن سرعة السيارة تزداد عند الضغط على دوّاسة البنزين، هل أنت بحاجة لرؤية ما يحدث بعد الضغط على دواسة البنزين؟
      أعتقد أن التفاصيل ستزعجك بلا فائدة. وهذا مبدأ من مبادئ التصميم وهو التغيلف Encapsulation، حيث تُخفى التفاصيل التي لا يُحتاجُ إليها.

      فإذا أنشأت صنفاً ما، وحاولت الوصول إلى متغيراته، ووجدت أن هناك العديد من المتغيرات التي لن تحتاج إليها إطلاقاً مُدرجةٌ في قائمة المتغيرات القابلة للوصول، ألن يكونَ هذا مزعجاً لك؟ هذا غير أن هذا الأمر قد يضيعُ وقتك في محاولة فهم المتغيرات وفهم استخداماتها ومعرفة المتغيرات المفيدة من المتغيرت التي لا يمكن إستخدامها و الإستفادة منها.

      وهذا ما أسميه بالهدف البرمجي، وهو سببٌ منطقي لمنع الوصول إلى المتغيرات والذي قد نصطلح عليه (حماية) ولكنه في الأصل عمليةٌ تنظيمية وتطبيقٌ لمفاهيم تصميمية.

      هناكً هدفٌ آخر وهو الهدف العملي (Business reasons).
      في البرامج الكبيرة والبرامج ذات الطبيعة الحساسة أو الحرجة تكون هناكَ دواعٍ عملية لأسباب مختلفة تستدعي حماية المعلومات وقابلية الوصول إلى المعلومات.
      فلنفرتض جزافاً أنه في الشركات المالية يكونُ من الضروري حماية المعلومات الخاصة بصنف العميل مثلاً حين يتم إستخدام هذا الصنف من قبل بنك آخر. أو أن شركتين تعملان على إنشاءِ مشروعٍ سويةً ويجب على كل شركة وفق الإتفاق العملي توفير قدر محدد من المعلومات لا يزيد ولا ينقص.

      ورغم ذلك -كما تعلم يا أخي غازي- فإن عدم حماية الـ attributes لن يوقف عمل البرنامج، ولكن إستخدامهُ وفق المتطلبات البرمجية والمنطقية مؤشرٌ على جودة عمل المبرمج التصميمي حيثُ يُطلق عليه مهندس برمجيات Software Engineer، وهي درجةٌ أعلى من المبرمج Programmer.

  2. شرحك رائع جزاك الله كل خير اتمني ان ترشح لي دورات اوكتب استطيع من خلالها ان اصل الي هذا الادراك للغة البرمجة

  3. شكرا جزيلا … شرح وافي وجميل ورائع ازاح من امامي كثير من التساؤلات المثقلة على في تعلم البرمجة …
    شكرررررا .. وفي ميزان حسناتك ان شاء الله

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *