[Binding] ما هو الفرق بين الربط المبكر والمتأخر؟



Answers

في اللغات المترجمة ، يكون الفرق صارخًا.

جافا:

//early binding:
public create_a_foo(*args) {
 return new Foo(args)
}
my_foo = create_a_foo();

//late binding:
public create_something(Class klass, *args) {
  klass.new_instance(args)
}
my_foo = create_something(Foo);

في المثال الأول ، يستطيع المحول القيام بجميع أنواع الأشياء الرائعة في وقت التحويل البرمجي. في الحالة الثانية ، عليك أن نأمل في أن أي شخص يستخدم هذه الطريقة يفعل ذلك بمسؤولية. (بالطبع ، تدعم JVMs الجديدة هيكل Class<? extends Foo> klass ، والذي يمكن أن يقلل من هذه المخاطر إلى حد كبير).

فائدة أخرى هي أن IDEs يمكنها إنشاء ارتباط مباشر إلى تعريف الفئة ، حيث يتم الإعلان عنه بشكل صحيح في هذه الطريقة. قد تكون الدعوة إلى create_something (Foo) بعيدة جدًا عن تعريف الطريقة ، وإذا كنت تنظر إلى تعريف الطريقة ، فقد يكون من الجيد رؤية التنفيذ.

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

Question

ما هو الفرق بين الربط المبكر والمتأخر؟




إجابة مماثلة ولكنها أكثر تفصيلاً من كتاب هربرت شيلدت C ++: -

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

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




public class child()
{    public void method1()
     {     System.out.println("child1");
     }
    public void method2()
     {     System.out.println("child2");
     }

}
public class teenager extends child()
{    public void method3()
     {      System.out.println("teenager3");
     }
}
public class adult extends teenager()
{     
    public void method1()
    {    System.out.println("adult1);
         super.method1();
     }
}


//In java
public static void main(String []args)
{    ((teenager)var).method1();
}

هذا سوف يطبع

adult1
child1

في الربط المبكر سيكون لدى المحول البرمجي حق الوصول إلى جميع الطرق في الطفل والمراهق ولكن في الربط المتأخر (في وقت التشغيل) ، سيتحقق من الطرق التي يتم تجاوزها في وقت التشغيل.

وبالتالي سوف يتم تجاوز method1 (من الربط المبكر - الطفل) بواسطة method1 من الكبار في وقت التشغيل (الربط المتأخر) ثم سيقوم بتنفيذ method1 من child حيث لا يوجد method1 في method1 في مراهق.

لاحظ أنه إذا لم يكن الطفل لديه method1 ، فلن يتم ترجمة التعليمات البرمجية الموجودة في المجلد الرئيسي.




Links