সি # প্রতিনিধিদের আসল বিশ্ব ব্যবহার [বন্ধ]


16

আমি মনে করি যে আমি সি # প্রতিনিধিদের ধারণাগতভাবে বুঝতে পেরেছি, তবে আমি এমন একটি বাস্তব বিশ্বের উদাহরণ খুঁজে পেতে সংগ্রাম করছি যেখানে তারা কার্যকর হবে। কীভাবে সত্যিকারের অ্যাপ্লিকেশনগুলিতে সি # প্রতিনিধি ব্যবহার করা হয়েছে এবং কী সমস্যা তারা আপনাকে আশেপাশে সক্ষম করেছে সে সম্পর্কে বিশদ বিবরণ দিয়ে কিছু উত্তর সরবরাহ করতে পারেন?


2
.NET ফ্রেমওয়ার্কের প্রায় প্রতিটি একক শ্রেণিতে কিছু ইভেন্টের সেট প্রকাশ করা হয়, তাই আপনি সেখানে যান। এটি কাজের একককে একীভূত করার এক উপায়। উদাহরণস্বরূপ, বলুন যে আপনি সি তে জেনেরিক বাইনারি ট্রি স্ট্রাকচার বাস্তবায়ন করছিলেন ভাল, আপনার গাছটিকে অর্ডার করার একমাত্র উপায় হ'ল প্যারামিটার হিসাবে একটি ফাংশন পয়েন্টার হিসাবে বাছাই করা কীভাবে জানতেন knew
এড এস

উত্তর:


16

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


2
++ আপনি ঠিক বলেছেন, তবে আমি এখনও এটি ঘৃণা করি :-) বহু বছর আগে আমি পরিবর্তে এটি নিয়ে এসেছি
মাইক ডুনলাভে

12

পিনামিটার হিসাবে লিনক সমস্ত জায়গাতে প্রতিনিধি Func<T>এবং Action<T>প্রতিনিধি ব্যবহার করে ।

এগুলি আপনাকে পরামিতি হিসাবে ল্যাম্বদা এক্সপ্রেশন ব্যবহার করতে দেয় এবং প্যারামিটার তালিকার অংশ হিসাবে নেওয়া ক্রিয়াটি সংজ্ঞায়িত করে।


12

কার্যত পর্যবেক্ষক প্যাটার্ন ব্যবহার করে কিছু সম্ভবত প্রতিনিধিদের প্রয়োগ করতে পারে implement

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


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

9

প্রতিনিধিরা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ে রক্তাক্ত উপকারী।

আপনার একটি ক্লাস রয়েছে যা অবিচ্ছিন্নভাবে স্টাফ করে এবং কলব্যাক থাকে। আপনার ডেলিগেটের পদ্ধতিটি কলব্যাকের জন্য আহ্বান করতে পারে - এবং আপনার শ্রেণি বাস্তবায়ন আপনার প্রতিনিধি পদ্ধতিতে বর্ণিত যুক্তিটি করবে।


9

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


5

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

উইন্ডোটিং সিস্টেমগুলিতে, সমস্ত ধরণের কলব্যাকগুলি একই ধাঁচ অনুসরণ করে।

লিস্পে, এমনকি শুরুর দিনগুলিতে, "ফাংশনাল আর্গুমেন্ট" বা ফুনার্গ নামে পরিচিত কিছু ছিল যা কেবল একটি ফাংশনই ছিল না, তবে এতে একটি স্টোরেজ প্রসঙ্গও রয়েছে যেখানে এটি বাইরের বিশ্বের অংশটিকে মনে রাখতে এবং যোগাযোগ করতে পারে।

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


3

এখানে একটি সাধারণ উদাহরণ যা দেখায় যে DRY নীতি অনুসরণ করে এমন সাধারণ কোড তৈরি করতে দরকারী প্রতিনিধিরা কীভাবে কার্যকর হতে পারেন। এটি আপনাকে কোডটি যেখানে প্রয়োজন সেখানে খুব কাছে রাখতে দেয়।

Action<Button, Action<Button>> prepareButton = 
    (btn, nxt) => { 
        btn.Height = 32;
        btn.Width= 64;
        nxt(btn);
    };

