অন্যান্য ফাংশনগুলিতে যুক্তি হিসাবে বড় বেনাম ফাংশনগুলি কেন জাভাস্ক্রিপ্টে ব্যাপকভাবে গৃহীত হয়?


27

আমার একটি মতামত রয়েছে (যা আমি নিশ্চিত কিছু লোকের সাথে ভাগ করে নেব) যে বেনামী ফাংশনগুলি কয়েকটি কোডের বেশি লাইন যুক্ত করে, অন্য ফাংশনের সাথে যুক্তি পাঠযোগ্যতা এবং স্ব-ডকুমেন্টেশনকে মারাত্মকভাবে প্রভাবিত করে, যেখানে আমার মনে হয় কারও পক্ষে সম্ভবত একটি নামকৃত ফাংশন ঘোষণা করার জন্য কোডটি ব্যবহার করা আরও ভাল be অথবা কমপক্ষে মূল ফাংশনটি ঘোষণার আগে একটি বেনামে সেই বেনাম ফাংশনটি অর্পণ করুন

তবে, বেশ কয়েকটি উদাহরণ দেওয়ার জন্য অনেক জাভাস্ক্রিপ্ট লাইব্রেরি (jQuery, d3.js / NVD3.js) এই পদ্ধতিতে বৃহত ফাংশন ব্যবহার করুন।

কেন এটি জাভাস্ক্রিপ্টে এত ব্যাপকভাবে গৃহীত? এটি কি একটি সাংস্কৃতিক জিনিস, বা এমন কিছু সুবিধাগুলি রয়েছে যা আমি অনুপস্থিত, যা কোনও নামকৃত কার্যকারিতা ঘোষণার চেয়ে ব্যবহারকে আরও বেশি পছন্দ করে?


1
ক্লোজার ব্যবহারের সাথে এটির অনেক কিছুই থাকতে পারে । এটি বাইরের বিশ্বে প্রকৃত ফাংশনটি প্রকাশ করতে না চাওয়ার সাথেও থাকতে পারে (যার কারণে এটি বেনামে রয়েছে)।
রবার্ট হার্ভে

3
@ রবার্টহার্ভে অন্য কথায়, এটি জাভাস্ক্রিপ্টের জন্য সরকারী এবং ব্যক্তিগত না থাকার পক্ষে কাজ ?
ম্যাসন হুইলার

2
অনেক জায়গায় একটি বৃহত বেনাম ফাংশন একটি ব্লকের মতো আরও পড়ে এবং সাধারণত আপনি অভ্যস্ত হয়ে উঠলে এটি বেশ ভাল লাগে। স্কোপিং বিধি এমনকি ব্লক অনুভূতিকে সমর্থন করে।

5
@ ম্যাসনভিয়েল: এটি আপনার দৃষ্টিভঙ্গির উপর নির্ভর করে। কোনও স্কিম বা ECMAScript প্রোগ্রামার এটি বলতে পারে publicএবং privateএটি সঠিক বন্ধ না হওয়ার জন্য কার্যপ্রণালী।
Jörg ডব্লু মিটাগ

1
@ জার্গডব্লিউমিতাগ হুরাকে র‌্যাকেটের জন্য, এক্সকেসিডি 927
ম্যাসন হুইলারের

উত্তর:


23

তিনটি প্রধান কারণ যা আমি ভাবতে পারি:

  1. প্যারেন্ট স্কোপ অ্যাক্সেস
  2. গোপনীয়তা
  3. উচ্চতর স্কোপে সংজ্ঞায়িত নাম হ্রাস

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

আপনি যদি এই স্কোপের বাইরে সংজ্ঞায়িত কোনও ফাংশনে কোডটি রাখেন এবং তারপরে কোডটি কল করেন, তবে আপনাকে কোনও অভিভাবক অবস্থাটি পাস করতে হবে যা এটি ফাংশনে অ্যাক্সেস করতে চায়।

গোপনীয়তা: একটি ইনলাইন বেনামে সংজ্ঞায়নের কোডটি আরও ব্যক্তিগত এবং অন্য কোড দ্বারা কল করা যায় না।

