ইভেন্টগুলি ঘোষণার জন্য পছন্দের উপায়


14

নেট প্রোগ্রামের মডেলটি সম্পর্কে আমার বোঝার সাথে আমি মোটামুটি খুশি। আমি মনে করি আমি সম্ভবত সিস্টেমের একটি সামান্য উপকারের ভুল বোঝাবুঝি করছি।

যখন আমি আমার ক্লাসগুলিতে ইভেন্টগুলি স্থাপন শুরু করি তখন আমি প্রমিতের মতো এভাবে ব্যবহার করতাম:

public event EventHandler<MyEventArgs> MyEvent;

এর অর্থ হ'ল ইভেন্টটি সাবস্ক্রাইব করার জন্য যে কোনও পদ্ধতির প্রয়োজন হবে:

void HandleThatEvent(object sender, MyEventArgs args){...}

যা দুর্দান্ত, তবে আমি দেখেছি যে আমি প্রেরকের খুব কমই যত্ন করব, তাই এটি প্রচুর পদ্ধতিতে স্বাক্ষরগুলি ফুলে উঠেছে।

তাই আমি আমার নিজস্ব প্রতিনিধি প্রকারগুলি ঘোষণা করতে চলেছি

public delegate void MyEventHandler(SomeClass argument);

যা বিশৃঙ্খলা কেটে ফেলেছিল, তবে হ্যান্ডলারের লেখার কথা এলে আমাকে একটি ছোট সমস্যা দিয়ে ফেলেছিল:

eventImplmentor.MyEvent += HandleThatEvent;
.
.
.
void HandleThatEvent(/*oh, um, what arguments does it take? Intellisense isn't telling me*/)

সুতরাং আমাকে ডেলিগেটের ঘোষণায় ফিরে যেতে হবে এবং তাকাতে হবে এবং তারপরে ফিরে গিয়ে সেগুলিতে লিখতে হবে, বা এটি সঙ্কলন করতে হবে এবং বলার অপেক্ষা রাখে।

সুতরাং এখন পরিবর্তে, আমি কেবল ব্যবহার করছি Action, Action<T>বা যা টেম্পলেট ফিট করে fits

public event Action<SomeClass> MyEvent;

যাতে আমি ইভেন্টটি নিয়ে ঘুরে বেড়াতে পারি এবং এটি কী পরামিতিগুলি প্রত্যাশা করে তা বলা যেতে পারে।

আমার প্রশ্ন, সর্বোপরি: সি # তে ইভেন্ট ঘোষণার জন্য কি সেরা অনুশীলন রয়েছে? আমি কি আবার ফিরে যাই EventHandler<T>, নাকি Action<T>গ্রহণযোগ্য?


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

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

উত্তর:


8

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

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

এটির মূল্যের জন্য, আমি এটিতে কিছুটা সময় দিয়েছি এবং একটি ভিন্ন ইভেন্ট হ্যান্ডলিং প্যাটার্ন নিয়ে এসেছি: ইভেন্ট স্বাক্ষর। নেট - একটি শক্তিশালী টাইপযুক্ত 'প্রেরক' ব্যবহার করে? । লক্ষ্য এখানে প্রেরকের মুছে ফেলার জন্য নয়, কিন্তু যেমন জেনেরিক শক্তিশালী টাইপ করতে যাচ্ছিলেন TSenderপরিবর্তে স্বাস্থ্যহীন যেমন টাইপ করা System.Object। এটি খুব ভাল কাজ করে; যাইহোক, আপনি যখন এটি করেন তখন কেউ ইন্টেলিসেন্স সমর্থন হারিয়ে ফেলবে, তাই দুর্ভাগ্যজনক বাণিজ্য বন্ধ রয়েছে।

সামগ্রিকভাবে, আমি স্ট্যান্ডার্ড প্যাটার্নটির সাথে লেগে থাকব তবে এটি করার সম্ভাব্য আরও ভাল উপায় সম্পর্কে চিন্তা করা আকর্ষণীয়।


আপনার SO প্রশ্নের দিকে আমাকে নির্দেশ করার জন্য ধন্যবাদ Thanks এটা খুব মজার. কেন এখনও এত গুরুত্বপূর্ণ যে প্রেরক বাধ্যতামূলক তা আমি এখনও বুঝতে পারি না। বেশিরভাগ সময় আমি প্রেরকের সম্পর্কে চিন্তা করি না। এটি কি কিছু স্বেচ্ছাসেবীর নিয়ম?
ম্যাট এলেন

না, আপনি অবশ্যই আপনার প্রতিনিধিদের ঘোষনা করতে পারেন তবে আপনি পছন্দ করেন। প্রেরককে সর্বদা অন্তর্ভুক্ত করা নেট নীতি, এবং এটি সম্পূর্ণ খারাপ ধারণা নয়।
নীল

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

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

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