مفهوم الدوال و أنواعها في الجافا أندرويد (تطبيق عملي)

درس يشرح بشكل عملي و بسيط الفرق بين أنواع الدوال المختلفة.

م. خديجة باحويرثمنذ 6 سنوات

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

ما هي الدوال (Methods) ؟ 

     التطبيقات و برمجيات الحاسب يتم بناءها بواسطة كتابة مئات الأسطر البرمجية فكما هو معروف في أي لغة برمجة إذا واجهتنا  أي مشكلة كبيرة فإن أفضل طريقة لحلها  هي تقسيمها لمجموعة من الأجزاء الصغيرة أو ما يعرف بال module  أو function  "الدّوال " بحيث كل منها تؤدي وظيفة معينة, ويعرف هذا التكنيك عادة بـما يسمى  بـ divide and conquer. و تقسيم الكود على عدد من الدوال يجعل الكود أسهل في القراءة و أكثر وضوحاً.

     وهذه الـ module أو الـ function الدوال  تعرف في ال #C و الـ java  بما يسمى بـ Method, والمبرمج يستطيع كتابة  الـ Method  لتعريف مهام معينة ومن ثم يستدعيها ( calling ) من أي نقطة من البرنامج بمجرد ذكر اسمها  لكي يتم تنفيذها عند تلك النقطة.

     فالمبرمج إما أن يقوم بكتابة الـmethod  بنفسه عندها تسمى  (user-defined method),  أو أن يقوم باستخدام دوال معرفة في نفس اللغة( build in )   و كل ما عليه هو استدعاءها عندما يحتاج إليها  ليستخدمها في برنامجه, و سنتعرف فيما يلي كيف يمكننا إنشاء هذه ال user-defined method ومن ثم استدعائها في البرنامج.

طريقة كتاب الدوال (Methods):

لنلق الآن نظرة على الصورة العامة لكتابة أي  method في java مثلا:

access_ Modifier  return-value-type  Method-Name( parameter-list )
{
declaration and statement
}

السطر الأول من تعريف الـ method  يسمى بال method header ويحتوي على كل من :

access modifier  : و هي إما public أو private أو static.

مثلا عندما يتم كتابة public فإن ذلك يعني أن كل الـ Activities تستطيع الوصول للدالة, أي أنها عامة. و عندما يتم كتابة private فإن ذلك يعني أن الدالة خاصة يمكن الوصول إليها فقط من داخل Activity الحالية.

method-name  : و هي اسم الدالة التي نريد تعريفها ,  وقواعد كتابة الاسم هنا يتبع  نفس شروط كتابة أسماء المتغيرات وطبعا سيكون الاسم اختياري.

return-value-type نوع النتيجة التي ستعود بها الدالة والدالة إذا كانت تعود بقيمة فإنها لا تعود بأكثر من قيمة واحدة. مثلا إذا كانت الدالة تعود بقيمة integer  فإننا سنكتب في هذه الخانة integer ,وهكذا. أما في حالة عندما لا تعود الدالة بقيمة فإننا نكتب هنا void   .

parameter-list: هي القيم التي نقوم بإرسالها أي ادخالها إلى للدالة. وستتعرف عليها أكثر عندما نشرح أنواع الدوال .

أما بالنسبة للـ declarations and statements : فهي الأوامر التي تقوم هذه الدالة بتنفيذها .

والدوال في أي لغة برمجة لها أربع أنواع سأطرح كل نوع مع تطبيق  مثال عليه من خلال لغة java:

1- الدالة التي لا تعود بقيمة ولا تستقبل أي قيمة  "parameter"

و المعنى سيتضح من خلال المثال التالي :

public void firstMethod() {
        Log.v("Method", "FirstMethod was called!!");
    }

وهنا الـ access Modifier هي public, أي عامة.

وبما أن الدالة لا تعود بقيمة فسنكتب void  عند الـ return-value-type 

وبما أن الدالة لا تستقبل أي قيمة فسنكتب القوسين فارغة …!

وهنا الدالة تؤدي وظيفة سهلة للغاية مجرد أنها تطبع الرسالة " !! FirstMethod was called فور مناداتها ..و الآن و بعد أن تم بناء الدالة لابد من مناداتها " calling " حتى تطبع الرسالة .. لكن كيف يتم استدعاء أي دالة ؟؟

بمجرد ذكر اسم الدالة فقط, فإنه سيتم تنفيذها ….كالتالي:

firstMethod();

و البرنامج كاملا كالتالي :

package com.example.android.methods;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //call the method
        firstMethod();
    }

    public void firstMethod() {
        Log.v("Method", "Method 1 was called!!");
    }
}

لاحظ في البرنامج أننا قمنا بإنشاء الدالة firstMethod   أولاً, ثم استدعائها  من  داخل الـ onCreate حيث أنها نقطة بداية الـ Activity. النتيجة هي طباعة عبارة Method 1 was called!!داخل الـ Log.

الآن النوع الثاني من أنواع الدوال :

2 – الدالة التي تستقبل قيمة "parameter "  ولكنها لا تعود بقيمة   :

والمثال التالي يوضح الفكرة, في البداية لننشئ الدالة كالتالي :

