কোনও ক্লাসে একটি থ্রেড / পটভূমি কর্মী স্থাপন করা কি "ভুল" / খারাপ ডিজাইন?


15

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

আমি আশা করি যে এই কোডটি এখানে প্রাসঙ্গিক হিসাবে আমি মনে করি না যে এটি আমার কোড হিসাবে কাজ করে স্ট্যাকওভারফ্লোতে হওয়া উচিত, এটি কেবল একটি ডিজাইনের সমস্যা।


3
কেন আপনি এটি ভুল হতে পারে বলে মনে করেন?
আলব

1
@ অ্যালব - এটি বলা শক্ত। আমার কোড কাজ করে এবং আমার চাহিদা পূরণ করে, তবে, আমি একটি প্রকল্পে এটি ব্যবহারের পরিকল্পনা করছি যা আমি ওপেন সোর্স তৈরি করব। আমি নিশ্চিত করতে চাই যে আমার কোডটি "কেবলমাত্র কাজ করে না" এবং আসলে ভালভাবে ডিজাইন করা হয়েছে।
জেটি

উত্তর:


21

আমার ক্লাসটি ছাড়া এটি তৈরি করা উচিত এবং সেই ক্লাসটিতে কাজ করার জন্য একটি পটভূমি কর্মী ব্যবহার করা উচিত?

হ্যাঁ তোমার উচিৎ. এবং আমি আপনাকে বলব কেন - আপনি একক দায়িত্বের নীতি লঙ্ঘন করছেন । এক্সেল ডকটিকে অ্যাক্সেস করে এমন ক্লাসটি শক্তভাবে সংযোজন করে যেভাবে এটি এক্সেল ডকটিতে অ্যাক্সেস করে, আপনি "নিয়ামক" কোড (যে কোনও কোড যা এটি ব্যবহার করে) এটি অন্যভাবে করার ক্ষমতা সরিয়ে দেয়। আপনি কি জিজ্ঞাসা করতে পারেন? যদি নিয়ামক কোডটিতে দুটি ক্রিয়াকলাপ দীর্ঘ সময় নেয় তবে সেগুলি অনুক্রমিক হতে চায়? আপনি যদি নিয়ামককে থ্রেডিং পরিচালনা করার ক্ষমতা দিয়ে থাকেন তবে এটি দীর্ঘস্থায়ী দুটি কাজই একত্রে একসাথে করতে পারে। আপনি যদি কোনও অ-ইউআই প্রসঙ্গটি থেকে এক্সেল ডকটি অ্যাক্সেস করতে চান এবং থ্রেড করার প্রয়োজন নেই?

কলারের কাছে থ্রেডিংয়ের দায়িত্ব সরিয়ে আপনি নিজের কোডটিকে আরও পুনরায় ব্যবহারযোগ্য করে তুলতে আরও নমনীয়তার অনুমতি দিন।


2
জিজ্ঞাসা করা প্রকৃত প্রশ্নের উত্তর দেওয়ার জন্য এবং এটির উত্তম উত্তর দেওয়ার জন্য +1।
অ্যাডাম শিখুন

+1 - আপনাকে ধন্যবাদ নিমিকে। আপনি আমার প্রশ্নের স্পট উত্তর দিয়েছেন, আমি এটি প্রশংসা করি। আমি এটি আমার ক্লাসের বাইরে টেনে এনে একটি নতুন ক্লাসে রেখে দেব, আপনাকে আবারও ধন্যবাদ!
জেটি

@ নেমি - তাই যদি আমি অন্য একটি পদ্ধতি তৈরি করি যা একটি সিঙ্ক্রোনাস লোড এবং তারপরে একটি অ্যাসিঙ্ক পদ্ধতি তৈরি করে? বা একসাথে লোড পদ্ধতি থাকা এবং তারপরে সেখান থেকে যাওয়া কি আরও ভাল হবে?
জেটি

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

ধন্যবাদ নিমিকে! আমি আশা করি আমি আপনাকে আবারও উজ্জীবিত করতে পারি কারণ আপনি অবশ্যই আমার প্রশ্নের উত্তর দিয়েছেন এবং আমাকে সঠিক দিক নির্দেশ করেছেন। আবার আপনাকে ধন্যবাদ!!
জেটি

3

পটভূমির কাজগুলি থেকে পৃথক থ্রেডে ইউআই অপারেশনগুলি পরিচালনা করা ভাল ডিজাইন। অন্যথায় অ্যাপ্লিকেশন ব্যস্ত থাকাকালীন UI প্রতিক্রিয়াহীন হয়ে যায়।

আপনি ব্যাকগ্রাউন্ড থ্রেডে যে অংশটি কাজ করে তার নিজের শ্রেণিতে আলাদা করতে পারলে কোডটি ক্লিনার হবে।


1
যদিও সঠিক, আমি তাঁর প্রশ্নটি কীভাবে পড়ছি তা থেকে এই বিষয়টি বুঝতে সমস্যা হয় না তার।
নেমি

আমার প্রশ্নটি যদি ভুলভাবে পড়ে থাকে তবে আমি দুঃখিত। আমি জানি যে ইউআই এবং পটভূমির কাজগুলি পৃথক করা ভাল ডিজাইন (প্রয়োজনীয় না হলে, আমার পরীক্ষার এক্সেল ফাইলটি 8 কে সারি এর বেশি এবং প্রোগ্রামটিকে প্রতিক্রিয়াহীন বলে মনে করবে)। আমার প্রশ্নটি মূলত: এক্সেল ক্লাসের সাথে থ্রেডটি শক্তভাবে জোড় করা ভাল।
জেটি

0

আমি পৃথক ক্লাস ব্যবহার করে আপনার UI আপনার পটভূমির কাজ থেকে আলাদা করব। এটি করা উদ্বেগের বিচ্ছেদকে উত্সাহ দেয়। ইউআই কোড এবং ব্যবসায়ের যুক্তি মিশ্রিত করা উচিত নয়।


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

0

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

এছাড়াও যদি আপনি পুনরাবৃত্তি করছেন যা নির্দিষ্ট ক্রমে আইটেমগুলি প্রক্রিয়াকরণের প্রয়োজন হয় না, তবে পরিবর্তে থ্রেডপুল ব্যবহার করে বিবেচনা করুন (বা আপনি যদি। নেট 4 টি টাস্ক সমান্তরাল লাইব্রেরি ব্যবহার করেন )।


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