একটি ইভেন্ট হ'ল সাম্প্রতিক অতীতের ঘটনাগুলি বর্ণনা করার জন্য একটি বিজ্ঞপ্তি।
ইভেন্ট-চালিত সিস্টেমের একটি সাধারণ প্রয়োগ একটি ইভেন্ট প্রেরক এবং হ্যান্ডলার ফাংশন (বা গ্রাহক ) ব্যবহার করে। প্রেরণকারী ইভেন্টগুলি (jQuery এর bind) পর্যন্ত ওয়্যার হ্যান্ডলারের জন্য একটি এপিআই এবং তার গ্রাহকদের ( triggerjQuery এ) ইভেন্ট প্রকাশের একটি পদ্ধতি সরবরাহ করে । আপনি যখন আইও বা ইউআই ইভেন্টগুলির বিষয়ে কথা বলছেন তখন সাধারণত একটি ইভেন্ট লুপ থাকে যা মাউস-ক্লিকগুলির মতো নতুন ইভেন্টগুলি সনাক্ত করে এবং প্রেরণকারীর কাছে প্রেরণ করে। জেএস-ল্যান্ডে, প্রেরণকারী এবং ইভেন্ট লুপ ব্রাউজার দ্বারা সরবরাহ করা হয়।
কোডের জন্য যা ব্যবহারকারীদের সাথে সরাসরি ইন্টারেক্ট করে - কী-চাপগুলি এবং ক্লিকগুলিতে প্রতিক্রিয়া জানায় - ইভেন্ট-চালিত প্রোগ্রামিং (বা এর বিভিন্নতা যেমন কার্যকরী প্রতিক্রিয়াশীল প্রোগ্রামিং ) প্রায় অনিবার্য। আপনার, প্রোগ্রামারটি, ব্যবহারকারী কখন বা কোথায় ক্লিক করবে সে সম্পর্কে কোনও ধারণা নেই, তাই এটির ইভেন্ট লুপে ব্যবহারকারীর ক্রিয়া সনাক্ত করতে এবং আপনার কোডটি জানানোর জন্য এটি জিইউআই ফ্রেমওয়ার্ক বা ব্রাউজারের নীচে নেমে এসেছে। নেটওয়ার্কিং অ্যাপ্লিকেশনগুলিতে (সিএফ নোডজেএস) এই ধরণের অবকাঠামো ব্যবহার করা হয়।
আপনার উদাহরণ, যেখানে আপনি সরাসরি কোনও ফাংশন কল করার চেয়ে আপনার কোডে কোনও ইভেন্ট উত্থাপন করেন তার আরও কিছু আকর্ষণীয় ট্রেড অফ রয়েছে যা আমি নীচে আলোচনা করব। মূল পার্থক্য হ'ল কোনও ইভেন্টের প্রকাশক ( makeItSnow) কলটির রিসিভার নির্দিষ্ট করে না; এটি অন্য কোথাও ওয়্যার্ড হয়েছে ( bindআপনার উদাহরণে কলটিতে )। এটিকে ফায়ার-অ্যান্ড ভুলে বলা হয় : makeItSnowবিশ্বকে ঘোষণা দিচ্ছে যে তুষারপাত হচ্ছে, তবে কে শুনছে, এরপরে কী ঘটবে বা কখন এটি ঘটে - তার কোনও গুরুত্ব নেই it
সুতরাং ইভেন্ট-চালিত পন্থাটি রিসিভারের কাছ থেকে বার্তা প্রেরককে হতাশ করে। এটি আপনাকে দেয় এমন একটি সুবিধা হ'ল কোনও প্রদত্ত ইভেন্টের একাধিক হ্যান্ডলার থাকতে পারে। gritRoadsবিদ্যমান shovelSnowহ্যান্ডলারটিকে প্রভাবিত না করে আপনি আপনার তুষার ইভেন্টে কোনও ফাংশন বাঁধতে পারেন । আপনার অ্যাপ্লিকেশনটি ওয়্যার্ড করার পদ্ধতিতে আপনার নমনীয়তা রয়েছে; কোনও আচরণ বন্ধ করতে আপনার আচরণের bindসমস্ত উদাহরণ খুঁজে পাওয়ার জন্য কোডটি সন্ধান করার চেয়ে কলটি সরিয়ে ফেলতে হবে।
ইভেন্ট-চালিত প্রোগ্রামিংয়ের আরেকটি সুবিধা হ'ল এটি আপনাকে কোথাও ক্রস-কাটিংয়ের উদ্বেগ প্রকাশ করতে দেয়। ইভেন্ট প্রেরণকারী মধ্যস্থতার ভূমিকা পালন করে এবং কিছু লাইব্রেরি (যেমন ব্রাইটার ) একটি পাইপলাইন ব্যবহার করে যাতে আপনি সহজেই লগিং বা মানের-অফ-পরিষেবার মতো জেনেরিক প্রয়োজনীয়তাগুলি প্লাগ-ইন করতে পারেন।
সম্পূর্ণ প্রকাশ: উজ্জ্বলটি হডল, যেখানে আমি কাজ করি সেখানে উন্নত।
গ্রহীতার কাছ থেকে কোনও ইভেন্ট প্রেরককে হতাশ করার তৃতীয় সুবিধা হ'ল এটি আপনি যখন ইভেন্টটি পরিচালনা করেন তখন এটি আপনাকে নমনীয়তা দেয় । আপনি প্রতিটি ধরণের ইভেন্টটিকে তার নিজস্ব থ্রেডে প্রক্রিয়া করতে পারেন (যদি আপনার ইভেন্ট প্রেরণকারী এটি সমর্থন করে), বা আপনি উত্থাপিত ইভেন্টগুলি একটি বার্তা ব্রোকার যেমন র্যাবিটএমকিউতে রাখতে পারেন এবং এগুলিকে একটি অ্যাসিনক্রোনাস প্রক্রিয়া সহ পরিচালনা করতে পারেন বা এমনকি রাতারাতি তাদের প্রচুর পরিমাণে প্রক্রিয়া করতে পারেন। ইভেন্টটির গ্রহণকারী একটি পৃথক প্রক্রিয়া বা একটি পৃথক মেশিনে থাকতে পারে। আপনাকে কোডটি পরিবর্তন করতে হবে না যা ঘটনাকে উত্থাপন করে এটি করার জন্য! এটি "মাইক্রোসার্চিস" আর্কিটেকচারের পিছনে বিগ আইডিয়া: স্বায়ত্তশাসিত পরিষেবাগুলি অ্যাপ্লিকেশনটির মেরুদণ্ড হিসাবে মেসেজিং মিডলওয়্যারের সাথে ইভেন্টগুলি ব্যবহার করে যোগাযোগ করে।
ইভেন্ট-চালিত শৈলীর পরিবর্তে পৃথক উদাহরণের জন্য, ডোমেন-চালিত ডিজাইনের দিকে নজর দিন, যেখানে ডোমেন ইভেন্টগুলি পৃথক করে আলাদা রাখতে সহায়তা করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, একটি অনলাইন স্টোর বিবেচনা করুন যা আপনার ক্রয়ের ইতিহাসের ভিত্তিতে পণ্যগুলির প্রস্তাব দেয়। একজন Customerতার ক্রয়ের ইতিহাস আপডেট করেছি যখন একটি প্রয়োজন ShoppingCartজন্য অর্থ প্রদান করা হয়। ShoppingCartসমষ্টিগত অবহিত পারে Customerএকটি উত্থাপন দ্বারা CheckoutCompletedঘটনা; The Customerইভেন্টে প্রতিক্রিয়ায় একটি পৃথক লেনদেনে আপডেট হবে।
এই ইভেন্টটি চালিত মডেলের মূল ক্ষতি হচ্ছে ইন্ডিয়ারেশন। ইভেন্টটি পরিচালনা করে এমন কোডগুলি পাওয়া এখন আরও শক্ত কারণ আপনি নিজের আইডিই ব্যবহার করে এটিতে নেভিগেট করতে পারবেন না; ইভেন্টটি কনফিগারেশনের সাথে আবদ্ধ এবং আপনাকে আশা করতে হবে যে আপনি সমস্ত হ্যান্ডলার খুঁজে পেয়েছেন। আপনার মাথায় যে কোনও সময় রাখার জন্য আরও জিনিস রয়েছে। কোড শৈলী কনভেনশনগুলি এখানে সহায়তা করতে পারে (উদাহরণস্বরূপ, সমস্ত কলকে bindএকটি ফাইলে রেখে দেওয়া)। আপনার বিচক্ষণতার স্বার্থে, কেবলমাত্র একটি ইভেন্ট প্রেরক ব্যবহার করা এবং এটি ধারাবাহিকভাবে ব্যবহার করা গুরুত্বপূর্ণ।
আর একটি অসুবিধা হ'ল ইভেন্ট রিফ্যাক্টর করা শক্ত। আপনার যদি কোনও ইভেন্টের ফর্ম্যাট পরিবর্তন করতে হয় তবে আপনাকে সমস্ত রিসিভার পরিবর্তন করতে হবে। কোনও ইভেন্টের গ্রাহকরা বিভিন্ন মেশিনে থাকলে এটি আরও বেড়ে যায়, কারণ এখন আপনাকে সফ্টওয়্যার প্রকাশগুলি সিঙ্ক্রোনাইজ করতে হবে!
নির্দিষ্ট পরিস্থিতিতে, কর্মক্ষমতা একটি উদ্বেগ হতে পারে। কোনও বার্তা প্রক্রিয়া করার সময়, প্রেরককে তা করতে হবে:
- কিছু ডেটা স্ট্রাকচারে সঠিক হ্যান্ডলারগুলি সন্ধান করুন।
- প্রতিটি হ্যান্ডলারের জন্য একটি বার্তা প্রক্রিয়াকরণ পাইপলাইন তৈরি করুন। এটি মেমরির বরাদ্দগুলির একটি গুচ্ছ জড়িত থাকতে পারে।
- ডায়নামিকভাবে হ্যান্ডলারগুলিকে কল করুন (ভাষাটির প্রয়োজন হলে সম্ভবত প্রতিচ্ছবি ব্যবহার করে)।
এটি অবশ্যই নিয়মিত ফাংশন কলের চেয়ে ধীর গতির, যার মধ্যে কেবল স্ট্যাকের উপরে একটি নতুন ফ্রেম চাপানো অন্তর্ভুক্ত। যাইহোক, ইভেন্ট-চালিত আর্কিটেকচার আপনাকে যে নমনীয়তা দেয় তা ধীর কোডটি বিচ্ছিন্ন ও অনুকূলিতকরণকে আরও সহজ করে তোলে। অ্যাসিক্রোনাস প্রসেসরের কাছে কাজ জমা দেওয়ার দক্ষতা থাকা এখানে একটি বড় জয়, কারণ এটি ব্যাকগ্রাউন্ডে কঠোর পরিশ্রমের সাথে মোকাবেলা করার সাথে সাথে আপনাকে অনুরোধটি তাত্ক্ষণিকভাবে সরবরাহ করতে দেয়। যে কোনও ক্ষেত্রে, আপনি যদি স্ক্রিনের সাথে ডিবি বা স্ট্রিং স্টাফের সাথে ইন্টারঅ্যাক্ট করছেন তবে আইওয়ের ব্যয়গুলি কোনও বার্তা প্রক্রিয়াকরণের ব্যয়কে পুরোপুরি সোয়াম করে দেবে। এটি অকাল অপটিমাইজেশন এড়ানোর একটি মামলা।
সংক্ষেপে, ইভেন্টগুলি আলগাভাবে মিলিত সফ্টওয়্যার তৈরির দুর্দান্ত উপায়, তবে সেগুলি ব্যয় ছাড়া হয় না। উদাহরণস্বরূপ, আপনার অ্যাপ্লিকেশনের প্রতিটি ফাংশন কলকে ইভেন্টের সাথে প্রতিস্থাপন করা এটি একটি ভুল হবে । অর্থবহ স্থাপত্য বিভাগ তৈরি করতে ইভেন্টগুলি ব্যবহার করুন।
$(document).bind('snow', shovelShow)। এটি কোনও বেনামি ফাংশনে মোড়ানোর দরকার নেই।