محتويات الدورة

Java / الأساسي / الدرس 4

الدوال والعقود وتمرير المعاملات

ابنِ دوال صغيرة بمدخلات ونتائج وقواعد فشل صريحة، واشرح التمرير بالقيمة والنطاق والتحميل الزائد وانتهاء الاستدعاء الذاتي.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تحديد عقد الدالة ومعنى إرجاعها.
  • تتبع نسخ القيم الأولية والمرجعية.
  • فصل اختيار التحميل الزائد من التوزيع وقت التشغيل.

حدد المدخل والخرج والفشل

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

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

تتبع القيم عبر حد الدالة

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

يحسب المثال مساحة مستطيل من معامليه ويعيد12، ويختار المستدعي الطباعة. يظل الضرب دقيقاً ضمن المدى؛ ويجب أن يحدد عقد حقيقي الأبعاد أو يستخدم Math.multiplyExact. اختبر الصفر والحدود ولا تعتمد على متغيرات عامة خفية تتغير بين الاستدعاءات.

java حساب يعيد قيمة للمستدعي
public class Main {
static int area(int width,int height) { return Math.multiplyExact(width,height); }
 public static void main(String[] args) throws Exception {
System.out.println(area(3,4));
 }
}
الناتج المتوقع
12

تصبح القيمتان معاملي width وheight محليين ويتولى المستدعي الإخراج.

فسّر ظهور تعديل الكائن المرجوع إليه

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

يعدل مثال المصفوفة عنصرها الأول إلى9 ثم يعيد إسناد المعامل المحلي لمصفوفة أخرى. يظل المستدعي يشير إلى الأصل الذي أصبح يحتوي9. لتجنب التعديل أنشئ نسخة وأعدها أو استخدم تمثيلاً ثابتاً. وثّق الأثر ولا تتوقع استنتاجه من تفاصيل التنفيذ.

java مرجع منسوخ يشير إلى المصفوفة نفسها
public class Main {
static void change(int[] a) { a[0]=9; a=new int[]{7}; }
 public static void main(String[] args) throws Exception {
int[] values={1};
change(values);
System.out.println(values[0]);
 }
}
الناتج المتوقع
9

يصل تعديل العنصر إلى الأصل، ولا يستبدل إسناد مصفوفة جديدة للمعامل متغير المستدعي.

اجعل التحميل الزائد واضحاً

تشترك الدوال المحملة في الاسم وتختلف قوائم معاملاتها. يختار المترجم النسخة الملائمة وفق الأنواع المعلنة والتحويلات؛ ولا يكفي اختلاف نوع الإرجاع. قد يفيد int مع long، لكن كثرة النسخ المرجعية المتقاربة تجعل null ملتبسة. فضّل واجهة واضحة على حيل التواقيع.

يختلف التحميل الزائد من إعادة التعريف التي يوفر فيها النوع الفرعي سلوك دالة كائنية موروثة. يطبق التوزيع وقت التشغيل على هذا السلوك لا اختيار نسخة اعتباطية بناء على محتوى كل معامل. افصل القرارين عند التتبع واستخدم @Override ليتحقق المترجم من القصد.

قيّد العودية والاعتماديات الخفية

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

راجع الدالة بأسئلة مستقلة: هل يمكن تحديد المقبول وفحص الناتج وتقييد الموارد؟ أظهر اعتماد الحالة في المعاملات أو المتعاونين الكائنيين. تفيد الدوال الصغيرة عندما تمثل عملية ذات معنى، وقد يحجب تقسيم كل رمز حسابي التعليل بدلاً من توضيحه.

الأخطاء الشائعة وإصلاحها

missing return statement

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

reference to method is ambiguous

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

StackOverflowError

لماذا يحدث؟
تفتقر العودية للتقدم أو تتجاوز العمق العملي.
كيف تصلحه؟
تحقق من المجال واستخدم تكراراً محدوداً عند الملاءمة.
كيف تتجنب تكراره؟
اختبر الأساس وأقصى عمق مدعوم.

اختبر فهمك

1. تجعل دالة معامل int يساوي99. هل يتغير متغير المستدعي؟

اعرض الحل المشروح

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

2. حدد عقد دالة متوسط تستقبل مصفوفة int.

اعرض الحل المشروح

حدد رفض null والفراغ وتجنب القسمة الصحيحة واختر مجموعاً واسعاً ووثق تعديل المصفوفة من عدمه. اختبر عنصراً وإشارات مختلطة والفراغ وحدود المجال.

أهم ما تعلمته

  • يشمل العقد الفشل والتعديل.
  • ينسخ تمرير المعامل قيمة حتى المرجع.
  • تحتاج العودية أساساً وتقدماً وحد موارد.

المراجع الرسمية