আমি বিশ্বাস করি যে মিউটেশন এবং অ্যাকশনগুলির পিছনে অনুপ্রেরণাগুলি বোঝার ফলে কোনটি কখন এবং কীভাবে ব্যবহার করা যায় সে সম্পর্কে একজনকে আরও ভাল বিচারের সুযোগ দেওয়া হয়। এটি "নিয়ম" अस्पष्ट হয়ে ওঠে এমন পরিস্থিতিতে অনিশ্চয়তার বোঝা থেকে প্রোগ্রামারকে মুক্তি দেয়। তাদের নিজ নিজ উদ্দেশ্য সম্পর্কে কিছুটা বিতর্ক করার পরে, আমি এই সিদ্ধান্তে পৌঁছেছি যে যদিও অ্যাকশন এবং মিউটেশনগুলি ব্যবহারের অবশ্যই ভুল উপায় থাকতে পারে তবে আমি মনে করি না যে একটি প্রচলিত পদ্ধতি রয়েছে।
আসুন আমরা প্রথমে কেন মিউটেশন বা ক্রিয়াগুলির মধ্য দিয়ে যাই তা বোঝার চেষ্টা করি।
প্রথম স্থানে বয়লারপ্লেট দিয়ে কেন যান? সরাসরি উপাদানগুলিতে রাষ্ট্র পরিবর্তন করবেন না কেন?
কঠোরভাবে বলতে গেলে আপনি state
সরাসরি আপনার উপাদানগুলি থেকে পরিবর্তন করতে পারেন । state
শুধু একটি জাভাস্ক্রিপ্ট অবজেক্ট এবং কিছুই ঐন্দ্রজালিক যে যে পরিবর্তন আপনার করা যে প্রত্যাবর্তন করবে না।
// Yes, you can!
this.$store.state['products'].push(product)
যাইহোক, এটি করে আপনি সমস্ত স্থানে আপনার রাষ্ট্রীয় রূপান্তরগুলি ছড়িয়ে দিচ্ছেন। আপনি কেবলমাত্র একটি একক মডিউল খোলার ক্ষমতা হারাবেন যা কেবলমাত্র রাজ্যেই রয়েছে এবং এক নজরে দেখুন এটি কী ধরণের অপারেশনগুলি প্রয়োগ করা যেতে পারে। কেন্দ্রীভূত মিউটেশনগুলি কিছুটা বয়লারপ্লেটের ব্যয়ে হলেও এটি সমাধান করে।
// so we go from this
this.$store.state['products'].push(product)
// to this
this.$store.commit('addProduct', {product})
...
// and in store
addProduct(state, {product}){
state.products.push(product)
}
...
আমি মনে করি আপনি যদি বয়লারপ্লেটের সাথে সংক্ষিপ্ত কিছু প্রতিস্থাপন করেন তবে আপনি বয়লারপ্লেটটিও ছোট হতে চাইবেন। তাই আমি অনুমান করি যে পরিবর্তনগুলি হ'ল রাজ্যের নেটিভ ক্রিয়াকলাপগুলির চারপাশে খুব পাতলা মোড়ক বোঝায়, প্রায় কোনও ব্যবসায়ের যুক্তি ছাড়াই। অন্য কথায়, মিউটেশনগুলি বেশিরভাগ সেটারগুলির মতো ব্যবহৃত হয়।
এখন আপনি নিজের রূপান্তরকে কেন্দ্রীভূত করে রেখেছেন আপনার নিজের রাজ্যের পরিবর্তনগুলির সম্পর্কে আরও ভাল একটি ওভারভিউ রয়েছে এবং যেহেতু আপনার সরঞ্জামকরণ (ভ্যু-ডেভলগুলি) সেই অবস্থানটি সম্পর্কেও সচেতন যা এটি ডিবাগিংকে আরও সহজ করে তোলে। এটি মনে রাখাও অনেক মূল্যবান যে ভুেক্সের প্লাগইনগুলি সরাসরি পরিবর্তনগুলি ট্র্যাক করার জন্য রাজ্যটিকে দেখেন না, তারা পরিবর্তে পরিবর্তনের উপর নির্ভর করে। রাজ্যে "আউট অফ বেউন্ড" পরিবর্তনগুলি তাদের কাছে এইভাবে অদৃশ্য।
তো mutations
, actions
তবুও কি পার্থক্য?
মিউটেশনগুলির মতো ক্রিয়াগুলিও স্টোরের মডিউলে থাকে এবং state
অবজেক্টটি গ্রহণ করতে পারে । যা বোঝায় যে তারা সরাসরি এটিকে পরিবর্তন করতে পারে । সুতরাং উভয় থাকার মানে কি? যদি আমরা যুক্তি দিই যে মিউটেশনগুলি ছোট এবং সাধারণ রাখতে হয়, তবে এর থেকে বোঝা যায় যে আরও বিস্তৃত ব্যবসায়ের যুক্তি রাখতে আমাদের বিকল্প উপায় প্রয়োজন need ক্রিয়াগুলি এটি করার মাধ্যম। এবং যেহেতু আমরা আগে প্রতিষ্ঠিত করেছি, ভ্যু-ডেভলগুলি এবং প্লাগইনগুলি মিউটেশনগুলির মাধ্যমে পরিবর্তনের বিষয়ে সচেতন, ধারাবাহিক থাকার জন্য আমাদের ক্রিয়া থেকে মিউটেশনগুলি ব্যবহার করা উচিত। তদুপরি, যেহেতু ক্রিয়াকলাপগুলি সমস্ত পরিবেষ্টনশীল এবং যে যুক্তিটি তারা আবদ্ধ করে তা অবিচ্ছিন্ন হতে পারে, তাই এটি বোঝা যায় যে ক্রিয়াগুলি শুরু থেকেই কেবল অবিচ্ছিন্ন হয়ে উঠবে।
এটি প্রায়শই জোর দেওয়া হয় যে ক্রিয়াগুলি অ্যাসিক্রোনাস হতে পারে, তবে সাধারণত পরিবর্তনগুলি হয় না। আপনি পার্থক্যটিকে একটি ইঙ্গিত হিসাবে দেখার সিদ্ধান্ত নিতে পারেন যে কোনও পরিবর্তনমূলক সিনক্রোনাস (এবং অ্যাসিঙ্ক্রোনাসের জন্য ক্রিয়া) এর জন্য রূপান্তরগুলি ব্যবহার করা উচিত; তবে, আপনি কিছু অসুবিধাগ্রস্থ হয়ে পড়তে পারেন যদি উদাহরণস্বরূপ যদি আপনার একাধিক মিউটেশন (সমকালীনভাবে) করা দরকার হয়, বা যদি আপনার মিউটেশন থেকে গেটারের সাথে কাজ করার প্রয়োজন হয়, কারণ মিউটেশন ফাংশনগুলি গেটর বা মিউটেশনকে তর্ক হিসাবে গ্রহণ করে না ...
... যা একটি আকর্ষণীয় প্রশ্নের দিকে নিয়ে যায়।
মিউটেশনগুলি গেটারগুলি কেন পাবে না?
আমি এখনও এই প্রশ্নের সন্তোষজনক উত্তর পাই না। আমি মূল দলটির কিছু ব্যাখ্যা দেখেছি যা আমি সবচেয়ে ভাল দেখতে পেলাম। যদি আমি তাদের ব্যবহারের সংক্ষিপ্তসার করি, তবে গেটার্সকে বোঝানো হয় (এবং প্রায়শই ক্যাশে) রাজ্যে এক্সটেনশনগুলি। অন্য কথায়, এগুলি মূলত এখনও রাষ্ট্র, যদিও এর জন্য কিছুটা সামনের গণনা প্রয়োজন এবং তারা সাধারণত পাঠযোগ্য। কমপক্ষে তারা কীভাবে ব্যবহার করতে উত্সাহিত হচ্ছে
মিউটেশনগুলিকে গেটরদের সরাসরি অ্যাক্সেস করা থেকে বিরত করা মানে তিনটি জিনিসের মধ্যে এখন একটি প্রয়োজন, যদি আমাদের পূর্ববর্তী দ্বারা প্রদত্ত কিছু কার্যকারিতা থেকে অ্যাক্সেস করা প্রয়োজন: (১) হয় গেটারের সরবরাহকৃত রাষ্ট্রীয় গণনা কোথাও অনুলিপিযুক্ত যা অ্যাক্সেসযোগ্য মিউটেশন (খারাপ গন্ধ), বা (2) গণিত মান (বা প্রাসঙ্গিক গেটর নিজেই) মিউটেশন (ফানকি) এর সুস্পষ্ট যুক্তি হিসাবে ন্যস্ত করা হয়, বা (3) গেটারের যুক্তি নিজেই মিউটেশনের মধ্যে সরাসরি নকল করা হয় , গেটর (দুর্গন্ধ) দ্বারা সরবরাহিত হিসাবে ক্যাশে করার অতিরিক্ত সুবিধা ছাড়াই।
নিম্নলিখিতটি (2) এর উদাহরণ, যা বেশিরভাগ পরিস্থিতিতে আমি মুখোমুখি হয়েছি "কমপক্ষে খারাপ" বিকল্প বলে মনে হচ্ছে।
state:{
shoppingCart: {
products: []
}
},
getters:{
hasProduct(state){
return function(product) { ... }
}
}
actions: {
addProduct({state, getters, commit, dispatch}, {product}){
// all kinds of business logic goes here
// then pull out some computed state
const hasProduct = getters.hasProduct(product)
// and pass it to the mutation
commit('addProduct', {product, hasProduct})
}
}
mutations: {
addProduct(state, {product, hasProduct}){
if (hasProduct){
// mutate the state one way
} else {
// mutate the state another way
}
}
}
আমার কাছে, উপরেরগুলি কেবল কিছুটা সংশ্লেষিত নয়, তবে কিছুটা "ফাঁসযুক্ত "ও দেখা যাচ্ছে, কারণ অ্যাকশনে উপস্থিত কিছু কোড স্পষ্টতই মিউটেশনের অভ্যন্তরীণ যুক্তি থেকে সরে আসছে।
আমার মতে, এটি একটি আপস করার ইঙ্গিত। আমি বিশ্বাস করি যে মিউটেশনগুলিকে স্বয়ংক্রিয়ভাবে গ্রাহকরা গ্রহণের অনুমতি দেওয়া কিছু চ্যালেঞ্জ উপস্থাপন করে। এটি হয় ভেক্সের নিজেই ডিজাইন, বা টুলিং (ভ্যু-ডেভোলস এট আল) হতে পারে, বা কিছু পশ্চাদপটে সামঞ্জস্যতা বজায় রাখা বা সমস্ত বর্ণিত সম্ভাবনার কিছু সংমিশ্রণ থাকতে পারে।
আমি যা বিশ্বাস করি না তা হ'ল গেটার্সকে নিজের মিউটেশনগুলিতে পাঠানো অগত্যা একটি চিহ্ন যে আপনি কোনও ভুল করছেন। আমি এটিকে ফ্রেমওয়ার্কের একটি ত্রুটিগুলি কেবল "প্যাচিং" হিসাবে দেখছি।