public void secondMethod(String name) {
    String result;
    result = "hello: " + name;
    Log.v("second method", result);
}

 الدالة هنا تستقبل قيمة parameter  إذن سنكتب بين القوسين اسم أي متغير يستقبل هذه القيمة التي ستدخل للدالة وطبعا سنكتب نوع لهذا المتغير  ونوعه بلا شك سيكون من نفس نوع القيمة المراد تمريرها للدالة والتي سيحتفظ بها المتغير. وكما هو واضح فإن الدالة تستقبل القيمة المخزنة في name ثم تضيف العبارة hello قبل الاسم , و أخيرا تطبع النتيجة على Log.

فقط تبقّى مناداة الدالة حتى تنفذ عملها لكن يبدو أننا هنا لا بد و أن نرسل قيمة لهذه الدالة لكي تقوم  بعملها وطبعا القيمة التي سنرسلها ستكون من النوع String ….

و لمناداة الدالة كالتالي:

secondMethod("Ahmad");

و البرنامج كاملا كالتالي :

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //call the method
        secondMethod("Ahmad");
    }

    public void secondMethod(String name) {
        String result;
        result = "hello: " + name;
        Log.v("second method", result);
    }
}

3-  الدوال التي لا نمرر لها  بارمترات ولكن تعود بقيمة:

ومعنى أن الدالة لا تمرر ”أو لا تستقبل” parameter أنه عند إنشاء الدالة القوسين ستكون فارغة  ( ) أي أنه لا توجد قيمة تريد الدالة استقبالها .

و معنى أن الدالة تعود بقيمة أي عندما ننشئ الدالة سنستخدم keyword  هيreturn  وتكون متبوعة بالقيمة التي تعود بها الدالة .ولا تنسى أنه يجب أن تكتب في الـ Method header نوع القيمة التي ستعود بها الدالة في خانة الـ return _value _type  …

دعنا ننشي الدالة ونرى, لنتفق أولا على وظيفة هذه الدالة, مثلا نريد الدالة أن تطبع لنا الجملة التالية :

"third method was called"

العملية سهلة للغاية أولا سأكتب الدالة :

public String thirdMethod(String name) {
    return "third method was called!!";
}

هنا الدالة تعود بقيمة من النوع string, واسم الدالة thirdMethod, أيضاً استخدمنا الكلمة return  متبوعة بالقيمة التي ستعود بها الدالة. و بالطبع إذا أردنا تنفيذ الدالة من أي نقطة في البرنامج كل ما علينا هو فقط مناداتها كالتالي :

 thirdMethod ();

لكن الدالة ThirdMethod  السابقة تعود بقيمة إذن يجب علينا عندما نستدعيها أن نخزن القيمة التي تعود منها في متغير وهذا المتغير له نفس نوع الـ return _value _type في الدالة نفسها  إذن سنعرف أي متغير له النوع string  لكي نخزن فيه نتيجة الدالة ThirdMethod  ليصبح استدعاء الدالة صحيحا كالتالي :

 string result = thirdMethod();

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

البرنامج كاملا:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //call the method
        String result = thirdMethod();
    }

    public String thirdMethod(String name) {
        return "third method was called!!";
    }
}

4- الدوال التي تستقبل بارميتر وتعود بقيمة :

نريد كتابة دالة و ظيفتها أن تعود لنا بقيمة( عبارة عن نتيجة العملية الحسابية )

أي الدالة تستقبل قيمة عددية  integer, وتعود بقيمة عددية integer,  والتي هي الرقم 10 مضروبا في القيمة التي تم تمريرها للدالة.

كيف سيكون شكل الدالة :

public Integer fourthMethod(Integer number) {
    return number * 10 ;
}

حيث أننا في بداية تعريف الدالة في السطر الأول قبل اسم الدالة كتبنا integer معناه أن الدالة ستعود بالقيمة العددية integer

و كتبنا  ( integer number) أي أن الدالة ستستقبل قيمة من النوع integer مخزنة في متغير يسمى number

 return 10 * number;

و السطر السابق معناه أن الدالة ستعود بالقيمة 10 مضروبة في البارميتر المرسل للدالة , و كما ذكرنا في بداية الدرس أن الكلمة المفتاحية return  تستخدم  لكي تعود لنا بقيمة. الآن أنشأنا الدالة , بقي مناداتها كالتالي من داخل الـ onCreate:

Integer result = fourthMethod(6);

حيث أننا أرسلنا للدالة قيمة عددية  ليتم وضعها بدلا من المتغير number,  وطبعا القيمة 6 هي خيارية يمكنك تجربة أي عدد آخر. و الدالة تعود بقيمة عددية يتم تخزينها في المتغير result. و البرنامج كاملا كالتالي :

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //call the method
        Integer result = fourthMethod(6);
        Log.v("result", String.valueOf(result));
    }

    public Integer fourthMethod(Integer number) {
        return number * 10 ;
    }
}

وبذلك وضحنا الفرق بين الانواع الاربعة للدوال.

إذا كان لديك أي استفسار لا تتردد بترك تعليقك و السلام عليكم و رحمة الله و بركاته.

8
إعجاب
19898
مشاهدات
1
مشاركة
3
متابع
متميز
محتوى رهيب

التعليقات (1)

Ahmad Nassar:

شرح أكثر من رائع

مشكورين

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !