1. مقدمة
في العديد من لغات البرمجة ، يوجد مفهوم عوائق الوظائف. هناك مؤشرات وظيفية في C و C ++ ، لذلك يمكن تمرير الوظائف كمعلمات إلى وظائف أخرى للاتصال لاحقًا. في JavaScript ، يتم إحضار عمليات الاسترداد للوظائف إلى أقصى الحدود. يتم الانتهاء من التعامل مع مختلف الأحداث ، وخاصة الأحداث غير المتزامنة ، بشكل أساسي عن طريق عروض تكليف الوظائف.
في Java ، يمكن أيضًا تنفيذ عمليات عمليات الاسترداد للوظائف. على الرغم من عدم وجود مؤشر وظيفة ، يمكن لـ Java الحصول على طريقة فئة من خلال آلية الانعكاس ، قم بتمريرها إلى وظائف أخرى كمعلمة من النوع java.lang.reflect.method ، ثم استدعاء الوظيفة من خلال طريقة استدعاء كائن الطريقة.
ومع ذلك ، فإن خطوات الاتصال بهذه الطريقة هي مرهقة نسبيا ، غير فعالة في التنفيذ ، ويصعب تصحيحها. في Java ، هناك آلية أكثر أناقة من عمليات الاسترداد للوظائف ، أي واجهات.
2. لماذا تحتاج عمليات عروض وظائف الوظيفة
تعتبر عمليات عدادات الوظائف هي في الواقع وسيلة لتأخير تنفيذ وظائف معينة.
إذا عرفنا مسبقًا العمليات التي يجب أن يؤديها البرنامج ، فلا توجد حاجة لعمليات عروض وظائف على الإطلاق ، ويمكن تنفيذها مباشرة أثناء البرمجة.
ولكن في كثير من الأحيان ، عند كتابة التعليمات البرمجية ، خاصة عند كتابة فئات الأدوات أو مكتبات الوظائف أو الأطر ، يتم تنفيذ وظائف عامة وتجريدية نسبيًا ، بينما يتم تنفيذ الوظائف في سيناريوهات محددة من قبل المطورين الذين يستخدمون هذه الفئات.
يمكن أن تحل عروض عمليات عروض الوظائف هذا الموقف حيث لا تعرف التنفيذ المحدد مقدمًا.
أمثلة على وظائف الفرز
على سبيل المثال ، عندما نريد تنفيذ وظيفة فرز عامة ، لا نعرف مسبقًا أنواع العناصر التي سيستخدمها المطورين الآخرون لفرزها ، ولا نعرف ما هي المعايير التي يجب الحكم عليها في العلاقة الجزئية (الحجم) لهذه العناصر.
لذلك ، يمكن أن يُطلب من المطورين الآخرين تقديم وظيفة مقارنة عند استخدام وظائف الفرز ، حتى نتمكن من استخدام المقارنة لمقارنة حجم العناصر المراد فرزها دون معرفة ما هو نوع العناصر ، ولا التنفيذ المحدد للمقارنة.
هنا ، وظيفة المقارنة هي وظيفة رد الاتصال لوظيفة الفرز.
يتم تمثيل الكود الزائف على النحو التالي:
// فرز الفراغ العام للدالة العامة (كائن [] صفيف ، طريقة مقارنة) {// استخدم دالة المقارنة لمقارنة علاقة حجم العناصر في الصفيف // فرز الصفيف} // يتم تطبيق وظيفة المقارنة المحددة بواسطة العلاقة بين المتصل int (الكائن أ ، الكائن ب) {// مقارنات العناصر A و B و BISTRING}مثال على وظائف المعالجة غير المتزامنة
على سبيل المثال ، عندما نكتب وظيفة معالجة غير متزامنة ، لا نعرف مسبقًا ما يجب على المطورين الآخرين فعله عند اكتمال المعالجة ، لأن هذه العمليات لا يمكن معروفة إلا عند استخدام الوظيفة في سيناريو محدد.
لذلك ، يمكن أن يُطلب من المطورين توفير رد اتصال وظيفة رد الاتصال عند استخدام هذه الوظيفة. وبهذه الطريقة ، عندما نكتب وظائف المعالجة غير المتزامنة ، يمكننا استدعاء وظيفة رد الاتصال لأداء بعض الأعمال النهائية دون معرفة ماهية هذه العمل النهائي مقدمًا.
يتم تمثيل الكود الزائف على النحو التالي:
// دالة المعالجة ASYNC باطلة ASYNPROCESS (طريقة رد الاتصال) {// تنفيذ رد الاتصال المهمة غير المتزامن () ؛} // يتم تنفيذ رد الاتصال الفراغ الخاص بوظيفة رد الاتصال المحددة () بواسطة المتصل {// العمليات التي سيتم تنفيذها بعد الانتهاء من المعالجة غير المتزامنة}}}3. استخدم الواجهة بدلاً من رد الاتصال بالوظيفة
لقد ذكرنا أعلاه أن السبب في استخدام رد الاتصال الوظيفي هو أننا لا نعرف التنفيذ المحدد لوظائف معينة مسبقًا ، وبالتالي يتم ترك التنفيذ المحدد للمطورين الآخرين لإكماله.
هل تعتقد أن هذه الجملة تصف واجهة جافا؟ الواجهة هي تعريف مجردة لمجموعة من الطرق ، ويتم الانتهاء من التنفيذ المحدد بواسطة الفئة التي تنفذ الواجهة.
لذلك ، باستخدام خصائص اثنين من الكائنات الموجهة نحو الواجهة ، يمكن استبدال عمليات الاسترداد للوظائف.
نعطي المثالين أعلاه لتوضيح كيفية استبدال واجهة رد اتصال الوظيفة.
فرز الوظائف
باستخدام واجهة لتنفيذ وظيفة الفرز ، لم يعد يتطلب من المطورين تقديم وظيفة رد الاتصال عند استخدام وظيفة الفرز ، ولكن يتطلب من المطورين التأكد من أن العناصر المراد فرزها لتنفيذ الواجهة المماثلة. بناءً على فرضية أن "العناصر المراد فرزها قد نفذت بالفعل الواجهة المماثلة" ، يمكننا تنفيذ وظيفة الفرز دون معرفة نوع العناصر المراد فرزها.
// SORT General Function void sort (Object [] Array) {// استخدم طريقة مقارنة الواجهة المماثلة // قارن حجم العناصر لفرز الصفيف. } // الواجهة المحددة بواسطة وظيفة الفرز الواجهة العامة قابلة للمقارنة {public int compareto (كائن آخر) ؛} // تنفيذ عنصر الفئة العامة المقارنة ، يطبق عنصر الفئة العامة المماثلة {Override public int compareto (كائن آخر) {// الحكم على علاقة الحجم الحالي بين العنصر والآخر//إرجاع العلاقة بين اثنين}}}وظائف المعالجة غير المتزامنة
عند استخدام واجهات لتنفيذ وظائف المعالجة غير المتزامنة ، لا يتطلب المطور رد اتصال وظيفة رد الاتصال ، ولكنه يتطلب كائنًا ينفذ الواجهة المحددة ، والتي تعكس بشكل جيد الفكرة الموجهة للكائن Java. مقارنة بتوفير وظيفة ، يحتوي الكائن على مزيد من المعلومات وهو أكثر مرونة للاستخدام. ولكن في الأساس ، لا تزال وظيفة المعالجة غير المتزامنة هذه تستخدم الواجهة لإكمال أعمال التشطيب.
// دالة المعالجة ASYNC باطلة ASYNPROCESS (ActionListener al) {// تنفيذ المهام غير المتزامنة al.ActionPerformed () ؛} // واجهة محددة من قبل inctratask public public public public publicistener activelistener {everride {void actionperformed () ؛} العمل المطلوب عند اكتمال وظيفة المعالجة غير المتزامنة}} // استدعاء وظيفة المعالجة غير المتزامنة الرئيسية الفراغ الثابتة (سلسلة [] args) {Asynprocess (New Extratask ()) ؛}4. ملخص
يمكن تلخيص طريقة رد الاتصال على النحو التالي: تنفيذ وظيفة عامة. عند استدعاء هذه الوظيفة العامة في سيناريو محدد ، يحتاج المتصل إلى توفير رد اتصال مناسب للاستدعاء. تستخدم الوظيفة العامة FUNC وظيفة رد الاتصال هذه لاستكمال المهام في سيناريوهات محددة.
طريقة تنفيذ الواجهة هي: تنفيذ وظيفة عامة. عند استدعاء هذه الوظيفة العامة في سيناريو محدد ، يحتاج الكائن الذي يتم تشغيله إلى تنفيذ الواجهة المناسبة بمفرده. ستستخدم الوظيفة العامة هذه الواجهة لإكمال المهام في السيناريو المحدد.
يمكن أن يؤدي استخدام عمليات الاسترجاعات أو الواجهات إلى حل الموقف حيث لا تعرف التنفيذ المحدد مقدمًا. تمرر طريقة رد اتصال الوظيفة وظيفة ، بينما تمرر طريقة الواجهة كائنًا ينفذ الواجهة.
في Java ، يجب إكمال عمليات الاسترجاعات للوظائف باستخدام آليات الانعكاس ، والتي تكون عرضة للأخطاء وغير فعالة. يمكن أن يؤدي استخدام الواجهات إلى جعل منطق الرمز أكثر وضوحًا وأكثر كفاءة وأسهل تصحيحه.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.