ইউআইতে অগ্রগতি রিপোর্ট করার জন্য সেরা কৌশল - কলব্যাকটি কীভাবে হওয়া উচিত?


11

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

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

স্পষ্টতই, এই কাজটি করার জন্য কোথাও কোথাও কিছু কল-ব্যাক থাকতে হবে। আমি সাধারণত এটি দুটি উপায়ে একটিতে প্রয়োগ করেছি:

  1. একটি পরিবর্তনীয় অবজেক্টটি ব্যাক-এন্ডে পাস করুন এবং ব্যাক-এন্ডে অগ্রগতিতে এটিতে পরিবর্তন আনুন। যখন কোনও পরিবর্তন ঘটে তখন অবজেক্টটি সম্মুখ-প্রান্তকে অবহিত করে।

  2. ফর্মটির একটি কল-ব্যাক ফাংশন পাস করুন void f(ProgressObject)বা ProgressObject -> unitপিছনের শেষটি অনুরোধ করবে। এই ক্ষেত্রে, ব্যাক-এন্ডটি নির্মাণ করে ProgressObjectএবং এটি সম্পূর্ণ প্যাসিভ। আমি অনুমান করি প্রতিবার যখনই এটি অগ্রগতির প্রতিবেদন করতে চায় তখন একটি নতুন অবজেক্ট তৈরি করা উচিত।

এই পদ্ধতির ত্রুটিগুলি এবং সুবিধাগুলি কী কী? ব্যবহারের জন্য কি কোনও সম্মত-সর্বোত্তম পদ্ধতি রয়েছে? তাদের ব্যবহারের জন্য কি বিভিন্ন পরিস্থিতি রয়েছে?

আমি অগ্রাহ্য করেছি এমন অগ্রগতির প্রতিবেদন করার সম্পূর্ণ কৌশল কি আছে?


1
পরিবর্তনীয় বনাম অপরিবর্তনীয় সম্পর্কে, সুবিধাগুলি এবং ঘাটতিগুলি অন্য কোথাও যেমন রয়েছে তেমন। অগ্রগতি অবজেক্ট সম্পর্কে, এটি খুব হালকা হতে পারে; এটি একক সংখ্যার মতোই সহজ হতে পারে: শতাংশ।
রবার্ট হার্ভে

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

1
@ রবার্ট হার্ভে আমার কাছে এটি সংবাদ। এটা কি?
গ্রেগরোস

1
আমি কামড় দেব। আমরা BackgroundWorkerযে আরএইচ উল্লেখ করে ব্যবহার করি। "অগ্রগতি ফর্ম" ইত্যাদির সাথে কাস্টম ক্লাসে আবৃত এবং কোনও ব্যতিক্রম যোগাযোগের জন্য একটি সহজ প্রক্রিয়া - যেমন BackgroundWorkerডিজাইন পৃথক থ্রেডে চালিত হয়। সীমাবদ্ধতার জন্য আমরা এর বৈশিষ্ট্যগুলি এমনভাবে ব্যবহার করি। এবং যে কোনও ভাষা / কাঠামোর প্রসঙ্গে "আইডোমেটিক" সেরা হতে পারে।
র‌্যাডারবব

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

উত্তর:


8

একটি পরিবর্তনীয় অবজেক্টটি ব্যাক-এন্ডে পাস করুন এবং ব্যাক-এন্ডে অগ্রগতিতে এটিতে পরিবর্তন আনুন। যখন কোনও পরিবর্তন ঘটে তখন অবজেক্টটি সম্মুখ-প্রান্তকে অবহিত করে।

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

অকার্যকর f (প্রগ্রেসবজেক্ট) বা প্রগ্রেসঅবজেক্ট -> ইউনিটের ফর্মের কল-ব্যাক ফাংশনটি পাস করুন যা ব্যাক-এন্ডটি অনুরোধ করে। এই ক্ষেত্রে, ব্যাক-এন্ড প্রগ্রেসবজেক্টটি তৈরি করে এবং এটি সম্পূর্ণ প্যাসিভ। আমি অনুমান করি প্রতিবার যখনই এটি অগ্রগতির প্রতিবেদন করতে চায় তখন একটি নতুন অবজেক্ট তৈরি করা উচিত।

আমি এখানে এত পার্থক্য পাই না।

আমি অগ্রাহ্য করেছি এমন অগ্রগতির প্রতিবেদন করার সম্পূর্ণ কৌশল কি আছে?

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


2

এটি একটি পুশ এবং টান বিজ্ঞপ্তি ব্যবস্থার মধ্যে পার্থক্য ।

যদি আপনি ব্যাক-এন্ড টাস্কটি কোনও পটভূমিতে / কর্মী থ্রেডে চালিত হওয়ার প্রত্যাশা করেন তবে মিউটএবেবল অবজেক্টটি ( টান ) বার বার ইউআই দ্বারা পোল করে সিঙ্ক্রোনাইজ করা দরকার।

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

সাধারণভাবে পুশ বিজ্ঞপ্তিগুলি পছন্দনীয় কারণ তারা যখন কাজ করার প্রয়োজন হয় তখনই তারা কাজ করে।


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