উচ্চতর স্কোপে সংজ্ঞায়িত নাম হ্রাস: বৈশ্বিক স্কোপগুলিতে পরিচালনা করার সময় এটি সর্বাধিক গুরুত্বপূর্ণ তবে একটি ইনলাইন বেনামে ঘোষণাটি বর্তমান সুযোগে একটি নতুন প্রতীককে সংজ্ঞায়িত করা থেকে বিরত রাখে। যেহেতু জাভাস্ক্রিপ্টের নেটিভস নেমস্পেস ব্যবহারের প্রয়োজন নেই, তাই ন্যূনতম প্রয়োজনের চেয়ে আর কোনও বৈশ্বিক প্রতীক সংজ্ঞায়িত করা এড়ানো বুদ্ধিমানের কাজ।


সম্পাদকীয়: এটি জাভাস্ক্রিপ্টে একটি সাংস্কৃতিক জিনিস হয়ে উঠেছে বলে মনে হয় যেখানে কোনও নাম বেনামে ইনলাইন ঘোষণাকে কোনও ফাংশন সংজ্ঞায়িত করার এবং পিতামাতার স্কোপ অ্যাক্সেস ব্যবহার না করা সত্ত্বেও কল করার চেয়ে কোনওভাবে "ভাল" হিসাবে বিবেচিত হয়। আমার সন্দেহ হয় এটি প্রাথমিকভাবে জাভাস্ক্রিপ্টে বিশ্বব্যাপী নেমস্পেস দূষণ সমস্যার কারণে হয়েছিল, তারপরে সম্ভবত গোপনীয়তার কারণে issues তবে এটি এখন কিছুটা সাংস্কৃতিক জিনিসে রূপান্তরিত হয়েছে এবং আপনি এটি প্রচুর সংখ্যক জনসমাজে প্রকাশিত দেখতে পাবেন (যেমন আপনি উল্লেখ করেছেন) like

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


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

8

বেনামে ফাংশনগুলি জাভাস্ক্রিপ্টে বেশিরভাগ ভাষাগুলির চেয়ে অনেক বেশি উদ্দেশ্যে ব্যবহৃত হয়।

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

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

একটি চূড়ান্ত কারণ ইভেন্ট-ভিত্তিক প্রোগ্রামিং হ'ল জাভাস্ক্রিপ্টে সাধারণ যা একটি অজান্তেই ধারাবাহিকতা-পাসিং শৈলী কোডের দিকে ঝোঁক। আপনি একটি এএএএক্সএক্স কল করেন এবং একটি কলব্যাকটি নিবন্ধভুক্ত করেন যা কার্যকর করা হলে, অন্য একটি এএএএক্সএক্স কল করবে এবং একটি কলব্যাক রেজিস্টার করবে If । আবার, আমি সন্দেহ করি যে আপনি কোনও ফাংশনে স্ট্রেইট লাইন কোডের কয়েকটি লাইন বিমূর্ত করবেন।

সংস্কৃতিগত কারণগুলিও রয়েছে এবং উপরের কারণে অন্যদের মধ্যেও বেনামে ফাংশন অন্যান্য অনেক ভাষার চেয়ে জাভাস্ক্রিপ্টে অনেক বেশি সাধারণ এবং অন্যান্য ভাষার চেয়ে স্বাচ্ছন্দ্যে / শিথিলভাবে ব্যবহৃত হয়।


আমার নিজের, সম্ভবত সি ++ কোডিংয়ের নির্মল স্ট্রাকচারগুলি মাঝে মাঝে স্টাড :: ফাংশন এবং ল্যাম্বডাসের মাধ্যমে জাভাস্ক্রিপ্ট থেকে ইভেন্ট-ভিত্তিক কোডিং এবং কলব্যাকের নীতি গ্রহণ করেছে। আমার ক্ষেত্রে এটি আংশিক কারণ আমি সি ++ তে ইউআই কোড করছি এবং ব্লকিং অপারেশন করতে চাই না। আমি আগ্রহী যদি জাভাস্ক্রিপ্টের অনুশীলনগুলি ভাষাগুলি যতক্ষণ ভাল সমর্থন করে ততক্ষণ কারও পক্ষে কেবল কার্যকর useful
Katana314
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.