এতগুলি ভাষা কেন মান দ্বারা পাস হয়?


36

এমনকি আপনার যেখানে সি এর মতো স্পষ্ট পয়েন্টার ম্যানিপুলেশন রয়েছে সেগুলি সর্বদা মান দ্বারা পাস হয় (আপনি এগুলি রেফারেন্স দিয়ে পাস করতে পারেন তবে এটি ডিফল্ট আচরণ নয়)।

এর সুবিধা কী, এতগুলি ভাষা মূল্যবোধ দ্বারা কেন পাস হয় এবং অন্যরা কেন রেফারেন্স দিয়ে পাস হয় ? (আমি বুঝতে পারি হাস্কেল রেফারেন্স দিয়ে চলে গেছে যদিও আমি নিশ্চিত নই)।


5
void acceptEntireProgrammingLanguageByValue(C++);
টমাস এডিং

4
এটা আরো খারাপ হতে পারতো. কিছু পুরানো ভাষাও নাম দিয়ে কল করার
হুগমগ

25
আসলে, সি তে আপনি রেফারেন্স দিয়ে পাস করতে পারবেন না। আপনি মান দ্বারা একটি পয়েন্টার পাস করতে পারেন , যা পাস-বাই-রেফারেন্সের সাথে খুব মিল, তবে একই জিনিস নয়। সি ++ তে, আপনি রেফারেন্স দিয়ে পাস করতে পারেন।
ম্যাসন হুইলারের

@ ম্যাসন হুইলারের আপনি আরও বিশদ বর্ণনা করতে পারেন বা কিছু লিঙ্ক যুক্ত করতে পারেন, আপনার বক্তব্যটি স্পষ্ট নয় কারণ আমি সি / সি ++ গুরু নই, কেবল একজন নিয়মিত প্রোগ্রামার, ধন্যবাদ
বেটলিস্টা

1
@Betlista: রেফারেন্স দ্বারা পাসের সাথে, আপনি একটি swap 'র রুটিন যে ভালো দেখায় লিখতে পারেন temp := a; a := b; b := temp;আর যখন ফিরে আসে, তবে মান aএবং bঅদলবদল করা হবে না। সি তে করার উপায় নেই; আপনি পয়েন্টার পাস করতে হবে aএবং bএবং swapরুটিন মান তারা নির্দেশ কাজ করার জন্য আছে।
ম্যাসন হুইলারের

উত্তর:


58

মান দ্বারা পাস প্রায়শই রেফারেন্স দ্বারা পাসের চেয়ে নিরাপদ, কারণ আপনি ঘটনাক্রমে আপনার পদ্ধতি / ফাংশনে পরামিতিগুলি পরিবর্তন করতে পারবেন না। এটি ভাষাটি ব্যবহার করতে সহজতর করে তোলে, যেহেতু আপনাকে কোনও ক্রিয়াকলাপে যে ভেরিয়েবলগুলি দেওয়া হয় সে সম্পর্কে আপনাকে চিন্তা করতে হবে না। আপনি জানেন যে তাদের পরিবর্তন করা হবে না, এবং এটি প্রায়শই আপনি প্রত্যাশা করেন

তবে, আপনি যদি প্যারামিটারগুলি সংশোধন করতে চান তবে এটি পরিষ্কার করার জন্য আপনার কিছু স্পষ্ট ক্রিয়নের প্রয়োজন (পয়েন্টারে পাস করুন)। এটি আপনার সমস্ত কলকারীকে কলকে কিছুটা আলাদাভাবে বাধ্য করতে বাধ্য করবে ( &variable, সি তে) এবং এটি স্পষ্ট করে দেয় যে ভেরিয়েবল প্যারামিটার পরিবর্তন করা যেতে পারে।

