perl - number - what is the atomic weight




ما هو الفرق بين new Some:: و Some:: Class-> new() في Perl؟ (3)

إن صيغة العنصر غير المباشر مرفوضة ، لأسباب وجيهة ، لكن هذا لا علاقة له بالصانعين. أنت على وشك أن يكون لديك وظيفة جديدة () في حزمة الاتصال. بدلاً من ذلك ، يجب عليك استخدام Package-> new () لسببين آخرين (أفضل؟):

  1. كما قلت ، تأخذ كل طرق الصف الأخرى شكل Package-> method () ، لذلك الاتساق هو شيء جيد

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

$foo = Foo->new(type => 'bar', style => 'baz');
Bar->new->do_stuff;

من

$foo = new Foo(type => 'bar', style => 'baz');
(new Bar)->do_stuff;

منذ عدة سنوات أتذكر مبرمج زميل يقدم المشورة:

new Some::Class;    # bad! (but why?)

Some::Class->new(); # good!

للأسف الآن لا أستطيع أن أتذكر السبب في ذلك. :( ستعمل كل النماذج بشكل صحيح حتى إذا لم يكن المنشئ موجود بالفعل في الوحدة النمطية Some :: Class ولكن بدلاً من موروث من أصل في مكان ما.

لا يتشابه أي من هذه النماذج مع بعض :: الفئة :: الجديدة () ، والتي لن تقوم بتمرير اسم الفئة كأول معلمة للمُنشئ - لذلك يكون هذا النموذج دائمًا غير صحيح.

حتى إذا كان النموذجان متعادلين ، أجد بعض :: Class-> new () أكثر وضوحًا ، لأنه يتبع الاتفاقية القياسية لاستدعاء طريقة في وحدة نمطية ، وفي perl ، لا تكون الطريقة "new" خاص - يمكن أن يطلق على المنشئ أي شيء ، والجديد () يمكن أن تفعل أي شيء (على الرغم من أننا بالطبع نتوقع أن يكون منشئ).


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

كان لاري يمزح ذات مرة بأنه كان هناك لجعل C ++ تشعر بالسعادة حيال new ، وعلى الرغم من أن الناس سوف يخبرونك بعدم استخدامه ، فربما كنت تفعل ذلك طوال الوقت. النظر في هذا:

print FH "Some message";

هل سبق لك أن تساءلت لم يكن هناك فاصلة بعد filehandle؟ وليس هناك فاصلة بعد اسم الفئة في تدوين الكائن غير المباشر؟ هذا ما يحدث هنا. يمكنك إعادة كتابة ذلك كطريقة اتصال على الطباعة:

FH->print( "Some message" );

قد تكون واجهت بعض الغرابة في print إذا فعلت ذلك بشكل خاطئ. يؤدي وضع فاصلة بعد مقبض الملف الصريح إلى تحويلها إلى وسيطة:

print FH, "some message";     # GLOB(0xDEADBEEF)some message

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


يسمى استخدام new Some::Class استدعاء الأسلوب "غير المباشر" ، وهو أمر سيء لأنه يقدم بعض الغموض في بناء الجملة.

سبب واحد يمكن أن تفشل هو إذا كان لديك مجموعة أو تجزئة من الكائنات. قد تتوقع

dosomethingwith $hashref->{obj}

ليكون مساويا

$hashref->{obj}->dosomethingwith();

لكنه في الواقع يوزع على أنه:

$hashref->dosomethingwith->{obj}

وهو على الأرجح ليس ما تريده

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

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





module