prepareButton(myBtn1, btn => btn.Text = "A");
prepareButton(myBtn2, btn => btn.Text = "B");
prepareButton(myBtn3, btn => btn.Text = "C");

প্রতিনিধিরা যে সুবিধা প্রদান করে তার একটি বাস্তব বিশ্ব উদাহরণ এখানে।

protected override void PageInitialize()
{
    const string selectCodeFormat = "javascript:selectCode('{0}', '{1}');";
    const string onClick = "return toggleElement(this);";

    Func<HtmlGenericControl> getElement = null;
    Action<HtmlGenericControl> setElement = null, addChild = null;
    HtmlGenericControl level1Element = null, level2Element = null, level3Element = null, level4Element = null;
    string className = null, code = null, description = null;           

    using (var records = Core.Database.ExecuteRecords("code.SocCodeTree"))
    {
        while (records.Read())
        {
            code = records.GetString("Code");
            description = records.GetString("Description"); 

            if (records.GetString("Level4") != "")
            {
                className = "Level4";
                setElement = e => level4Element = e;
                getElement = () => level4Element;
                addChild = e => level3Element.Controls.Add(e);
            }
            else if (records.GetString("Level3") != "")
            {
                className = "Level3";
                setElement = e => level3Element = e;
                getElement = () => level3Element;
                addChild = e => level2Element.Controls.Add(e);
            }
            else if (records.GetString("Level2") != "")
            {
                className = "Level2";
                setElement = e => level2Element = e;
                getElement = () => level2Element;
                addChild = e => level1Element.Controls.Add(e);
            }
            else
            {
                className = "Level1";
                setElement = e => level1Element = e;
                getElement = () => level1Element;
                addChild = e => Root.Controls.Add(e);
            }

            var child = new HtmlGenericControl("li");
            child.Attributes["class"] = className;
            var span = new HtmlGenericControl("span") { 
                InnerText = code + " - " + description + " - " 
            };
            span.Attributes["onclick"] = onClick;
            child.Controls.Add(span);
            var a = new HtmlAnchor() { 
                InnerText = "Select", 
                HRef = string.Format(selectCodeFormat, code, description) 
            };
            child.Controls.Add(a);
            setElement(new HtmlGenericControl("ul"));
            child.Controls.Add(getElement());
            addChild(child);    
        }
    }
}

2

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


1

আমি কৌশল প্যাটার্নের আকর্ষণীয় বাস্তবায়ন দেখেছি যা প্রতিনিধিদের কার্যকরভাবে ব্যবহার করে। (যেমন কৌশলটি একটি প্রতিনিধি)

আমি যে দিকে তাকিয়ে ছিলাম সেদিকেই পাথ ফাইন্ডিংয়ের জন্য যেখানে পথটি আবিষ্কার করার জন্য অ্যালগরিদম এমন একটি প্রতিনিধি ছিল যা রানটাইমের সময় নিযুক্ত করা যেতে পারে যাতে বিভিন্ন অ্যালগরিদম ব্যবহার করা যায় (বিএফএস বনাম এ * ইত্যাদি)


1

অনেকগুলি ক্লাসিক জিওএফ নিদর্শনগুলি ডেলিগেটগুলির সাথে প্রয়োগ করা যেতে পারে: উদাহরণস্বরূপ, কমান্ড প্যাটার্ন, ভিজিটর প্যাটার্ন, কৌশল প্যাটার্ন, কারখানার প্যাটার্ন এবং পর্যবেক্ষক প্যাটার্ন প্রায়শই একটি সাধারণ প্রতিনিধি দ্বারা প্রয়োগ করা যেতে পারে। কখনও কখনও, একটি শ্রেণি ভাল হয় (উদাহরণস্বরূপ যখন কমান্ডের নাম প্রয়োজন হয় বা কৌশল অবজেক্টটি সিরিয়াল করা প্রয়োজন) তবে বেশিরভাগ ক্ষেত্রে, ডেডিকেটেড ওয়ান-মেথড ইন্টারফেস তৈরির চেয়ে অনেক বেশি মার্জিত Action<...>বা ব্যবহার করা Func<...>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.