পার্ল 5 এর ফাংশন প্রোটোটাইপগুলি খারাপ কেন?


116

ইন আরেকটি স্ট্যাক ওভারফ্লো প্রশ্ন লিওন Timmermans জাহির:

আমি আপনাকে প্রোটোটাইপ ব্যবহার না করার পরামর্শ দেব। তাদের ব্যবহার রয়েছে, তবে বেশিরভাগ ক্ষেত্রে নয় এবং অবশ্যই এটির মধ্যে নেই।

কেন এটি সত্য (বা অন্যথায়) হতে পারে? আমি আমার পার্ল ফাংশনগুলির জন্য প্রায়শই প্রোটোটাইপ সরবরাহ করি এবং এর আগে অন্য কাউকে সেগুলি ব্যবহার সম্পর্কে খারাপ বলতে কখনও দেখিনি।


আমিও কৌতুহলী। আমি যখন এগুলি ব্যবহার না করি তখনই আমি যখন পরিবর্তনশীল সংখ্যক যুক্তি দিয়ে কল করি।
পল টমবলিন 21

7
আমি দয়া করে সুপারিশ করতে পারি যে আপনি "পার্ল প্রোটোটাইপগুলি ক্ষতিকারক হিসাবে বিবেচনা করছেন" নিবন্ধটি পড়ুন ?
tchrist

উত্তর:


121

প্রোটোটাইপগুলি সঠিকভাবে ব্যবহার করা গেলে খারাপ হয় না। অসুবিধাটি হ'ল পার্লের প্রোটোটাইপগুলি লোকেরা প্রায়শই যেভাবে প্রত্যাশা করে সেভাবে কাজ করে না। অন্যান্য প্রোগ্রামিং ভাষার ব্যাকগ্রাউন্ডযুক্ত লোকেরা প্রোটোটাইপগুলি ফাংশন কলগুলি সঠিক তা পরীক্ষা করার জন্য একটি প্রক্রিয়া সরবরাহ করার প্রত্যাশা করে: এটি হ'ল তাদের সঠিক সংখ্যা এবং যুক্তিগুলির ধরণ রয়েছে। পার্লের প্রোটোটাইপগুলি এই কাজের জন্য উপযুক্ত নয়। এটির অপব্যবহারটি খারাপ। পার্লের প্রোটোটাইপগুলির একটি একক এবং খুব আলাদা উদ্দেশ্য রয়েছে:

প্রোটোটাইপগুলি আপনাকে ফাংশনগুলি সংজ্ঞায়িত করতে দেয় যা অন্তর্নির্মিত ফাংশনগুলির মতো আচরণ করে।

  • প্যারেন্টিগুলি alচ্ছিক।
  • যুক্তিগুলিতে প্রসঙ্গ চাপিয়ে দেওয়া হয়।

উদাহরণস্বরূপ, আপনি এই জাতীয় ক্রিয়াটি সংজ্ঞায়িত করতে পারেন:

sub mypush(\@@) { ... }

এবং এটি হিসাবে কল

mypush @array, 1, 2, 3;

\অ্যারে একটি রেফারেন্স নিতে লিখতে প্রয়োজন ছাড়া ।

সংক্ষেপে, প্রোটোটাইপগুলি আপনাকে আপনার নিজস্ব সিনট্যাকটিক চিনি তৈরি করতে দেয়। উদাহরণস্বরূপ, মুজ ফ্রেমওয়ার্কটি আরও সাধারণ ওও সিনট্যাক্স অনুকরণ করতে তাদের ব্যবহার করে।

এটি খুব দরকারী তবে প্রোটোটাইপগুলি খুব সীমাবদ্ধ:

  • তাদের সংকলন সময়ে দৃশ্যমান হতে হবে।
  • এগুলি বাইপাস করা যায়।
  • যুক্তিতে প্রসঙ্গে প্রচার করা অপ্রত্যাশিত আচরণের কারণ হতে পারে।
  • তারা কঠোরভাবে নির্ধারিত ফর্ম ব্যতীত অন্য কোনও কিছু ব্যবহার করে ফাংশনগুলি কল করতে অসুবিধা করতে পারে।

সমস্ত ক্ষুধার্ত বিশদগুলির জন্য পার্লসবুটে প্রোটোটাইপগুলি দেখুন ।


2
আমি এই উত্তরটি গ্রহণ করেছি কারণ আমার মনে হয় যে এ প্রশ্নের সেরা উত্তর আমি পেয়েছি - প্রোটোটাইপগুলি অভ্যন্তরীণভাবে খারাপ নয়, আপনি কীভাবে এগুলি ব্যবহার করেন ঠিক এটি।
Alnitak

