ما الفائدة من الدعوة الجديدة على كائن سبيل المثال ؟

StackOverflow https://stackoverflow.com/questions/1621373

سؤال

أنا أقرأ Programming Perl, و وجدت هذا مقتطف الشفرة:

sub new {
    my $invocant = shift;
    my $class   = ref($invocant) || $invocant;
    my $self = {
        color  => "bay",
        legs   => 4,
        owner  => undef,
        @_,                 # Override previous attributes
    };
    return bless $self, $class;
}

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

هل كانت مفيدة؟

المحلول

وهكذا يمكنك بناء كائن آخر من نفس الفئة دون معرفة ما هو كائن الطبقة الأصلية و- هذا يمكن أن يجعل لبعض حقا أنيق نمط مصنع المدمجة

وكمثال على ذلك، وهذا مفيد عندما يكون لديك أشياء الموارد التي تحتاج إلى بناء وكلما دعت الحاجة وتكلفة الحوسبة في اي نوع من الكائن الموارد مرتفع (مثلا، استعلام DB المستمر منذ فترة طويلة). ولذلك، فإن مصنع معرفة ما إذا تم تمرير أنه كائن المورد القديم وإذا كان الأمر كذلك، وخلق واحد فقط مثل ذلك بمجرد الدعوة $old_object->new() - تجنب تكلفة الموارد من إعادة الحوسبة هذا النوع من الموارد

وكمثال آخر، إذا كان لديك التسلسل الهرمي فئة تدل على الحيوانات، ومصنع لبناء حيوانات جديدة في المحاكاة، والتي يمكن أن يطلق $newborn = $factory->make_new_animal($mother) مع تنفيذ مصنع يكون مجرد $object->new()

نصائح أخرى

وأنا لا أرى أي فائدة حقيقية. يمكنك دائما مجرد القيام ref($obj)->new أو لديك طريقة للقيام $obj->clone. وبهذه الطريقة لا تترك يتساءل أي من هذين $object->new يقوم به.

كما قال آخرون إنه للسماح متعددة الأشكال إنشاء كائن جديد على سبيل المثال دون الحاجة إلى أن تكون على بينة من نوع من تلك الحالة.

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

  1. أن تكون قادرة على استخدام فئة مختلفة (طفل أو mixin/الدور (مثلا ، موس دور)) لتجاوز مختلف السلوك
  2. القدرة على صنع الكود أكثر وضوحا ، مثل إذا كانت الخطوات المطلوبة لإنشاء الجديد "فارغة" كائن مختلف جدا من تلك التي في استنساخ كائن موجود.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top