রেডাক্স কি কেবল বিশ্ব রাষ্ট্রের গৌরব নয়?


86

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

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

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

case COMPLETE_TODO:
  return [
    ...state.slice(0, action.index),
    Object.assign({}, state[action.index], {
      completed: true
    }),
    ...state.slice(action.index + 1)
  ];

এর পরিবর্তে:

case COMPLETE_TODO:
  state[action.index].completed = true;

উল্লেখ করার জন্য নয় যে আমি কেবল শিখতে একটি অনলাইন হোয়াইটবোর্ড তৈরি করছি এবং প্রতিটি রাজ্যের পরিবর্তন কমান্ড তালিকায় ব্রাশ স্ট্রোক যুক্ত করার মতো সহজ হতে পারে। কিছুক্ষণ পরে (শত শত ব্রাশ স্ট্রোক) এই পুরো অ্যারেটির সদৃশকরণ অত্যন্ত ব্যয়বহুল এবং সময়সাপেক্ষ হতে শুরু করবে।

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

var store = { items: [] };

export function getState() {
  return store;
}

export function addTodo(text) {
  store.items.push({ "text": text, "completed", false});
}

export function completeTodo(index) {
  store.items[index].completed = true;
}

এটি এখনও একটি গ্লোবাল স্টেট ট্রি হিসাবে নির্গত ক্রিয়াকলাপের মাধ্যমে রূপান্তরিত হয়েছে তবে অত্যন্ত সহজ এবং দক্ষ।


4
"একটির জন্য, কেন রাজ গাছটি অপরিবর্তনীয় হওয়া দরকার?" --- তারপরে আপনাকে ডেটা পরিবর্তন হয়েছে কিনা তা নির্ধারণ করতে আপনাকে অবশ্যই একটি অ্যালগরিদম সরবরাহ করতে হবে। এটি একটি স্বেচ্ছাচারিত ডেটা কাঠামোর জন্য প্রয়োগ করা সম্ভব নয় (যদি এটি পরিবর্তনীয় হয়)। বয়লারপ্লেট হ্রাস immutablejsকরতে নিন এবং ব্যবহার করুন return state.setIn([action.index, 'completed'], true);
zerkms

4
PS:return state.map(i => i.index == action.index ? {...i, completed: true} : i);
zerkms

উত্তর:


53

রেডাক্স কি কেবল বিশ্ব রাষ্ট্রের গৌরব নয়?

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

অপরিবর্তনীয়তা কোনও উপ-গাছকে খুব দক্ষভাবে পরিবর্তন করা হয়েছে কিনা তা চেকিংয়ে সক্ষম করে কারণ এটি কোনও পরিচয় পরীক্ষায় সহজতর হয়।

হ্যাঁ, আপনার বাস্তবায়ন দক্ষ, তবে গাছটি একবার কোনওভাবে চালিত করার সময় পুরো ভার্চুয়াল ডোমটি পুনরায় রেন্ডার করতে হবে।

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

অপরিবর্তনীয় গাছের জন্য, স্টেটলেস উপাদানগুলি কেবলমাত্র সাবট্রি (গুলি) এর উপর নির্ভর করে কিনা তা পূর্ববর্তী মান (গুলি) এর তুলনায় আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা থানা टाकाऊ আছে কিনা তা পরীক্ষা করে দেখতে হবে।


4
এটি যদিও অকাল অপটিমাইজেশন এর কিছুটা নয়? এছাড়াও, আমরা কীভাবে জানি যে অবিচ্ছিন্ন অবজেক্টগুলি অনুলিপি করার ব্যয়টি ডিওএমকে পুনরায় রেন্ডারিংয়ের চেয়ে কম হয় (প্রতিক্রিয়াটির ভার্চুয়াল ডোমও এই ব্যয়টিকে ভারীভাবে প্রশমিত করতে পারে না?)
রায়ান পেশেল

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

4
ভার্চুয়াল ডিওএম জিনিসটিও অন্ধকার যাদু নয় - প্রতিক্রিয়া ডক্স থেকে উদ্ধৃতি দেওয়া: "একটি গাছকে অন্য গাছে রূপান্তরিত করতে সর্বনিম্ন সংখ্যার ক্রিয়াকলাপ তৈরি করা একটি জটিল এবং সু-অধ্যয়নিত সমস্যা - শিল্পের অ্যালগোরিদমের ক্রমটিতে জটিলতা রয়েছে ও (এন 3) এর যেখানে n গাছের নোডের সংখ্যা ""
লোরফোন

4
প্রতিক্রিয়া অনুশীলনে আরও ভাল সম্পাদন করতে সক্ষম হওয়ার কারণ হ'ল: প্রতিক্রিয়া হিউরিস্টিকের উপর নির্ভর করে - সুতরাং: "যদি আপনি স্থিতিশীল কীগুলি সরবরাহ করেন না (উদাহরণস্বরূপ ম্যাথআর্যান্ডম () উদাহরণস্বরূপ), সমস্ত উপ-গাছগুলি যাচ্ছে প্রতি একক সময় পুনরায় রেন্ডার করুন the ব্যবহারকারীদের কী বেছে নেওয়ার পছন্দ করে তাদের পায়ের কাছে গুলি করার ক্ষমতা রয়েছে "" আপনি যেমন স্থিতিশীল কী সরবরাহ করে প্রতিক্রিয়াটিকে সাহায্য করতে পারেন ঠিক তেমনই আপনি অপরিবর্তনীয় ডেটা প্রপস সরবরাহ করে প্রতিক্রিয়াটিকে সহায়তা করতে পারেন।
lorefnon

4
আপনার ব্রাশ স্ট্রোকের অ্যারে সম্পর্কে - দয়া করে উল্লেখ করুন: ফেসবুক. github.io/immutable-js/docs/#/ ডক্স থেকে তালিকা উদ্ধৃতি: তালিকা জাভাস্ক্রিপ্ট অ্যারের মতো সূচিযুক্ত ঘন সংগ্রহের আদেশ দেওয়া হয়েছে। ডেকে বাস্তবায়িত করে, উভয় প্রান্ত (পুশ, পপ) এবং শুরুর (আনশিফ্ট, শিফট) থেকে দক্ষ সংযোজন এবং অপসারণ সহ implement
lorefnon
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.