2
অন্যদিকে মুজ প্রোটোটাইপগুলি হ'ল / দুর্দান্ত / p3rl.org/ মোজএক্স
কেন্ট ফ্রেড্রিক


তাহলে এরা কি ভুল নাম?
পিটার মর্টেনসেন

69

সমস্যাটি হ'ল পার্লের ফাংশন প্রোটোটাইপগুলি লোকেরা যা মনে করে তা করে না। তাদের উদ্দেশ্য আপনাকে পার্কের অন্তর্নির্মিত ফাংশনগুলির মতো পার্স করা ফাংশনগুলি লেখার মঞ্জুরি দেওয়া।

প্রথমত, পদ্ধতি কলগুলি প্রোটোটাইপগুলিকে সম্পূর্ণ উপেক্ষা করে। যদি আপনি ওও প্রোগ্রামিং করে থাকেন তবে আপনার পদ্ধতিগুলির প্রোটোটাইপ কী তা বিবেচ্য নয়। (সুতরাং তাদের কোনও প্রোটোটাইপ না থাকা উচিত))

দ্বিতীয়ত, প্রোটোটাইপগুলি কঠোরভাবে প্রয়োগ করা হয় না। আপনি যদি একটি সাব্রুটিন সাথে কল করেন &function(...)তবে প্রোটোটাইপটিকে উপেক্ষা করা হবে। সুতরাং তারা সত্যিই কোনও ধরণের সুরক্ষা সরবরাহ করে না।

তৃতীয়ত, এগুলি দূরত্বে অদ্ভুত ক্রিয়া। (বিশেষত $প্রোটোটাইপ, যার ফলে সংশ্লিষ্ট পরামিতিগুলি ডিফল্ট তালিকার প্রেক্ষাপটের পরিবর্তে স্কেলারের প্রসঙ্গে মূল্যায়ন করতে পারে))

বিশেষত, অ্যারে থেকে প্যারামিটারগুলি পাস করা তারা কঠিন করে তোলে। উদাহরণ স্বরূপ:

my @array = qw(a b c);

foo(@array);
foo(@array[0..1]);
foo($array[0], $array[1], $array[2]);

sub foo ($;$$) { print "@_\n" }

foo(@array);
foo(@array[0..1]);
foo($array[0], $array[1], $array[2]);

কপি করে প্রিন্ট:

a b c
a b
a b c
3
b
a b c

3 টি সতর্কতা সহ main::foo() called too early to check prototype(যদি সতর্কতা সক্ষম হয়)। সমস্যাটি হল যে স্কেলার প্রসঙ্গে মূল্যায়ন করা একটি অ্যারে (বা অ্যারে স্লাইস) অ্যারের দৈর্ঘ্য ফেরত দেয়।

যদি আপনাকে এমন কোনও ফাংশন লিখতে হয় যা বিল্ট-ইন এর মতো কাজ করে তবে একটি প্রোটোটাইপ ব্যবহার করুন। অন্যথায়, প্রোটোটাইপ ব্যবহার করবেন না।

দ্রষ্টব্য: পার্ল 6 এর সম্পূর্ণ পুনর্নির্মাণ এবং খুব দরকারী প্রোটোটাইপ থাকবে। এই উত্তরটি কেবল পার্ল 5 এর জন্য প্রযোজ্য।


তবে তারা এখনও একটি দরকারী চেক সরবরাহ করে যে আপনার কলার এবং সাবগুলি একই সংখ্যক যুক্তি ব্যবহার করছে, তাই এর সাথে কী হয়েছে?
পল টমবলিন 21

2
না; সাধারণ সম্মতিটি হ'ল পার্ল ফাংশন প্রোটোটাইপগুলি মূলত কোনও সুবিধা দেয় না। কমপক্ষে পার্ল ৫-এ আপনি তাদের বিরক্তও করতে পারেন না Per পার্ল একটি ভিন্ন (ভাল) গল্প হতে পারে।
জোনাথন লেফলার

5
: যেমন প্যারাম :: যাচাই মডিউল রূপে বৈধকরণ আর্গুমেন্ট ভাল উপায়, আছে search.cpan.org/~drolsky/Params-Validate-0.91/lib/Params/...
friedo

