



ما هي الدوال (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"
و المعنى سيتضح من خلال المثال التالي :
وهنا الـ access Modifier هي public, أي عامة.
وبما أن الدالة لا تعود بقيمة فسنكتب void عند الـreturn-value-type…
وبما أن الدالة لا تستقبل أي قيمة فسنكتب القوسين فارغة …!
وهنا الدالة تؤدي وظيفة سهلة للغاية مجرد أنها تطبع الرسالة " !! FirstMethod was called " فور مناداتها ..و الآن و بعد أن تم بناء الدالة لابد من مناداتها " calling " حتى تطبع الرسالة .. لكن كيف يتم استدعاء أي دالة ؟؟
بمجرد ذكر اسم الدالة فقط, فإنه سيتم تنفيذها ….كالتالي:
firstMethod(); و البرنامج كاملا كالتالي :
لاحظ في البرنامج أننا قمنا بإنشاء الدالة firstMethod أولاً, ثم استدعائها من داخل الـ onCreate حيث أنها نقطة بداية الـ Activity. النتيجة هي طباعة عبارة Method 1 was called!!داخل الـ Log.
الآن النوع الثاني من أنواع الدوال :
2 – الدالة التي تستقبلقيمة "parameter " ولكنها لا تعود بقيمة :
والمثال التالي يوضح الفكرة, في البداية لننشئ الدالة كالتالي
:
الدالة هنا تستقبل قيمة parameter إذن سنكتب بين القوسين اسم أي متغير يستقبل هذه القيمة التي ستدخل للدالة وطبعا سنكتب نوع لهذا المتغير ونوعه بلا شك سيكون من نفس نوع القيمة المراد تمريرها للدالة والتي سيحتفظ بها المتغير. وكما هو واضح فإن الدالة تستقبل القيمة المخزنة في name ثم تضيف العبارة hello قبل الاسم , و أخيرا تطبع النتيجة على Log.
فقط تبقّى مناداة الدالة حتى تنفذ عملها لكن يبدو أننا هنا لا بد و أن نرسل قيمة لهذه الدالة لكي تقوم بعملها وطبعا القيمة التي سنرسلها ستكون من النوع String ….
و لمناداة الدالة كالتالي:
secondMethod("Ahmad"); و البرنامج كاملا كالتالي :
الدوال التيلا نمرر لها بارمترات ولكن تعودبقيمة:
ومعنى أن الدالة لا تمرر ”أو لا تستقبل” parameter أنه عند إنشاء الدالة القوسين ستكون فارغة ( ) أي أنه لا توجد قيمة تريد الدالة استقبالها .
و معنى أن الدالة تعود بقيمة أي عندما ننشئ الدالة سنستخدم keyword هيreturn وتكون متبوعة بالقيمة التي تعود بها الدالة .ولا تنسى أنه يجب أن تكتب في الـ Method header نوع القيمة التي ستعود بها الدالة في خانة الـ return _value _type …
دعنا ننشي الدالة ونرى, لنتفق أولا على وظيفة هذه الدالة, مثلا نريد الدالة أن تطبع لنا الجملة التالية :
"third method was called"
العملية سهلة للغاية أولا سأكتب الدالة :
هنا الدالة تعود بقيمة من النوع string, واسم الدالة thirdMethod, أيضاً استخدمنا الكلمة return متبوعة بالقيمة التي ستعود بها الدالة. و بالطبع إذا أردنا تنفيذ الدالة من أي نقطة في البرنامج كل ما علينا هو فقط مناداتها كالتالي :
thirdMethod (); لكن الدالة ThirdMethod السابقة تعود بقيمة إذن يجب علينا عندما نستدعيها أن نخزن القيمة التي تعود منها في متغير وهذا المتغير له نفس نوع الـ return _value _type في الدالة نفسها إذن سنعرف أي متغير له النوعstring لكي نخزن فيه نتيجة الدالة ThirdMethod ليصبح استدعاء الدالة صحيحا كالتالي :
string result = thirdMethod(); حيث أننا قمنا بتخزين القيمة التي تعود بها الدالة في المتغير result, بعد ذلك عندما تقوم بطباعة القيمةresult ستطبع بذلك نتيجة الدالةThirdMethod.
البرنامج كاملا:
[/LEFT]
الدوال التي تستقبل بارميتر وتعود بقيمة :
نريد كتابة دالة و ظيفتها أن تعود لنا بقيمة( عبارة عن نتيجة العملية الحسابية )
أي الدالة تستقبل قيمة عددية 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 ; } }
وبذلك وضحنا الفرق بين الانواع الاربعة للدوال.
إذا كان لديك أي استفسار لا تتردد بترك تعليقك و السلام عليكم و رحمة الله و بركاته.
التطبيقات و برمجيات الحاسب يتم بناءها بواسطة كتابة مئات الأسطر البرمجية فكما هو معروف في أي لغة برمجة إذا واجهتنا أي مشكلة كبيرة فإن أفضل طريقة لحلها هي تقسيمها لمجموعة من الأجزاء الصغيرة أو ما يعرف بال 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!!"); }
وبما أن الدالة لا تعود بقيمة فسنكتب 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); }
فقط تبقّى مناداة الدالة حتى تنفذ عملها لكن يبدو أننا هنا لا بد و أن نرسل قيمة لهذه الدالة لكي تقوم بعملها وطبعا القيمة التي سنرسلها ستكون من النوع 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); } }
الدوال التيلا نمرر لها بارمترات ولكن تعودبقيمة:
ومعنى أن الدالة لا تمرر ”أو لا تستقبل” 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.
البرنامج كاملا:
كود:
[LEFT][LEFT] 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!!"; } }[/LEFT]
الدوال التي تستقبل بارميتر وتعود بقيمة :
نريد كتابة دالة و ظيفتها أن تعود لنا بقيمة( عبارة عن نتيجة العملية الحسابية )
أي الدالة تستقبل قيمة عددية 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 ; } }
وبذلك وضحنا الفرق بين الانواع الاربعة للدوال.
إذا كان لديك أي استفسار لا تتردد بترك تعليقك و السلام عليكم و رحمة الله و بركاته.