شرح تقنية vararage

ماهي خاصية vararage ؟ هل سبق وتعاملت مع دالة printf في جافا ؟ هل تسالت من طريقة برمجتها ، وكيف تستطيع استقبال الكثير من الوسائط ؛ الاجابة عن هذا التساؤل هي خاصية vararage  . احدى الخصائص المميزة والقوية في لغة الجافا ، وتوجد في لغات اخرى ايضاً . تمنح هذه الخاصية القدرة على ارسال عدد لا نهائي من الوسائط (parameters)الى الدالة ويتم استخدامها كالتالي : static int sum(int ... nums){     int sum = 0;     for(int i = 0; i < nums.length; i++){         sum += nums[i];     }     return sum; } حيث قمنا باضافة الثلاث النقاط (...) ما بين نوع المتغير الوسيط (parameter) nums و اسمه ؛ لاحظ اننا نتعامل مع المتغير الوسيط nums كمصفوفة . يمكن استعمال الدالة السابقة وتمرير لها اي عدد من الوسائط ، الحالات التالية جميعها صحيحة : System.out.println(sum(10)); System.out.println(sum(10,20)); System.out.println(sum(10,20,30)); ويمكن تمرير عدد لا نهائي من الوسائط الى الدالة . هل يمكن تمرير وسائط مختلفة الانواع ؟ الاجابة هي لا ، ولا يمكن ايضاً تمرير اكثر من vararage في نفس الوقت الكود التالي غير صحيح : static void vara(int ...v1, String ...v2){} إذا لا يمكن تمرير اكثر من vararage في وقت واحد ، لكن ماذا عن دالة printf التي تحدثنا عنها ، فهي تستقبل في البداية نصاً(String) ثم تستقبل انواع مختلفة قد تكون ارقاماً او نصوصاً ؟! دعني اوضح لك الاجابة على قسمين ، القسم الاول هو كيف اجعلها تستقبل في البداية نصاً اجبارياً والمثال التالي يوضح ذلك : static void myPrintf(String first, int ... vara){} لاحظ اننا قمنا بارسال وسيط ثابت (ليس vararage ) قبل ارسال ال vararage وهذا مقبول في جافا ، والكود سيعمل بدون مشاكل . حللنا الجزء الاول من المشكلة ، تبقى كيف نرسل انواع مختلفة من البيانات في ال vararage  ، الامر بسيط جدا ، فلغة جافا هي كائينية التوجه وكل فئاتها (classes) ترث من الفئة الام وهي Object ، لذلك تعديل الكود السابق سيكون كالتالي : static void myPrintf(String first, Object ... vara){} هذا الكود يشبه بالضبط كود تعريف دالة System.out.printf(); ملاحظة اخيرة عن vararage : اذا كان لدينا دالة تستقبل vararage كالتالي : static int sum(int ... nums){     int sum = 0;     for(int i = 0; i < nums.length; i++){         sum += nums[i];     }     return sum; } فيمكن استخدامها بطريقتين ، الطريقة الاولى شرحتها في الموضوع السابق والطريقة الثانية هي بتمرير مصفوفة قيم جاهزة اليها كالتالي : int[] array = new int[]{10, 20, 30, 50}; int total = sum(array); في النهاية ، موضوع ال vararage موضوع قوي ويوفر ديناميكية كبيرة في التعامل مع الدوال .

Apr 29, 2025 - 17:39
 0
شرح تقنية vararage

ماهي خاصية vararage ؟
هل سبق وتعاملت مع دالة printf في جافا ؟ هل تسالت من طريقة برمجتها ، وكيف تستطيع استقبال الكثير من الوسائط ؛ الاجابة عن هذا التساؤل هي خاصية vararage  .

احدى الخصائص المميزة والقوية في لغة الجافا ، وتوجد في لغات اخرى ايضاً .

  • تمنح هذه الخاصية القدرة على ارسال عدد لا نهائي من الوسائط (parameters)الى الدالة ويتم استخدامها كالتالي :
static int sum(int ... nums){
    int sum = 0;
    for(int i = 0; i < nums.length; i++){
        sum += nums[i];
    }
    return sum;
}

حيث قمنا باضافة الثلاث النقاط (...) ما بين نوع المتغير الوسيط (parameter) nums و اسمه ؛ لاحظ اننا نتعامل مع المتغير الوسيط nums كمصفوفة .
يمكن استعمال الدالة السابقة وتمرير لها اي عدد من الوسائط ، الحالات التالية جميعها صحيحة :

System.out.println(sum(10));
System.out.println(sum(10,20));
System.out.println(sum(10,20,30));

ويمكن تمرير عدد لا نهائي من الوسائط الى الدالة .

هل يمكن تمرير وسائط مختلفة الانواع ؟
الاجابة هي لا ، ولا يمكن ايضاً تمرير اكثر من vararage في نفس الوقت الكود التالي غير صحيح :

static void vara(int ...v1, String ...v2){}

إذا لا يمكن تمرير اكثر من vararage في وقت واحد ، لكن ماذا عن دالة printf التي تحدثنا عنها ، فهي تستقبل في البداية نصاً(String) ثم تستقبل انواع مختلفة قد تكون ارقاماً او نصوصاً ؟!
دعني اوضح لك الاجابة على قسمين ، القسم الاول هو كيف اجعلها تستقبل في البداية نصاً اجبارياً والمثال التالي يوضح ذلك :

static void myPrintf(String first, int ... vara){}

لاحظ اننا قمنا بارسال وسيط ثابت (ليس vararage ) قبل ارسال ال vararage وهذا مقبول في جافا ، والكود سيعمل بدون مشاكل .
حللنا الجزء الاول من المشكلة ، تبقى كيف نرسل انواع مختلفة من البيانات في ال vararage  ، الامر بسيط جدا ، فلغة جافا هي كائينية التوجه وكل فئاتها (classes) ترث من الفئة الام وهي Object ، لذلك تعديل الكود السابق سيكون كالتالي :

static void myPrintf(String first, Object ... vara){}

هذا الكود يشبه بالضبط كود تعريف دالة

System.out.printf(); 

ملاحظة اخيرة عن vararage :
اذا كان لدينا دالة تستقبل vararage كالتالي :

static int sum(int ... nums){
    int sum = 0;
    for(int i = 0; i < nums.length; i++){
        sum += nums[i];
    }
    return sum;
}

فيمكن استخدامها بطريقتين ، الطريقة الاولى شرحتها في الموضوع السابق والطريقة الثانية هي بتمرير مصفوفة قيم جاهزة اليها كالتالي :

int[] array = new int[]{10, 20, 30, 50};
int total = sum(array);

في النهاية ، موضوع ال vararage موضوع قوي ويوفر ديناميكية كبيرة في التعامل مع الدوال .