সুতরাং এখন আপনি ধরে নিতে পারেন যে কোনও ফাংশন আপনার পরিবর্তনশীল পরামিতি পরিবর্তন করবে না, যদি না এটি স্পষ্টভাবে এটি করার জন্য চিহ্নিত করা হয় (আপনাকে একটি পয়েন্টারে পাস করার প্রয়োজনের দ্বারা)। এটি বিকল্পের চেয়ে নিরাপদ এবং ক্লিনার সমাধান: ধরে নিন যে তারা আপনার পরামিতিগুলিকে পরিবর্তন করতে পারে, যদি না তারা নির্দিষ্ট করে বলে যে তারা না পারে।


4
পয়েন্টারগুলিতে ক্ষয়িষ্ণু +1 অ্যারে একটি উল্লেখযোগ্য ব্যতিক্রম উপস্থাপন করে তবে সামগ্রিক ব্যাখ্যাটি ভাল।
ডেসব্লিংকনলাইট

6
@ ড্যাসব্লিংকনলাইট: অ্যারেগুলি সি-তে একটি ঘা হয়ে উঠেছে জায়গা :(
ম্যাথিউ এম।

55

কল-বাই-ভ্যালু এবং কল-বাই-রেফারেন্স এমন বাস্তবায়ন কৌশল যা বহুদিন আগে প্যারামিটার-পাসিং মোডগুলির জন্য ভুল হয়েছিল।

শুরুতে, ফরটারন ছিল। ফরট্রানের কেবলমাত্র কল বাই রেফারেন্স ছিল, যেহেতু সাবরুটাইনগুলি তাদের প্যারামিটারগুলি সংশোধন করতে সক্ষম হয়েছিল এবং একাধিক প্যারামিটার-পাসিং মোডগুলিকে অনুমতি দেওয়ার জন্য কম্পিউটিং চক্রগুলি খুব ব্যয়বহুল ছিল, এবং যখন ফরটারনের প্রথম সংজ্ঞা দেওয়া হয়েছিল তখন প্রোগ্রামিং সম্পর্কে যথেষ্ট জানা ছিল না।

ALGOL কল-বাই-নাম এবং কল-বাই-মান নিয়ে আসে। কল-বাই-ভ্যালু এমন জিনিসের জন্য যা পরিবর্তন করার কথা ছিল না (ইনপুট পরামিতি)। কল-বাই-নাম আউটপুট পরামিতিগুলির জন্য ছিল। কল-বাই-নামটি একটি প্রধান ক্রক হিসাবে দেখা গেছে এবং ALGOL 68 এটিকে ফেলে দিয়েছে।

পাস্কাল কল-বাই-মান এবং কল-বাই-রেফারেন্স সরবরাহ করে। প্যারামিটার স্ট্যাকটি ফুঁকতে দেওয়া এড়ানোর জন্য প্রোগ্রামারকে সংকলকটি বলে যে তিনি একটি বৃহত বস্তু (সাধারণত একটি অ্যারে) রেফারেন্স দ্বারা পাস করছেন, তবে কোনও উপায় পরিবর্তিত করা উচিত নয় changed

পাস্কাল ভাষা নকশা অভিধানটিতে পয়েন্টার যুক্ত করেছে।

সি কল-বাই-ভ্যালু সরবরাহ করে এবং মেমরির একটি স্বেচ্ছাসেবী বস্তুটিতে একটি পয়েন্টার ফিরিয়ে দিতে ক্লডজ অপারেটরকে সংজ্ঞায়িত করে কল-বাই-রেফারেন্স দেয়।

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

সি ++ কল-বাই-রেফারেন্স সরবরাহ করতে সি ক্লডজের উপরে একটি ক্লডজ যুক্ত করেছে।

এখন, কল-বাই-মান বনাম কল-বাই-রেফারেন্স বনাম কল-বাই-পয়েন্টার-ক্লডজ, সি এবং সি ++ (প্রোগ্রামারস) এর কনট পয়েন্টার এবং পয়েন্টার সহ কনস্ট (কেবল পঠনযোগ্য) সহ ভয়ঙ্কর মাথাব্যথা রয়েছে অবজেক্ট।

আদা পুরো দুঃস্বপ্নটি এড়াতে সক্ষম হয়েছিল।

আদার স্পষ্ট কল-বাই-মান বনাম কল-বাই-রেফারেন্স নেই। পরিবর্তে, অ্যাডা প্যারামিটারে রয়েছে (যা পড়তে পারে তবে লিখিত নাও হতে পারে), পরামিতিগুলি (যা তারা পড়ার আগে লিখতে হবে) এবং আউট প্যারামিটারে, যা কোনও ক্রমে পড়ে এবং লিখিত হতে পারে। সংকলক সিদ্ধান্ত নেয় যে কোনও নির্দিষ্ট পরামিতিটি মান দ্বারা বা রেফারেন্স দ্বারা পাস করা হয়েছে: এটি প্রোগ্রামারের কাছে স্বচ্ছ।


1
+1 টি। আমি এখানে এ পর্যন্ত কেবলমাত্র এটিই দেখেছি যা আসলে প্রশ্নের উত্তর দেয় এবং তা বোঝায় এবং এটি কোনও প্রো-এফপি রেন্টের স্বচ্ছ অজুহাত হিসাবে ব্যবহার করে না।
ম্যাসন হুইলারের

11
+1 এর জন্য "পরবর্তী ভাষাগুলি সি-র অনুলিপি করেছিল, বেশিরভাগ কারণ ডিজাইনাররা আর কিছুই দেখেনি।" প্রতিবার আমি 0-উপসর্গযুক্ত অক্টাল ধ্রুবক সহ একটি নতুন ভাষা দেখি আমি একটু ভিতরেই মরে যাই।
লাইব্রিক

4
এই প্রোগ্রামিং বাইবেলের প্রথম বাক্য হতে পারে: In the beginning, there was FORTRAN

1
এডিএ সম্পর্কিত, যদি কোনও বৈশ্বিক পরিবর্তনশীল একটি ইন / আউট প্যারামিটারে পাস করা হয়, তবে ভাষা কি কোনও নেস্টেড কলটিকে পরীক্ষা বা পরিবর্তন থেকে বিরত রাখতে পারবে? যদি তা না হয় তবে আমি মনে করব / আউট এবং রেফ প্যারামিটারের মধ্যে একটি স্পষ্ট পার্থক্য থাকবে। ব্যক্তিগতভাবে, আমি ভাষাগুলি "ইন / আউট / ইন + ইন" আউট "এবং" মান দ্বারা / রেফ / না-যত্ন "এর সমস্ত সংমিশ্রণকে স্পষ্টভাবে সমর্থন করতে চাই, যাতে প্রোগ্রামাররা তাদের অভিপ্রায় হিসাবে তবে সর্বোচ্চ সংজ্ঞা দিতে পারে তবে অপ্টিমাইজার বাস্তবায়নে সর্বাধিক নমনীয়তা থাকতে পারে [যতক্ষণ না এটি প্রোগ্রামারের অভিপ্রায় নিয়ে জেদী থাকে]।
সুপারক্যাট

2
@ নিউকোস এও আছে যে 0উপসর্গটি অন্যান্য নন-বেস দশ উপসর্গের সাথে সঙ্গতিপূর্ণ নয়। এটি সি (এবং বেশিরভাগ উত্স-সামঞ্জস্যপূর্ণ ভাষাগুলি, যেমন সি ++, উদ্দেশ্য সি) তে কিছুটা অজুহাত হতে পারে, যদি অষ্টালটি চালু করার সময় একমাত্র বিকল্প বেস ছিল , তবে যখন আরও আধুনিক ভাষা দুটি 0xএবং 0শুরু থেকেই উভয় ব্যবহার করে , তখন এটি কেবল তাদের খারাপ দেখায় না চিন্তা।
বিট্রি

13

রেফারেন্স দ্বারা পাস খুব সূক্ষ্ম অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়াগুলির জন্য অনুমতি দেয় যা যখন অনিচ্ছাকৃত আচরণের কারণ হতে শুরু করে তখন এটি সনাক্ত করা অসম্ভবের পাশে খুব কঠিন।

মান পাশ, বিশেষ করে final, staticবা constইনপুট প্যারামিটার এই সমগ্র ক্লাসের বাগ অদৃশ্য করে তোলে।

অপরিবর্তনীয় ভাষাগুলি আরও নিরঙ্কুশ এবং সহজতর এবং কী কী ঘটছে এবং কোন ফাংশন থেকে বেরিয়ে আসবে বলে আশা করা যায় তা বোঝা এবং বোঝা সহজ।


7
এটি 'প্রাচীন' ভিবি কোডটি ডিবাগ করার চেষ্টা করার পরে আপনি সেই জিনিসগুলির মধ্যে একটি খুঁজে পেয়েছেন যেখানে ডিফল্ট হিসাবে সবকিছুই রেফারেন্স অনুসারে থাকে।
jfrankcarr

সম্ভবত এটি আমার পটভূমিটি ভিন্ন, তবে আপনি কীভাবে বলছেন যে "খুব সূক্ষ্ম অযৌক্তিক পার্শ্ব প্রতিক্রিয়া যা আপনি খুঁজে বের করতে অসম্ভবের পাশে খুব কঠিন" আপনি কী সম্পর্কে কথা বলছেন। আমি পাস্কেলে অভ্যস্ত, যেখানে বাই-ভ্যালুটি ডিফল্ট তবে বাই-রেফারেন্সটি স্পষ্টভাবে প্যারামিটারটি চিহ্নিত করে ব্যবহার করা যেতে পারে, (মূলত সি # এর মতো একই মডেল) এবং আমার পক্ষে কখনও সমস্যা হয়নি। আমি দেখতে পাচ্ছি যে এটি কীভাবে "প্রাচীন ভিবি" -তে সমস্যাযুক্ত হবে যেখানে বাই-রেফটি ডিফল্ট হয় তবে যখন বাই-রেফটি অপ্ট-ইন হয়, আপনি এটি লেখার সময় আপনাকে এটি সম্পর্কে ভাবতে বাধ্য করে।
ম্যাসন হুইলারের

4
@ ম্যাসনভিয়েল আপনার সম্পর্কে পিছনে আসে এমন নতুন কি সম্পর্কে এবং কেবল এটি না বুঝে আপনি যা করেছেন তা অনুলিপি করে এবং সেই জায়গাটিকে সমস্ত জায়গায় অপ্রত্যক্ষভাবে হেরফের করা শুরু করে, বাস্তব পৃথিবী সর্বদা ঘটে happens কম ইন্ডিরিয়েশন করা ভাল জিনিস। অপরিবর্তনীয় সেরা।

1
@ ম্যাসনওহিলার হ'ল Swapহ্যাকের মতো সাধারণ উরফ উদাহরণগুলি যেমন নিজেরাই সমস্যা হওয়ার সম্ভাবনা নাও দেখায়, তবুও আরও জটিল উদাহরণটি ডিবাগ করতে কতটা কঠিন হতে পারে তা দেখান।
মার্ক হার্ট

1
@ মেসনওহিলার: ফরট্রানের ক্লাসিক উদাহরণ, যা "ভেরিয়েবলগুলি করবে না; ধ্রুবকগুলি হয় না" এই উক্তিটির দিকে পরিচালিত করে, একটি ফাংশনে 3.0 এর মতো একটি ভাসমান-বিন্দু ধ্রুবকটি পাস করবে যা পাস-ইন প্যারামিটারটি সংশোধন করে। কোনও ফ্লোটিং-পয়েন্ট ধ্রুবক যা কোনও ফাংশনে প্রেরণ করা হয়েছিল তার জন্য সিস্টেম একটি "লুকানো" ভেরিয়েবল তৈরি করবে যা যথাযথ মান দিয়ে আরম্ভ করা হয়েছিল এবং ফাংশনে স্থানান্তরিত হতে পারে। যদি ফাংশনটি তার প্যারামিটারে 1.0 যোগ করে, প্রোগ্রামে 3.0 এর একটি স্বেচ্ছাসেবক সাবসেট হঠাৎ করে 4.0 এর হয়ে উঠতে পারে।
সুপারক্যাট

8

এতগুলি ভাষা কেন মান দ্বারা পাস হয়?

ছোট প্রোগ্রামগুলিকে ছোট ছোট সাব্রুটিনে বিভক্ত করার বিষয়টি হ'ল আপনি সাবউরটাইনগুলি স্বাধীনভাবে যুক্তি করতে পারেন। পাস-রেফারেন্স এই সম্পত্তিটি ভঙ্গ করে। (যেমন ভাগ করে নেওয়ার মতো অবস্থা।)

এমনকি আপনার যেখানে সি এর মতো স্পষ্ট পয়েন্টার ম্যানিপুলেশন রয়েছে সেগুলি সর্বদা মান দ্বারা পাস হয় (আপনি এগুলি রেফারেন্স দিয়ে পাস করতে পারেন তবে এটি ডিফল্ট আচরণ নয়)।

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

এর সুবিধা কী, এতগুলি ভাষা মূল্যবোধ দ্বারা কেন পাস হয় এবং অন্যরা কেন রেফারেন্স দিয়ে পাস হয় ?

পাস-বাই-রেফারেন্স ব্যবহারের দুটি প্রধান কারণ রয়েছে:

  1. একাধিক রিটার্ন মান অনুকরণ
  2. দক্ষতা

ব্যক্তিগতভাবে, আমি # 1 বোগাস বলে মনে করি: এটি প্রায়শই খারাপ এপিআই এবং / অথবা ভাষা ডিজাইনের জন্য একটি অজুহাত:

  1. আপনার যদি একাধিক রিটার্ন মান প্রয়োজন হয় তবে সেগুলি অনুকরণ করবেন না, কেবল একটি ভাষা ব্যবহার করুন যা তাদের সমর্থন করে।
  2. আপনি বেশ কয়েকটি হালকা ডেটা স্ট্রাকচার যেমন একটি টিউপলের মধ্যে প্যাকেজ করে একাধিক রিটার্ন মানগুলি অনুকরণ করতে পারেন। ভাষা বিশেষভাবে ভাল কাজ করে যদি ভাষা প্যাটার্ন মেলানো বা ডেস্ট্রাকচার বাইন্ড সমর্থন করে। যেমন রুবি:

    def foo
      # This is actually just a single return value, an array: [1, 2, 3]
      return 1, 2, 3
    end
    
    # Ruby supports destructuring bind for arrays: a, b, c = [1, 2, 3]
    one, two, three = foo
    
  3. প্রায়শই আপনার একাধিক রিটার্ন মান প্রয়োজন হয় না। উদাহরণস্বরূপ, একটি জনপ্রিয় প্যাটার্ন হ'ল সাবরুটাইন একটি ত্রুটি কোড দেয় এবং প্রকৃত ফলাফলটি আবার রেফারেন্সের মাধ্যমে আবার লেখা হয়। পরিবর্তে, ত্রুটিটি অপ্রত্যাশিত হলে আপনাকে কেবল একটি ব্যতিক্রম ছুঁড়ে ফেলা উচিত বা Either<Exception, T>ত্রুটিটি প্রত্যাশিত হলে প্রত্যাবর্তন করা উচিত । আর একটি প্যাটার্ন হ'ল একটি বুলিয়ান ফিরিয়ে দেওয়া যা জানায় যে অপারেশনটি সফল হয়েছিল কিনা এবং রেফারেন্সের মাধ্যমে আসল ফলাফলটি ফিরে আসবে। আবার, ব্যর্থতা যদি অপ্রত্যাশিত হয় তবে এর পরিবর্তে আপনার একটি ব্যতিক্রম ছুঁড়ে ফেলা উচিত, যদি ব্যর্থতাটি প্রত্যাশিত হয়, উদাহরণস্বরূপ কোনও অভিধানে কোনও মূল্য সন্ধান করার সময় আপনার Maybe<T>পরিবর্তে তার ফিরে আসা উচিত ।

পাস-বাই-রেফারেন্স পাস-বাই-মানের চেয়ে আরও কার্যকর হতে পারে, কারণ আপনাকে মানটি অনুলিপি করতে হবে না।

(আমি বুঝতে পারি হাস্কেল রেফারেন্স দিয়ে চলে গেছে যদিও আমি নিশ্চিত নই)।

না, হাস্কেল পাস-রেফারেন্স নয়। তেমনি এটি পাস-বাই-ভ্যালুও নয়। পাস-বাই-রেফারেন্স এবং পাস-বাই-মান উভয়ই কঠোর মূল্যায়ন কৌশল, তবে হাস্কেল অ-কঠোর।

আসলে, হ্যাসেল স্পেসিফিকেশন কোনও নির্দিষ্ট মূল্যায়ন কৌশল নির্দিষ্ট করে না । বেশিরভাগ হ্যাকেল বাস্তবায়ন কল-বাই-নাম এবং কল-বাই-প্রয়োজনের (মেমোয়েজেশনের মাধ্যমে কল-বাই-নামের একটি বৈকল্পিক) মিশ্রণ ব্যবহার করে তবে মানক এটিকে নির্দেশ দেয় না।

মনে রাখবেন যে কঠোর ভাষাগুলির জন্যও, ক্রিয়াকলাপী ভাষাগুলির জন্য পাস-বাই-রেফারেন্স বা পাস-বাই-ভ্যালুর মধ্যে পার্থক্য করা বোধগম্য নয় কারণ আপনি উল্লেখটি পরিবর্তন করলেই তাদের মধ্যে পার্থক্য কেবল লক্ষ্য করা যায়। অতএব, বাস্তবায়নকারী ভাষাটির শব্দার্থবিজ্ঞানগুলি ভঙ্গ না করে উভয়ের মধ্যে চয়ন করতে পারেন।


9
"আপনার যদি একাধিক রিটার্ন মান প্রয়োজন হয় তবে সেগুলি অনুকরণ করবেন না, কেবল একটি ভাষা ব্যবহার করুন যা তাদের সমর্থন করে" " এটা বলতে গেলে কিছুটা অদ্ভুত বিষয়। এটি মূলত বলছে "আপনার ভাষা সবকিছু আপনি প্রয়োজন করতে পারেন, তবে কিন্তু এক বৈশিষ্ট্য যা আপনাকে সম্ভবত আপনার কোডের কম 1% এর মধ্যে হবে - কিন্তু আপনি এখনও হবে যে 1% জন্য এটি প্রয়োজন - মধ্যে সম্পন্ন করা যাবে না একটি বিশেষভাবে পরিষ্কার উপায়, তবে আপনার ভাষা আপনার প্রকল্পের পক্ষে যথেষ্ট ভাল নয় এবং আপনার পুরো জিনিসটি অন্য ভাষায় আবার লিখতে হবে। " দুঃখিত, তবে এটি কেবল সাধারণ হাস্যকর।
ম্যাসন হুইলারের

+1 আমি এই পয়েন্টের সাথে পুরোপুরি একমত, ছোট ছোট সাব্রুটাইনগুলিতে বড় প্রোগ্রামগুলি ভাঙ্গার বিষয়টি হ'ল আপনি সাবউরটাইনগুলি স্বাধীনভাবে যুক্তি করতে পারেন। পাস-রেফারেন্স এই সম্পত্তিটি ভঙ্গ করে। (যেমনটি ভাগ করে নেওয়ার মতো অবস্থা))
রুমি

3

ভাষার কলিং মডেল, আর্গুমেন্টের ধরণ এবং ভাষার মেমরির মডেলগুলির উপর নির্ভর করে বিভিন্ন আচরণ রয়েছে।

সাধারণ নেটিভ প্রকারের সাথে, মান দ্বারা পাস করা আপনাকে নিবন্ধকদের দ্বারা মানটি পাস করতে দেয়। এটি খুব দ্রুত হতে পারে যেহেতু মানটি মেমরি থেকে লোড করার প্রয়োজন হয় না বা ফিরে সংরক্ষণও করতে পারে না। অনুরূপ অপ্টিমাইজেশনটি কেবল আর্গুমেন্টের কলার অনুলিপিটির সাথে গোলযোগ না করে ঝুঁকি ছাড়াই আর্গুমেন্টের দ্বারা ব্যবহৃত মেমরিটিকে পুনরায় ব্যবহার করেই সম্ভব। যদি যুক্তিটি একটি অস্থায়ী অবজেক্ট হয় তবে আপনি সম্ভবত এটির একটি সম্পূর্ণ অনুলিপি সংরক্ষণ করতে পারবেন (সি ++ 11 নতুন ডান-রেফারেন্স এবং এর পদক্ষেপের অর্থপ্রদানের সাথে এই ধরণের অপ্টিমাইজেশানটিকে আরও স্পষ্ট করে তুলবেন)।

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

কার্যকরী ভাষার ক্ষেত্রে, আমি অনুমান করি মান বা রেফারেন্স দিয়ে পাস করা কেবল অনুকূলিতকরণের প্রশ্ন। যেহেতু এই জাতীয় ভাষায় ফাংশনগুলি খাঁটি এবং পার্শ্ব প্রতিক্রিয়া থেকে মুক্ত তাই গতি ব্যতীত মানটির অনুলিপি করার কোনও কারণ নেই। আমি আরও নিশ্চিত যে এই জাতীয় ভাষা প্রায়শই একই মানের সাথে একই মানের অনুলিপি ভাগ করে নিয়েছিল, এমন একটি সম্ভাবনা কেবল তখনই পাওয়া যায় যখন আপনি পাস (কনস্ট্যান্ট) রেফারেন্স দ্বারা শব্দটি ব্যবহার করে ব্যবহার করেন। পাইথন এছাড়াও এই কৌশলটি পূর্ণসংখ্যার এবং সাধারণ স্ট্রিংগুলির জন্য ব্যবহার করে (যেমন পদ্ধতি এবং শ্রেণীর নাম), ব্যাখ্যা করে যে কেন পাইথনটিতে পূর্ণসংখ্যা এবং স্ট্রিংগুলি ধ্রুবক বস্তু। এটি সামগ্রীর তুলনার পরিবর্তে উদাহরণস্বরূপ পয়েন্টার তুলনা করার অনুমতি দিয়ে এবং কিছু অভ্যন্তরীণ ডেটার অলস মূল্যায়ন করে কোডটি আবারও অনুকূলকরণে সহায়তা করে।


2

আপনি মূল্য দিয়ে একটি অভিব্যক্তি পাস করতে পারেন, এটি স্বাভাবিক। (অস্থায়ী) রেফারেন্স দ্বারা অভিব্যক্তিটি পাস করা হ'ল ... অদ্ভুত।


1
এছাড়াও, অস্থায়ী রেফারেন্স দ্বারা অভিব্যক্তিটি পাস করার ফলে খারাপ বাগগুলি হতে পারে (রাষ্ট্রীয় ভাষায়), যখন আপনি আনন্দের সাথে এটি পরিবর্তন করেছেন (যেহেতু এটি কেবলমাত্র অস্থায়ী) তবে আপনি যখন বাস্তবে কোনও ভেরিয়েবল পাস করেন তখন এটি ব্যাকফায়ার করে এবং আপনাকে পাস করার মতো কুৎসিত কাজ করতে হবে Foo এর পরিবর্তে +0।
হার্বি

2

আপনি যদি রেফারেন্স দিয়ে পাস করেন তবে গ্লোবালগুলির সমস্ত সমস্যা (যথা স্কোপ এবং অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়া) এর সাথে আপনি কার্যকরভাবে সর্বদা বিশ্বব্যাপী মানগুলির সাথে কাজ করছেন।

গ্লোবালের মতো উল্লেখগুলিও মাঝে মাঝে উপকারী তবে এগুলি আপনার প্রথম পছন্দ হওয়া উচিত নয়।


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