10
সংশোধন: অ্যারে স্লাইসিং একটি তালিকা দেয় , সুতরাং একটি স্কেলারের প্রসঙ্গে একটি অ্যারের স্লাইস তালিকার চূড়ান্ত উপাদানটি প্রদান করে। আপনার দ্বিতীয় থেকে শেষ foo()প্রিন্টের অনুরোধ 2 কারণ এটি আপনার দুটি উপাদান স্লাইজের চূড়ান্ত উপাদান। পরিবর্তন করুন my @array = qw(foo bar baz)এবং আপনি পার্থক্য দেখতে পাবেন। (একদিকে যেমন, আমি 0 / অথবা 1-ভিত্তিক সংখ্যার সিকোয়েন্সগুলিকে থ্রো-এওয়ে, প্রদর্শনমূলক কোডে আরম্ভ করি না ind সূচকগুলি, গণনা এবং প্রসঙ্গের উপাদানগুলির মধ্যে বিভ্রান্তি আমাকে একাধিকবার কামড় দিয়েছে। বোকা তবে সত্য।)
পাইলক্রো

2
@ পিলক্রো: a b cআপনার বক্তব্য পরিষ্কার করার জন্য আমি উত্তরটি সম্পাদনা করেছি ।
ফ্লিম 15

30

আমি উপরোক্ত দুটি পোস্টারের সাথে একমত সাধারণভাবে, ব্যবহার $এড়ানো উচিত। এগুলির নমুনা যখন ব্লক আর্গুমেন্টগুলি (ব্যবহার করে শুধুমাত্র দরকারী &,) globs ( *), অথবা রেফারেন্স এগুলির নমুনা ( \@, \$, \%, \*)


সাধারণভাবে, সম্ভবত, তবে আমি দুটি ব্যতিক্রম উল্লেখ করতে চাই: প্রথমত, ($)প্রোটোটাইপ একটি নামযুক্ত ইউনিারি অপারেটর তৈরি করে, যা দরকারী হতে পারে (অবশ্যই পার্ল তাদের দরকারী বলে মনে করে; উপলক্ষে আমারও আছে)। দ্বিতীয়ত, বিল্ট-ইনগুলি ওভাররাইড করার সময় (আমদানির মাধ্যমে বা কোরি :: গ্লোবাল: :) ব্যবহার করার পরে, বিল্ট-ইনটিতে যা কিছু প্রোটোটাইপ থাকে সেদিকে আপনি সাধারণভাবে আটকে থাকা উচিত, এমনকি এতে কোনও অন্তর্ভুক্ত থাকলেও $বা আপনি প্রোগ্রামারকে অবাক করে দিতে পারেন (নিজেকে, এমনকি) তালিকার প্রসঙ্গে যেখানে বিল্ট-ইন অন্যথায় স্কেলার প্রসঙ্গ সরবরাহ করবে।
সিধেকিন

4

কিছু লোক, পার্ল সাবরুটিন প্রোটোটাইপটির দিকে তাকিয়ে মনে করে যে এর অর্থ এমন কিছু যা এরকম হয় না:

sub some_sub ($$) { ... }

পার্লের কাছে, তার অর্থ পার্সার দুটি যুক্তি প্রত্যাশা করে। পার্লের এমন সব সাবটাইনগুলি তৈরি করার সুযোগ দেয় যা অন্তর্নির্মিতদের মতো আচরণ করে, যা সকলেই জানেন যে উত্তরসূরী কোড থেকে কী প্রত্যাশা করা উচিত। আপনি পার্লসবুটিতে প্রোটোটাইপগুলি সম্পর্কে পড়তে পারেন

ডকুমেন্টেশন না পড়ে, লোকেরা অনুমান করে যে প্রোটোটাইপগুলি রান টাইম আর্গুমেন্ট চেকিং বা অন্য জাতীয় ভাষায় দেখেছি এমন কিছু বলে। পার্ল সম্পর্কে লোকেদের বেশিরভাগ জিনিস যেমন অনুমান করা হয় তেমনি এগুলিও ভুল হয়ে যায়।

তবে, পার্ল v5.20 দিয়ে শুরু করে, পার্লের একটি বৈশিষ্ট্য রয়েছে, পরীক্ষামূলক হিসাবে আমি এটি লিখছি, যা ব্যবহারকারীরা কী প্রত্যাশা করে এবং কীসের মতো আরও কিছু দেয়। পার্লের সাবরুটাইন স্বাক্ষরগুলি সময় আর্গুমেন্ট গণনা, ভেরিয়েবল বরাদ্দকরণ এবং ডিফল্ট সেটিং চালায়:

use v5.20;
use feature qw(signatures);
no warnings qw(experimental::signatures);

animals( 'Buster', 'Nikki', 'Godzilla' );

sub animals ($cat, $dog, $lizard = 'Default reptile') { 
    say "The cat is $cat";
    say "The dog is $dog";
    say "The lizard is $lizard";
    }

আপনি যদি প্রোটোটাইপগুলি বিবেচনা করেন তবে এটি সম্ভবত আপনি চান এমন বৈশিষ্ট্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.