সবার আগে, ভাল প্রশ্ন। অন্ধভাবে "সেরা অনুশীলনগুলি" গ্রহণ না করে ইউটিলিটিতে আপনার ফোকাসের প্রশংসা করি। +1 এর জন্য
আমি আগে এই গাইড পড়েছি। আপনাকে এ সম্পর্কে কিছু মনে রাখতে হবে - এটি কেবল একটি গাইড, মূলত সি # আগতদের জন্য যারা প্রোগ্রামিং করতে জানেন তবে সি # উপায় করার সাথে এতটা পরিচিত নন। এটি নিয়মের পৃষ্ঠার মতো এতটা নয় যেমন এটি এমন একটি পৃষ্ঠা যা বর্ণনা করে যে কীভাবে জিনিসগুলি ইতিমধ্যে সাধারণত সম্পন্ন হয়। এবং যেহেতু তারা ইতিমধ্যে এই জায়গাটি সর্বত্রই সম্পন্ন করেছে, তাই ধারাবাহিকভাবে থাকা ভাল ধারণা হতে পারে।
আমি আপনার প্রশ্নের উত্তর দিতে পয়েন্টে পৌঁছে যাব।
প্রথমত, আমি ধরে নিয়েছি আপনি ইতিমধ্যে জানেন যে একটি ইন্টারফেস কী। কোনও প্রতিনিধি হিসাবে, এটি যথেষ্ট বলা যায় যে এটি কোনও পদ্ধতির টাইপড পয়েন্টারযুক্ত একটি কাঠামো, this
সেই পদ্ধতির পক্ষে যুক্তি উপস্থাপনকারী অবজেক্টের একটি বিকল্প পয়েন্টার সহ । স্থির পদ্ধতির ক্ষেত্রে, পরবর্তী পয়েন্টারটি শূন্য।
মাল্টিকাস্ট ডেলিগেটসও রয়েছে, যা ঠিক প্রতিনিধিদের মতোই, তবে তাদের মধ্যে এই কাঠামোগুলির বেশ কয়েকটি নির্ধারিত থাকতে পারে (অর্থাত্ মাল্টিকাস্ট ডেলিগেটের কাছে দাওয়াতকে ডাকা একক কল তার নির্ধারিত অনুরোধ তালিকার সমস্ত পদ্ধতি আহ্বান করে)।
ইভেন্ট ইভেন্ট ডিজাইনের ধরণ বলতে কী বোঝায়?
সেগুলির অর্থ সি # তে ইভেন্টগুলি ব্যবহার করা (যা অত্যন্ত চূড়ান্তভাবে এই দরকারী উপায়ে কার্যকর করার জন্য বিশেষ কীওয়ার্ড রয়েছে)। সি # তে ইভেন্টগুলি বহুজাতিক ক্রেতাদের দ্বারা চালিত করা হয়।
আপনি যখন কোনও ইভেন্টের সংজ্ঞা দেন, যেমন এই উদাহরণে:
class MyClass {
// Note: EventHandler is just a multicast delegate,
// that returns void and accepts (object sender, EventArgs e)!
public event EventHandler MyEvent;
public void DoSomethingThatTriggersMyEvent() {
// ... some code
var handler = MyEvent;
if (handler != null)
handler(this, EventArgs.Empty);
// ... some other code
}
}
সংকলক আসলে এটি নিম্নলিখিত কোডে রূপান্তর করে:
class MyClass {
private EventHandler MyEvent = null;
public void add_MyEvent(EventHandler value) {
MyEvent += value;
}
public void remove_MyEvent(EventHandler value) {
MyEvent -= value;
}
public void DoSomethingThatTriggersMyEvent() {
// ... some code
var handler = MyEvent;
if (handler != null)
handler(this, EventArgs.Empty);
// ... some other code
}
}
আপনি তারপরে একটি ইভেন্টের সদস্যতা নিন
MyClass instance = new MyClass();
instance.MyEvent += SomeMethodInMyClass;
যা সংকলিত হয়
MyClass instance = new MyClass();
instance.add_MyEvent(new EventHandler(SomeMethodInMyClass));
সুতরাং এটি ইভেন্টে সি # (বা সাধারণভাবে নেট)
যদি কোনও প্রতিনিধি ব্যবহার করা হয় তবে রচনাটি কীভাবে সহজ হতে পারে?
এটি সহজেই প্রদর্শিত হতে পারে:
মনে করুন আপনার কাছে এমন একটি শ্রেণি রয়েছে যা এটিতে পাস করা ক্রয়ের একটি সেটের উপর নির্ভর করে। আপনি একটি ইন্টারফেসে এই ক্রিয়াগুলি encapsulate করতে পারে:
interface RequiredMethods {
void DoX();
int DoY();
};
এবং যে কেউ আপনার ক্লাসে অ্যাকশন পাস করতে চায় তাকে প্রথমে সেই ইন্টারফেসটি প্রয়োগ করতে হবে। অথবা আপনি নিম্নলিখিত শ্রেণীর উপর নির্ভর করে তাদের জীবনকে আরও সহজ করে তুলতে পারেন :
sealed class RequiredMethods {
public Action DoX;
public Func<int> DoY();
}
এইভাবে কলকারীদের কেবল প্রয়োজনীয় সময়কালের ম্যাথডগুলির একটি উদাহরণ তৈরি করতে হবে এবং রানটাইমের সময় প্রতিনিধিদের কাছে পদ্ধতিগুলি আবদ্ধ করতে হবে। এই হল সাধারণত সহজ।
জিনিসগুলি করার এই পদ্ধতিটি সঠিক পরিস্থিতিতে অত্যন্ত উপকারী। এটি সম্পর্কে চিন্তাভাবনা করুন - আপনি যখন সত্যিই যত্নবান হন সমস্ত কিছু আপনার কাছে চলে আসে তখন কেন একটি ইন্টারফেসের উপর নির্ভর করুন?
ইন্টারফেস ব্যবহারের সুবিধাগুলি যখন সম্পর্কিত পদ্ধতির একটি গ্রুপ থাকে
ইন্টারফেস ব্যবহার করা এটি উপকারী কারণ ইন্টারফেসের জন্য সাধারণত সুস্পষ্ট সংকলন-সময় বাস্তবায়ন প্রয়োজন। এর অর্থ আপনি একটি নতুন শ্রেণি তৈরি করেন।
এবং যদি আপনার একক প্যাকেজে সম্পর্কিত বিভিন্ন পদ্ধতির একটি গ্রুপ থাকে তবে কোডের অন্যান্য অংশগুলি দ্বারা সেই প্যাকেজটি পুনরায় ব্যবহারযোগ্য হওয়া সুবিধাজনক। সুতরাং যদি তারা প্রতিনিধিদের সেট তৈরির পরিবর্তে কেবল কোনও শ্রেণি ইনস্ট্যান্ট করতে পারে তবে এটি আরও সহজ।
ইন্টারফেস ব্যবহারের সুবিধা যদি কোনও শ্রেণীর শুধুমাত্র একটি বাস্তবায়ন প্রয়োজন implementation
পূর্বে উল্লিখিত হিসাবে, ইন্টারফেসগুলি সংকলন সময়ে প্রয়োগ করা হয় - যার অর্থ তারা একটি প্রতিনিধিকে আহ্বান করার চেয়ে বেশি দক্ষ (যা প্রতি প্রতি ইন্ডিয়ারেশন স্তর)।
"একটি বাস্তবায়ন" এর অর্থ এমন একটি বাস্তবায়ন হতে পারে যা একটি একক সু-সংজ্ঞায়িত জায়গা বিদ্যমান।
অন্যথায় প্রোগ্রামের যে কোনও জায়গা থেকে বাস্তবায়ন আসতে পারে যা কেবল পদ্ধতিটির স্বাক্ষর অনুসারে ঘটে । এটি আরও নমনীয়তার জন্য অনুমতি দেয় কারণ পদ্ধতিগুলি কেবলমাত্র একটি নির্দিষ্ট ইন্টারফেস প্রয়োগ করে এমন শ্রেণীর অন্তর্ভুক্ত না হয়ে কেবল প্রত্যাশিত স্বাক্ষরের সাথে সামঞ্জস্য হওয়া প্রয়োজন। তবে সেই নমনীয়তাটি ব্যয় করে আসতে পারে এবং লিসকভ সাবস্টিটিউশন নীতিটি ভেঙে দেয় , কারণ বেশিরভাগ সময় আপনি স্পষ্টবাদী হতে চান, কারণ এটি দুর্ঘটনার সম্ভাবনা হ্রাস করে। ঠিক স্ট্যাটিক টাইপিংয়ের মতো।
শব্দটি এখানে মাল্টিকাস্ট প্রতিনিধিদেরও উল্লেখ করতে পারে। ইন্টারফেস দ্বারা ঘোষিত পদ্ধতিগুলি শুধুমাত্র একবার প্রয়োগকারী শ্রেণিতে প্রয়োগ করা যেতে পারে। তবে প্রতিনিধিরা একাধিক পদ্ধতি জড়ো করতে পারে, যা ক্রমানুসারে বলা হবে।
সুতরাং সর্বোপরি, দেখে মনে হচ্ছে গাইডটি যথেষ্ট তথ্যবহুল নয়, এবং এটি যা কেবল তা হিসাবে কাজ করে - একটি গাইড, কোনও রুলবুক নয়। কিছু পরামর্শ আসলে কিছুটা বিপরীত মনে হতে পারে sound কখন কোনটি প্রয়োগ করা ঠিক হবে তা সিদ্ধান্ত নেওয়া আপনার পক্ষে। গাইডটি কেবল আমাদের একটি সাধারণ পথ দেয় বলে মনে হচ্ছে।
আমি আশা করি আপনার প্রশ্নের আপনার সন্তুষ্টির জবাব দেওয়া হয়েছে। এবং আবার, প্রশ্নের জন্য কুডোস।