ইভেন্ট-চালিত প্রোগ্রামিং: এটির মূল্য কখন?


19

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

আমি একটি ছোট অ্যাপ্লিকেশন বিকাশ করছি। এটি একটি সহজ অ্যাপ্লিকেশন, এবং বেশিরভাগ অংশের জন্য এর কার্যকারিতাটি বেসিক সিআরইউডি।

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

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

এক্ষেত্রে সেরা পন্থাটি কী?


2
আমি বলব যে কোনও কিছুই নিজেকে বাস্তবায়ন করবেন না - কেবল একটি বিদ্যমান ইভেন্ট বাস ব্যবহার করুন। এটি জীবনকে আরও সরল করে তুলবে ...
বোরিস স্পাইডার

ইভেন্ট চালিত প্রোগ্রামিং সহজাতভাবে অ্যাসিনক্রোনাস। ইভেন্টগুলি আপনার ক্রম অনুসারে বা অন্য কোনও অর্ডারে বা নাও ঘটতে পারে। যদি আপনি অতিরিক্ত জটিলতা মোকাবেলা করতে পারেন তবে এর জন্য যান।
পিটার বি

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

সেখানে হয় ঘটনা-চালিত এবং ইভেন্ট ভিত্তিক মধ্যে একটি পার্থক্য। উদাহরণস্বরূপ দেখুন উচ্চ চিন্তিত-উদ্দীপক। নেট টেপ ফাইজেনের সাথে নেট রকস পডকাস্ট পর্ব 355 , টেড ফাইজন ইভেন্টগুলিকে সীমাবদ্ধ করে! ( সরাসরি ডাউনলোড URL ) এবং ইভেন্ট-ভিত্তিক প্রোগ্রামিং বই : ইভেন্টগুলিকে সীমাবদ্ধ করে তোলা
পিটার মর্টেনসেন

টেড ফাইজনের সাথে সাক্ষাত্কারটি 13 মিনিট 10 সেকেন্ডে শুরু হয়।
পিটার মর্টেনসেন

উত্তর:


31

KISS নীতি অনুসরণ করুন: এটি সরল, বোকা বা YAGNI নীতিটি রাখুন: আপনি এটির প্রয়োজন হয় না।

আপনি কোডটি লিখতে পারেন:

void updateSpecialData() {
    // do the update.
    backupData();
}

অথবা আপনি কোড লিখতে পারেন:

void updateSpecialData() {
     // do the update.
     emit SpecialDataUpdated();
}

void SpecialDataUpdatedHandler() {
     backupData();
}

void configureEventHandlers() {
     connect(SpecialDataUpdate, SpecialDataUpdatedHandler);
}

অন্যথায় না করার বাধ্যতামূলক কারণের অভাবে, সহজ রুটটি অনুসরণ করুন। ইভেন্ট হ্যান্ডলিংয়ের মতো কৌশলগুলি শক্তিশালী তবে তারা আপনার কোডের জটিলতা বাড়িয়ে তোলে। এটি কাজ করার জন্য আরও কোড প্রয়োজন এবং এটি আপনার কোডগুলিতে যা ঘটে তা অনুসরণ করা আরও শক্ত করে তোলে।

ইভেন্টগুলি যথাযথ পরিস্থিতিতে অত্যন্ত সমালোচিত (ইভেন্টগুলি ছাড়াই ইউআই প্রোগ্রামিং করার চেষ্টা করার কথা কল্পনা করুন!) তবে আপনি যখন KISS বা YAGNI করতে পারেন তখন সেগুলি ব্যবহার করবেন না।


আমি বিশেষতঃ সত্যটি পছন্দ করি যে আপনি উল্লেখ করেছেন যে ডেটা পরিবর্তিত হওয়ার পরে গুলি চালানোর ঘটনাগুলি তুচ্ছ নয়।
NoChance

13

আপনি একটি সহজ ডেটা বর্ণনা করেছেন এমন উদাহরণ, যেখানে পরিবর্তনটি কিছুটা কার্যকর করে তা পর্যবেক্ষক ডিজাইন প্যাটার্নের সাথে নিখুঁতভাবে প্রয়োগ করা যেতে পারে :

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

ইভেন্ট পরিচালিত পদ্ধতিটি আরও জটিল পরিস্থিতিতে তার বিনিয়োগের উপযুক্ত, যখন অনেকগুলি থেকে বহু প্রসঙ্গে অনেকগুলি পৃথক মিথস্ক্রিয়া ঘটতে পারে, বা যদি চেইন প্রতিক্রিয়াগুলি কল্পনা করা হয় (উদাহরণস্বরূপ কোনও বিষয় পর্যবেক্ষককে অবহিত করে, যা কিছু ক্ষেত্রে পরিবর্তন করতে চায় বিষয় বা অন্যান্য বিষয়)


1
আমি বিভ্রান্ত হয়ে পড়েছি, পর্যবেক্ষকরা কি ইভেন্টগুলি বাস্তবায়নের এক উপায় নয়?
সুইভ

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

5

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

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

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

এটি একটি ছোট অ্যাপ্লিকেশন সার্থক? আমি অবশ্যই হ্যাঁ বলব ।

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

আপনি যদি ভাবছেন "ওহ তবে এটি সত্যিই কেবলমাত্র একটি খুব ছোট অ্যাপ্লিকেশন, এটি আসলে এতটা গুরুত্বপূর্ণ নয়" বিবেচনা করুন:

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

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

প্রকৃতপক্ষে, বিচ্ছিন্নভাবে আপনার looseিলে .ালা-দম্পতি শ্রেণীর পরীক্ষার ইউনিটে সময় সাশ্রয় করা উচিত সেই ক্লাসগুলি ডিক্লুপিংয়ে ব্যয় করা কোনও অতিরিক্ত সময়কে পাল্টে ভারসাম্যপূর্ণ করা উচিত।


2

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

ফলস্বরূপ কোডটি সরাসরি ফাইল-উত্পন্নকারী কোডটি কল করার চেয়ে কেবলমাত্র ন্যূনতম জটিল হবে, তবে সম্পর্কযুক্ত উপাদানগুলির টান সংযোগের ত্রুটিগুলি ছাড়াই।

"YAGNI" এর জন্য ডিকম্পলিংয়ের ত্যাগ ছাড়াই এটি আপনাকে "উভয় বিশ্বের সেরা" বয়ে আনবে।


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

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

একটি নিখুঁত বিবৃতি, তবে এটি আমার কাছে ভাঙা জানালা বলে মনে হচ্ছে।
রাবারডাক

2
@ রাবারডাক: একজন প্রকাশক / গ্রাহক যান্ত্রিক "কেবলমাত্র" এর সাথে একটি সম্পূর্ণ পর্যবেক্ষক যুক্ত করুন, যখন সত্যই এটির প্রয়োজন হয় না, তখন আমার মনে হয় অতিরিক্ত কাজ করার মতো - এটি আরও ভাল নয়।
ডক ব্রাউন

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