কোনও অগ্রগতি অবজেক্টটি প্রেরণ করা আপনি যে বিজ্ঞপ্তি প্রক্রিয়াটি ব্যাক-এন্ড থেকে ব্যবহার করছেন তা অস্পষ্ট করতে পারে, যেহেতু সম্ভবত অগ্রগতি অবজেক্ট কল-ব্যাক করছে। আমি যতদূর মনে করি তেমন কোনও টান মেকানিজম ব্যবহার করি নি এবং আমি এটিকে ভুলে গিয়েছিলাম: পি
গ্রেগরোস

The mutable object (the pull) will need to be repeatably polled by the UI and synchronized if you expect the back-end task to be executed in a background/worker thread.- পরিবর্তনীয় অবজেক্টটি যদি ডায়ালগ নিজেই হয় বা এটির একটি কার্যকারী ইন্টারফেস। অবশ্যই, এটি যাইহোক কলব্যাকের পরিমাণ amounts
রবার্ট হার্ভে

1
তাই না? ওপি স্পষ্টভাবে পুশ মেকানিজমের দুটি পৃথক রূপ বর্ণনা করে, কারও মধ্যেই পোলিংয়ের প্রয়োজন হয় না।
ডক ব্রাউন

0

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


0

আপনি আপনার "দুটি উপায়" উল্লেখ করেছেন যেন তারা পৃথক ধারণা তবে আমি কিছুটা পিছনে যেতে চাই।

  1. একটি পরিবর্তনীয় অবজেক্টটি ব্যাক-এন্ডে পাস করুন এবং ব্যাক-এন্ডে অগ্রগতিতে এটিতে পরিবর্তন আনুন। যখন কোনও পরিবর্তন ঘটে তখন অবজেক্টটি সম্মুখ-প্রান্তকে অবহিত করে।

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

সুবিধাগুলি এবং ত্রুটিগুলি হিসাবে ...

পদ্ধতির (1) জন্য একটি অপূর্ণতা হ'ল ইন্টারফেসটি প্রয়োগ করে এমন শ্রেণি কেবল একবার এটি করতে পারে। (আপনি যদি বিভিন্ন আমন্ত্রণের সাথে বিভিন্ন কাজ সম্পাদন করতে চান তবে আপনার একটি সুইচ স্টেটমেন্ট বা দর্শকের প্যাটার্নের প্রয়োজন হবে)) পদ্ধতি (2) এর সাথে একই অবজেক্টটি কোনও প্রয়োজন ছাড়াই ব্যাকএন্ড কোডের প্রতিটি আহ্বানের জন্য আলাদা কলব্যাক ব্যবহার করতে পারে স্যুইচ করুন।

পদ্ধতির (1) একটি শক্তি হ'ল পদ্ধতি (2) এর একাধিক কলব্যাক বা একাধিক প্রসঙ্গে স্যুইচ স্টেটমেন্ট সহ একক কলব্যাকের সাথে ডিল করার চেয়ে ইন্টারফেসে একাধিক পদ্ধতি থাকা আরও সহজ।


-2

আপনি যে কৌশলগুলি ব্যবহার করতে পারেন তা খুব আলাদা হতে পারে।

আমি বিভিন্ন দৃশ্যের সাথে খুঁজে বের করার চেষ্টা করি

  • ডিবি অনুরোধ
  • ডাউনলোড ফাইল

ডিবি করার জন্য একটি সহজ লগইন অনুরোধ (যার অর্থ ডিবি থেকে এক এলিম্যাট দিয়ে প্রতিক্রিয়া জানাতে হবে) এর জন্য রিপোর্টের অগ্রগতির দরকার নেই তবে এটি আলাস্তি পৃথক টাস্ক প্রান্তে ইউআই থ্রেডটি বন্ধ করে দিতে পারে। অ্যাসিঙ্ক বা ব্যাকগ্রাউন্ড ওয়ার্কার, এখানে আপনাকে ফলাফলের জন্য কেবল একটি কলব্যাকের প্রয়োজন।

তবে আপনি যদি 1MLn আইটেমটি দিয়ে আপনার সমস্ত জায় দেখতে অনুসন্ধান করেন? এই ক্যোয়ারীটি সম্পূর্ণ হতে কয়েক মিনিট সময় নিতে হবে, সুতরাং এক্ষেত্রে আপনার ফর্ম আইটেম / আইটেমগুলিতে আপনার ব্যবসার যুক্তিতে আপনার পারপোর্ট অগ্রগতি বাস্তবায়ন করতে হবে, তারপরে আপনি আপনার ইউআই আপডেট করতে পারবেন এবং কলব্যাক বাতিল করতে পারেন be

ফাইল ডাউনলোডের ক্ষেত্রে একই ঘটনা। আপনি এখানে সর্বদা বাইটস বাইট আকারে আপনার অগ্রগতি কলব্যাক প্রয়োগ করতে পারেন এবং HTTP- র মধ্যে সমস্ত যোগাযোগ নিয়ন্ত্রণটি রাখা খুব সাধারণ প্যাটার্ন।

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


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