কেন হ্যান্ডেল () এর সাথে পৃথক শ্রেণীর কমান্ড হ্যান্ডলারের পরিবর্তে কমান্ডে পদ্ধতি পরিচালনা করার পরিবর্তে


13

আমার কাছে এস # আরপ আর্কিটেকচারটি ব্যবহার করে সিকিউআরএস প্যাটার্নের একটি অংশ প্রয়োগ করা হয়েছে :

public class MyCommand
{
    public CustomerId { get; set; }

    // some other fields
}

public class MyCommandHandler<MyCommand> : ICommandHandler<MyCommand, CommandResult>
{
    Handle(MyCommand command)
    {
        // some code for saving Customer entity

        return CommandResult.Success;
    }
}

আমি ভাবছি কেন কেবল ক্লাসে Commandডেটা এবং হ্যান্ডলিং পদ্ধতি উভয়ই নেই ? এটি কি এক ধরণের টেস্টিবিলিটি সুবিধা, যেখানে আপনাকে কমান্ড বৈশিষ্ট্যগুলি থেকে পৃথক করে কমান্ড হ্যান্ডলিং লজিক পরীক্ষা করতে হবে? অথবা এটি এমন কিছু ঘন ঘন ব্যবসায়ের প্রয়োজনীয়তা, যেখানে আপনার বিভিন্ন আদেশ প্রয়োগের দ্বারা একটি কমান্ড পরিচালনা করা দরকার ICommandHandler<MyCommand, CommandResult>?


আমার একই প্রশ্ন ছিল, দেখার মতো: ব্লগস কুইন্টিনজেজ.ইট
পোস্টস্

উত্তর:


14

মজার বিষয়, এই প্রশ্নটি আমাকে কেবল একইভাবে কথোপকথনের স্মরণ করিয়ে দিয়েছিল যে আমি কাজ করছি এমন লাইব্রেরি লাইব্রেরি সম্পর্কে আমাদের একজন ইঞ্জিনিয়ারের সাথে।

কমান্ডগুলির পরিবর্তে, আমার কাছে অনুরোধের ক্লাস ছিল এবং তারপরে আমার কাছে অনুরোধহ্যান্ডলার ছিল lers ডিজাইনটি আপনি বর্ণনা করছেন এমনভাবে তৈরি হয়েছিল। আমার মনে হয় আপনার যে বিভ্রান্তি রয়েছে তা হ'ল আপনি ইংরেজি শব্দটি "কমান্ড" দেখেন এবং তাত্ক্ষণিকভাবে "ক্রিয়া, ক্রিয়া ... ইত্যাদি" ভাবেন think

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

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

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

ডাইউপলিংয়ের জন্য আরেকটি উদাহরণ হ'ল যদি আপনার কমান্ডের খুব কম ইনপুট প্রয়োজন হয় (উদাহরণস্বরূপ 2 পূর্ণসংখ্যা এবং একটি স্ট্রিং) তবে তার পরিচালনার যুক্তিটি যথেষ্ট জটিল যেখানে আপনি মধ্যবর্তী সদস্যের ভেরিয়েবলগুলিতে ডেটা সঞ্চয় করতে চান। যদি আপনি 50 টি কমান্ড সারি করেন তবে আপনি যে সমস্ত মধ্যবর্তী স্টোরেজটির জন্য মেমরি বরাদ্দ করতে চান না, তাই আপনি কমান্ডহ্যান্ডলার থেকে কমান্ড পৃথক করুন। এখন আপনি 50 টি হালকা ওজনের ডেটা স্ট্রাকচার সারি করুন এবং কমান্ড হ্যান্ডলারের দ্বারা কমান্ডগুলি প্রক্রিয়াকরণ করা হ'ল আরও জটিল ডেটা স্টোরেজ কেবল একবার (বা আপনার যদি এন হ্যান্ডলারগুলি থাকে তবে N বার) বরাদ্দ করা হয়।


মুল বক্তব্যটি হ'ল, এই প্রসঙ্গে, কমান্ড / অনুরোধটি দূরবর্তী / অব্যাহত / ইত্যাদি নয় It এটি সরাসরি পরিচালনা করা হয়। এবং আমি দেখতে পাচ্ছি না যে দুজনকে আলাদা করা কীভাবে উত্তরাধিকারে সহায়তা করবে। এটি আসলে এটি আরও শক্ত করে তুলবে। শেষ অনুচ্ছেদটিও একধরণের মিস। অবজেক্ট তৈরি ব্যয়বহুল ক্রিয়াকলাপ নয় এবং 50 টি কমান্ড অবহেলাযোগ্য সংখ্যা।
ইওফোরিক

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

উদাহরণস্বরূপ, নিখুঁত কাঠামোটি এখানে ওয়েবলগস.এএসপিএন / শিজুভারঘিটিস / আর্কিভ / ২০১ive / ২০১। / ১৮ / ১৮ তে দেখা যায় । এবং সেখানে কোথাও এটি বলেছে যা আপনি বলেছেন। এবং গতি সম্পর্কে, সমস্যাটি হ'ল আপনি প্রোফাইলিং ছাড়াই 'পারফরম্যান্স' যুক্তি ব্যবহার করেন। আপনার যদি এই জাতীয় থ্রুপুটগুলির প্রয়োজনীয়তা থাকে তবে আপনি জেনেরিক আর্কিটেকচার ব্যবহার করছেন না তবে আরও কিছু বিশেষায়িত কিছু তৈরি করবেন।
ইওফোরিক

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

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

2

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

অন্যদিকে, আপনি উত্তরাধিকার এবং আদেশের সংমিশ্রণ উভয়েরই সুবিধা হারাবেন। যা আমি মনে করি এটি সত্য শক্তি।

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


আমি দেখেছি লিংক weblogs.asp.net/shijuvarghese/archive/2011/10/18/... আপনি সরু আউট আছে, কিন্তু আমি আমার আছে এস # Arp আর্চ কোডে বাসের কোনো লক্ষণ দেখতে পাচ্ছি না। সুতরাং, আমার ধারণা, আমার ক্ষেত্রে এ জাতীয় বিচ্ছেদ কেবল শ্রেণি এবং স্প্ল্যাশ যুক্তি ছড়িয়ে দেয়।
রগ্রিপার

1
@ আরগ্রিপার তখন আপনি সঠিকভাবে অনুসন্ধান করেন নি। github.com/sharparchitecture/Sharp-Architecture/blob/... এবং github.com/sharparchitecture/Sharp-Architecture/blob/...
euphoric

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