(19) الوظائف

السلام عليكم و رحمة الله و بركاته

درسنا اليوم من الدروس المهمّة جداً. و أظن أنّه من المناسب الحديث عنه الآن بعد أن تحدثنا في الدروس السابقة عن عدد من المواضيع التي تمهّد له.  فقد تحدّثنا كثيراً عن الوظائف حين تحدّثنا عن الفئات (classes) و الكائنات (objects) خاصة في الدرس الثاني عشر. و اليوم سنتحدّث عن الوظائف بشكل مفصّل إن شاء الله.

 

 إنشاء الوظائف:

لكتابة أي فئة نحتاج أن نقوم بالتالي:

و في الشكل التالي تشرح السطر الأول من الشكل السابق، و الذي يطلق عليه method signature:

فأول كلمة هي public هذه عبارة عن Access modifier و يمكن أن يحل محلها أي من الكلمات باللون البنفسجي، أو كما هو موجود في البداية [none] أي أنه من الممكن ألا تكون موجودة أبداً.

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

نصل بعدها لكلمة methodName و هي هنا الاسم الذي نعطيه للوظيفة، و يفضّل أن يكون فعلاً، يبدأ بحرف صغير.

بعد ذلك نجد أننا فتحنا قوساً دائرياً، و في داخله وضعنا سلسلة المتغيرات المدخلة للوظيفة (parameters list). و التي يتم تحديد نوعها، و اعطائها اسماً لاستخدامه داخل الوظيفة، و يفصل بينها باستخدام الفاصلة. و من الممكن أن لا تكون هناك أي متغيرات مدخلة للوظيفة، و يكون القوس فارغاً.

نقطة توقّف..

المتغيرات الموجودة في سلسلة المتغيرات المدخلة (parameters list) تكون صالحة للاستخدام داخل الوظيفة فقط، و لا يمكن استخدامها خارج الوظيفة أبداً.

 

 Method Overloading:

يمكن في الجافا  كتابة وظيفة بنفس الاسم مرتين (!!!!) نعم تستطيع ذلك. و لكن يجب أن يكون توقيع الوظيفة مختلفاً في كل مرة. أي أن نوع الإرجاع، أو قائمة المتغيرات المدخلة تكون مختلفة إما في النوع أو في العدد. و هذا يسمّى في الجافا Method Overloading. لنأخذ مثالاً على ذلك.

لنفرض أننا نريد كتابة وظيفة تقوم بجمع رقمين، و إعادة الناتج. و لكن الأرقام موجودة بأنواع عدة. منها الـ int و منها float و منها double. و كلها مختلفة عن بعضها البعض. يمكننا في هذه الحالة كتابة عدة وظائف كلها بنفس الإسم، و لكن نوعية المتغيرات في سلسلة المتغيرات المدخلة تختلف في كل مرة، و معها يختلف نوع القيمة المرجعة.

سنكتب وظائف الجمع في فئة اسمها AddTwo هكذا:

نلاحظ أننا كتبنا فئتين بنفس الاسم، و لكن بنوع المدخلات مختلف، و نوع إرجاع مختلف، فمرة تاخذ متغيرين من نوع int و تعيد جمعهما في صورة int، و مرة تأخذ متغيرين من نوع float و تعيد ناتج جمعهما في صورة float أيضاً.

الآن سنكتب فئة رئيسية، نقوم من خلالها إستخراج عضو من فئة AddTwo و نستخدم الوظيفتين sum مرة لجمع متغيرين من نوع int و مرة متغيرين من نوع float، هكذا:

لاحظ معي لقد استخدمنا نفس الاسم في كل مرة للوظيفة في السطرين 10 و 11. و هذا يسهّل استخدام الوظيفة كثيراً.

و أبسط مثال على method overloading هي وظيفة الطباعة التي استخدمناها منذ اليوم الأول. فنحن نستخدمها أحياناً لطباعة نصوص، و أحياناً لطباعة أرقام. و أحياناً لطباعة أرقام كسرية. و هذا يدل على أنه تم تعريف الوظيفة بأكثر من تعريف في داخل الفئة، و كل تعريف يختص بطباعة نوع من أنواع المتغيرات. و نحن لم نشغل بالنا كثيراً، فنحن نكتب نفس اسم الوظيفة في كل مرة، و لا ندري أنه يتم استدعاء وظائف مختلفة حسب نوع المدخلات.

 

 أنواع الوظائف:

نستطيع تقسيم الوظائف إلى نوعين حسب الإعادة. فبعض الوظائف التي يتم تحديد نوع القيمة المرجعة، تقوم بإرجاع قيمة عن طريق استخدام الكلمة return. بينما لا ترجع الوظائف من نوع void شيئاً.

كما يمكننا تقسيم الوظائف حسب وضعية الوظيفة في الفئة إلى نوعين، وظائف خاصة بالفئة، ووظائف خاصة بالعضو. و يتم في النوع الأول كتابة كلمة (static) في توقيع الوظيفة (method signature). و هكذا نكون قد جعلنا هذه الوظيفة هي خاصة بالفئة بشكل عام و ليست خاصة لعضو من الأعضاء. و بإمكان أي عضو استخدامها من الفئة مباشرة دون الحاجة لانشاء عضو من الفئة. و كمثال على ذلك وظيفة random في فئة Math. فنحن نستطيع استخدامها بالإشارة لاسم الفئة مباشرة دون الحاجة لإنشاء عضو في الفئة، و استخدامها عبره.

تماماً كما في المثال السابق، يمكننا أن نجعل وظائف الجمع static و نستخدمها مباشرة دون الحاجة لإنشاء عضو من فئة AddTwo، هكذا:

نلاحظ أننا عرفنا الفئات لتكون static في السطر الثالث و الثامن، و هكذا نكون قد جعلناها خاصة بالفئة بشكل عام لا بعضو من الأعضاء. و الآن فقط نستطيع أن نستخجمها بهذا الشكل:

نلاحظ أننا في السطرين الثامن و التاسع استخدمنا وظيفة sum مسبوقة باسم الفئة AddTwo مباشرة، دون الحاجة لاستخراج عضو من الفئة AddTwo، لأنه تم تعريف الوظيفة على أنها static.

سيتم التفصيل عن الـ access modifiers في الدرس القادم إن شاء الله.

أرجو أن يكون الدرس واضحاً :-)

تحياتي
 

 

 

 


Copyright © www.kettaneh.net