મજબૂત અને અનુમાનિત યુઝર ઇન્ટરફેસ બનાવવા માટે સ્ટેટ મશીન સાથે React ના useActionState વિશે જાણો. જટિલ એપ્લિકેશનો માટે એક્શન સ્ટેટ ટ્રાન્ઝિશન લોજિક શીખો.
React useActionState સ્ટેટ મશીન: એક્શન સ્ટેટ ટ્રાન્ઝિશન લોજિકમાં નિપુણતા
React નું useActionState
એ React 19 માં રજૂ થયેલું એક શક્તિશાળી હૂક છે (હાલમાં કેનેરીમાં છે), જે એસિન્ક્રોનસ સ્ટેટ અપડેટ્સને સરળ બનાવવા માટે ડિઝાઇન કરવામાં આવ્યું છે, ખાસ કરીને જ્યારે સર્વર એક્શન્સ સાથે કામ કરવામાં આવે છે. જ્યારે તેને સ્ટેટ મશીન સાથે જોડવામાં આવે છે, ત્યારે તે જટિલ UI ક્રિયાપ્રતિક્રિયાઓ અને સ્ટેટ ટ્રાન્ઝિશન્સને મેનેજ કરવા માટે એક સુંદર અને મજબૂત રીત પ્રદાન કરે છે. આ બ્લોગ પોસ્ટમાં, અમે અનુમાનિત અને જાળવણી કરી શકાય તેવી React એપ્લિકેશનો બનાવવા માટે સ્ટેટ મશીન સાથે useActionState
નો અસરકારક રીતે કેવી રીતે ઉપયોગ કરવો તે વિશે ઊંડાણપૂર્વક ચર્ચા કરીશું.
સ્ટેટ મશીન શું છે?
સ્ટેટ મશીન એ ગણતરીનું એક ગાણિતિક મોડેલ છે જે સિસ્ટમના વર્તનને મર્યાદિત સંખ્યામાં સ્ટેટ્સ (states) અને તે સ્ટેટ્સ વચ્ચેના ટ્રાન્ઝિશન્સ (transitions) તરીકે વર્ણવે છે. દરેક સ્ટેટ સિસ્ટમની એક અલગ સ્થિતિ રજૂ કરે છે, અને ટ્રાન્ઝિશન્સ તે ઇવેન્ટ્સ રજૂ કરે છે જે સિસ્ટમને એક સ્ટેટમાંથી બીજા સ્ટેટમાં ખસેડવાનું કારણ બને છે. તેને ફ્લોચાર્ટની જેમ વિચારો, પરંતુ તમે સ્ટેપ્સ વચ્ચે કેવી રીતે આગળ વધી શકો છો તેના પર કડક નિયમો હોય છે.
તમારી React એપ્લિકેશનમાં સ્ટેટ મશીનનો ઉપયોગ કરવાથી ઘણા ફાયદા થાય છે:
- અનુમાનિતતા: સ્ટેટ મશીન નિયંત્રણનો સ્પષ્ટ અને અનુમાનિત પ્રવાહ લાગુ કરે છે, જેનાથી તમારી એપ્લિકેશનના વર્તન વિશે તર્ક કરવો સરળ બને છે.
- જાળવણીક્ષમતા: UI રેન્ડરિંગથી સ્ટેટ લોજિકને અલગ કરીને, સ્ટેટ મશીન કોડ ઓર્ગેનાઇઝેશનને સુધારે છે અને તમારી એપ્લિકેશનને જાળવવા અને અપડેટ કરવાનું સરળ બનાવે છે.
- પરીક્ષણક્ષમતા: સ્ટેટ મશીન સ્વાભાવિક રીતે પરીક્ષણ કરી શકાય તેવા હોય છે કારણ કે તમે દરેક સ્ટેટ અને ટ્રાન્ઝિશન માટે અપેક્ષિત વર્તનને સરળતાથી વ્યાખ્યાયિત કરી શકો છો.
- વિઝ્યુઅલ પ્રતિનિધિત્વ: સ્ટેટ મશીનને દૃષ્ટિની રીતે રજૂ કરી શકાય છે, જે અન્ય ડેવલપર્સ અથવા સ્ટેકહોલ્ડર્સને એપ્લિકેશનના વર્તનને સમજાવવામાં મદદ કરે છે.
useActionState
નો પરિચય
useActionState
હૂક તમને એવા એક્શનના પરિણામને હેન્ડલ કરવાની મંજૂરી આપે છે જે સંભવિતપણે એપ્લિકેશનના સ્ટેટને બદલે છે. તે સર્વર એક્શન્સ સાથે સરળતાથી કામ કરવા માટે ડિઝાઇન કરવામાં આવ્યું છે, પરંતુ તેને ક્લાયંટ-સાઇડ એક્શન્સ માટે પણ અનુકૂળ કરી શકાય છે. તે લોડિંગ સ્ટેટ્સ, એરર્સ અને એક્શનના અંતિમ પરિણામને મેનેજ કરવાની એક સ્વચ્છ રીત પ્રદાન કરે છે, જેનાથી રિસ્પોન્સિવ અને યુઝર-ફ્રેન્ડલી UI બનાવવાનું સરળ બને છે.
અહીં useActionState
કેવી રીતે વપરાય છે તેનું એક મૂળભૂત ઉદાહરણ છે:
const [state, dispatch] = useActionState(async (prevState, formData) => {
// તમારું એક્શન લોજિક અહીં
try {
const result = await someAsyncFunction(formData);
return { ...prevState, data: result };
} catch (error) {
return { ...prevState, error: error.message };
}
}, { data: null, error: null });
આ ઉદાહરણમાં:
- પ્રથમ આર્ગ્યુમેન્ટ એક એસિન્ક્રોનસ ફંક્શન છે જે એક્શન કરે છે. તેને પાછલું સ્ટેટ અને ફોર્મ ડેટા (જો લાગુ હોય તો) મળે છે.
- બીજો આર્ગ્યુમેન્ટ પ્રારંભિક સ્ટેટ છે.
- આ હૂક વર્તમાન સ્ટેટ અને ડિસ્પેચ ફંક્શન ધરાવતો એરે રિટર્ન કરે છે.
useActionState
અને સ્ટેટ મશીનને જોડવું
ખરી શક્તિ useActionState
ને સ્ટેટ મશીન સાથે જોડવાથી આવે છે. આ તમને એસિન્ક્રોનસ એક્શન્સ દ્વારા ટ્રિગર થતા જટિલ સ્ટેટ ટ્રાન્ઝિશન્સને વ્યાખ્યાયિત કરવાની મંજૂરી આપે છે. ચાલો એક દૃશ્ય વિચારીએ: એક સરળ ઈ-કોમર્સ કમ્પોનન્ટ જે પ્રોડક્ટની વિગતો મેળવે છે.
ઉદાહરણ: પ્રોડક્ટ વિગતો મેળવવી
અમે અમારા પ્રોડક્ટ વિગતોના કમ્પોનન્ટ માટે નીચેના સ્ટેટ્સને વ્યાખ્યાયિત કરીશું:
- Idle: પ્રારંભિક સ્ટેટ. હજુ સુધી કોઈ પ્રોડક્ટની વિગતો મેળવવામાં આવી નથી.
- Loading: જ્યારે પ્રોડક્ટની વિગતો મેળવવામાં આવી રહી હોય ત્યારનું સ્ટેટ.
- Success: પ્રોડક્ટની વિગતો સફળતાપૂર્વક મેળવ્યા પછીનું સ્ટેટ.
- Error: જો પ્રોડક્ટની વિગતો મેળવતી વખતે કોઈ એરર આવી હોય તો તે સ્ટેટ.
આપણે આ સ્ટેટ મશીનને એક ઓબ્જેક્ટનો ઉપયોગ કરીને રજૂ કરી શકીએ છીએ:
const productDetailsMachine = {
initial: 'idle',
states: {
idle: {
on: {
FETCH: 'loading',
},
},
loading: {
on: {
SUCCESS: 'success',
ERROR: 'error',
},
},
success: {
type: 'final',
},
error: {
on: {
FETCH: 'loading',
},
},
},
};
આ એક સરળ રજૂઆત છે; XState જેવી લાઇબ્રેરીઓ વધુ અત્યાધુનિક સ્ટેટ મશીન અમલીકરણો પ્રદાન કરે છે જેમાં હાઇરાર્કિકલ સ્ટેટ્સ, પેરેલલ સ્ટેટ્સ અને ગાર્ડ્સ જેવી સુવિધાઓ હોય છે.
React માં અમલીકરણ
હવે, ચાલો આ સ્ટેટ મશીનને React કમ્પોનન્ટમાં useActionState
સાથે જોડીએ.
import React from 'react';
// જો તમે સંપૂર્ણ સ્ટેટ મશીનનો અનુભવ ઇચ્છતા હોવ તો XState ઇન્સ્ટોલ કરો. આ મૂળભૂત ઉદાહરણ માટે, અમે એક સરળ ઓબ્જેક્ટનો ઉપયોગ કરીશું.
// import { createMachine, useMachine } from 'xstate';
const productDetailsMachine = {
initial: 'idle',
states: {
idle: {
on: {
FETCH: 'loading',
},
},
loading: {
on: {
SUCCESS: 'success',
ERROR: 'error',
},
},
success: {
type: 'final',
},
error: {
on: {
FETCH: 'loading',
},
},
},
};
function ProductDetails({ productId }) {
const [state, dispatch] = React.useReducer(
(state, event) => {
const nextState = productDetailsMachine.states[state].on[event];
return nextState || state; // જો કોઈ ટ્રાન્ઝિશન વ્યાખ્યાયિત ન હોય તો આગલું સ્ટેટ અથવા વર્તમાન સ્ટેટ રિટર્ન કરો
},
productDetailsMachine.initial
);
const [productData, setProductData] = React.useState(null);
const [error, setError] = React.useState(null);
React.useEffect(() => {
if (state === 'loading') {
const fetchData = async () => {
try {
const response = await fetch(`https://api.example.com/products/${productId}`); // તમારા API એન્ડપોઇન્ટથી બદલો
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setProductData(data);
setError(null);
dispatch('SUCCESS');
} catch (e) {
setError(e.message);
setProductData(null);
dispatch('ERROR');
}
};
fetchData();
}
}, [state, productId, dispatch]);
const handleFetch = () => {
dispatch('FETCH');
};
return (
પ્રોડક્ટની વિગતો
{state === 'idle' && }
{state === 'loading' && લોડિંગ...
}
{state === 'success' && (
{productData.name}
{productData.description}
કિંમત: ${productData.price}
)}
{state === 'error' && એરર: {error}
}
);
}
export default ProductDetails;
સમજૂતી:
- અમે
productDetailsMachine
ને એક સરળ JavaScript ઓબ્જેક્ટ તરીકે વ્યાખ્યાયિત કરીએ છીએ જે અમારા સ્ટેટ મશીનને રજૂ કરે છે. - અમે અમારા મશીનના આધારે સ્ટેટ ટ્રાન્ઝિશન્સને મેનેજ કરવા માટે
React.useReducer
નો ઉપયોગ કરીએ છીએ. - જ્યારે સ્ટેટ 'loading' હોય ત્યારે ડેટા મેળવવા માટે અમે React ના
useEffect
હૂકનો ઉપયોગ કરીએ છીએ. handleFetch
ફંક્શન 'FETCH' ઇવેન્ટને ડિસ્પેચ કરે છે, જે લોડિંગ સ્ટેટ શરૂ કરે છે.- કમ્પોનન્ટ વર્તમાન સ્ટેટના આધારે અલગ-અલગ કન્ટેન્ટ રેન્ડર કરે છે.
useActionState
નો ઉપયોગ (કાલ્પનિક - React 19 ફીચર)
જ્યારે useActionState
હજુ સુધી સંપૂર્ણપણે ઉપલબ્ધ નથી, અહીં એક ઉદાહરણ છે કે એકવાર ઉપલબ્ધ થયા પછી અમલીકરણ કેવું દેખાશે, જે એક વધુ સ્વચ્છ અભિગમ પ્રદાન કરે છે:
import React from 'react';
//import { useActionState } from 'react'; // જ્યારે ઉપલબ્ધ થાય ત્યારે અનકમેન્ટ કરો
const productDetailsMachine = {
initial: 'idle',
states: {
idle: {
on: {
FETCH: 'loading',
},
},
loading: {
on: {
SUCCESS: 'success',
ERROR: 'error',
},
},
success: {
type: 'final',
},
error: {
on: {
FETCH: 'loading',
},
},
},
};
function ProductDetails({ productId }) {
const initialState = { state: productDetailsMachine.initial, data: null, error: null };
// કાલ્પનિક useActionState અમલીકરણ
const [newState, dispatch] = React.useReducer(
(state, event) => {
const nextState = productDetailsMachine.states[state.state].on[event];
return nextState ? { ...state, state: nextState } : state; // જો કોઈ ટ્રાન્ઝિશન વ્યાખ્યાયિત ન હોય તો આગલું સ્ટેટ અથવા વર્તમાન સ્ટેટ રિટર્ન કરો
},
initialState
);
const handleFetchProduct = async () => {
dispatch('FETCH');
try {
const response = await fetch(`https://api.example.com/products/${productId}`); // તમારા API એન્ડપોઇન્ટથી બદલો
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
// સફળતાપૂર્વક મેળવ્યું - ડેટા સાથે SUCCESS ડિસ્પેચ કરો!
dispatch('SUCCESS');
// મેળવેલા ડેટાને લોકલ સ્ટેટમાં સાચવો. રિડ્યુસરની અંદર ડિસ્પેચનો ઉપયોગ કરી શકાતો નથી.
newState.data = data; // ડિસ્પેચરની બહાર અપડેટ કરો
} catch (error) {
// એરર આવી - એરર મેસેજ સાથે ERROR ડિસ્પેચ કરો!
dispatch('ERROR');
// render() માં પ્રદર્શિત કરવા માટે એરરને નવા વેરિયેબલમાં સ્ટોર કરો
newState.error = error.message;
}
//}, initialState);
};
return (
પ્રોડક્ટની વિગતો
{newState.state === 'idle' && }
{newState.state === 'loading' && લોડિંગ...
}
{newState.state === 'success' && newState.data && (
{newState.data.name}
{newState.data.description}
કિંમત: ${newState.data.price}
)}
{newState.state === 'error' && newState.error && એરર: {newState.error}
}
);
}
export default ProductDetails;
મહત્વપૂર્ણ નોંધ: આ ઉદાહરણ કાલ્પનિક છે કારણ કે useActionState
હજુ સુધી સંપૂર્ણપણે ઉપલબ્ધ નથી અને તેનું ચોક્કસ API બદલાઈ શકે છે. મેં મુખ્ય લોજિક ચલાવવા માટે તેને સ્ટાન્ડર્ડ useReducer સાથે બદલ્યું છે. જો કે, તેનો હેતુ એ બતાવવાનો છે કે તમે તેનો ઉપયોગ કેવી રીતે *કરશો*, જો તે ઉપલબ્ધ થાય અને તમારે useReducer ને useActionState સાથે બદલવું પડે. ભવિષ્યમાં useActionState
સાથે, આ કોડ ન્યૂનતમ ફેરફારો સાથે સમજાવ્યા મુજબ કામ કરવો જોઈએ, જે એસિન્ક્રોનસ ડેટા હેન્ડલિંગને મોટા પ્રમાણમાં સરળ બનાવશે.
સ્ટેટ મશીન સાથે useActionState
નો ઉપયોગ કરવાના ફાયદા
- ચિંતાઓની સ્પષ્ટ વિભાજન: સ્ટેટ લોજિક સ્ટેટ મશીનમાં સમાવિષ્ટ છે, જ્યારે UI રેન્ડરિંગ React કમ્પોનન્ટ દ્વારા હેન્ડલ કરવામાં આવે છે.
- સુધારેલી કોડ વાંચનીયતા: સ્ટેટ મશીન એપ્લિકેશનના વર્તનનું દ્રશ્ય પ્રતિનિધિત્વ પ્રદાન કરે છે, જે તેને સમજવા અને જાળવવાનું સરળ બનાવે છે.
- સરળ એસિન્ક્રોનસ હેન્ડલિંગ:
useActionState
એસિન્ક્રોનસ એક્શન્સના હેન્ડલિંગને સુવ્યવસ્થિત કરે છે, બોઇલરપ્લેટ કોડ ઘટાડે છે. - ઉન્નત પરીક્ષણક્ષમતા: સ્ટેટ મશીન સ્વાભાવિક રીતે પરીક્ષણ કરી શકાય તેવા હોય છે, જે તમને તમારી એપ્લિકેશનના વર્તનની શુદ્ધતાને સરળતાથી ચકાસવાની મંજૂરી આપે છે.
અદ્યતન ખ્યાલો અને વિચારણાઓ
XState ઇન્ટિગ્રેશન
વધુ જટિલ સ્ટેટ મેનેજમેન્ટની જરૂરિયાતો માટે, XState જેવી સમર્પિત સ્ટેટ મશીન લાઇબ્રેરીનો ઉપયોગ કરવાનું વિચારો. XState સ્ટેટ મશીનને વ્યાખ્યાયિત કરવા અને મેનેજ કરવા માટે એક શક્તિશાળી અને લવચીક ફ્રેમવર્ક પ્રદાન કરે છે, જેમાં હાઇરાર્કિકલ સ્ટેટ્સ, પેરેલલ સ્ટેટ્સ, ગાર્ડ્સ અને એક્શન્સ જેવી સુવિધાઓ છે.
// XState નો ઉપયોગ કરીને ઉદાહરણ
import { createMachine, useMachine } from 'xstate';
const productDetailsMachine = createMachine({
id: 'productDetails',
initial: 'idle',
states: {
idle: {
on: {
FETCH: 'loading',
},
},
loading: {
invoke: {
id: 'fetchProduct',
src: (context, event) => fetch(`https://api.example.com/products/${context.productId}`).then(res => res.json()),
onDone: {
target: 'success',
actions: assign({ product: (context, event) => event.data })
},
onError: {
target: 'error',
actions: assign({ error: (context, event) => event.data })
}
}
},
success: {
type: 'final',
},
error: {
on: {
FETCH: 'loading',
},
},
},
}, {
services: {
fetchProduct: (context, event) => fetch(`https://api.example.com/products/${context.productId}`).then(res => res.json())
}
});
આ સ્ટેટને મેનેજ કરવાની વધુ ઘોષણાત્મક અને મજબૂત રીત પ્રદાન કરે છે. ખાતરી કરો કે તમે તેને npm install xstate
નો ઉપયોગ કરીને ઇન્સ્ટોલ કરો છો.
ગ્લોબલ સ્ટેટ મેનેજમેન્ટ
ઘણા કમ્પોનન્ટ્સમાં જટિલ સ્ટેટ મેનેજમેન્ટની જરૂરિયાતોવાળી એપ્લિકેશનો માટે, Redux અથવા Zustand જેવા ગ્લોબલ સ્ટેટ મેનેજમેન્ટ સોલ્યુશનનો ઉપયોગ સ્ટેટ મશીન સાથે કરવાનું વિચારો. આ તમને તમારી એપ્લિકેશનના સ્ટેટને કેન્દ્રિત કરવાની અને તેને કમ્પોનન્ટ્સ વચ્ચે સરળતાથી શેર કરવાની મંજૂરી આપે છે.
સ્ટેટ મશીનનું પરીક્ષણ
તમારી એપ્લિકેશનની શુદ્ધતા અને વિશ્વસનીયતા સુનિશ્ચિત કરવા માટે સ્ટેટ મશીનનું પરીક્ષણ કરવું મહત્વપૂર્ણ છે. તમે તમારા સ્ટેટ મશીન માટે યુનિટ ટેસ્ટ લખવા માટે Jest અથવા Mocha જેવા પરીક્ષણ ફ્રેમવર્કનો ઉપયોગ કરી શકો છો, ચકાસી શકો છો કે તે અપેક્ષા મુજબ સ્ટેટ્સ વચ્ચે સંક્રમણ કરે છે અને વિવિધ ઇવેન્ટ્સને યોગ્ય રીતે હેન્ડલ કરે છે.
અહીં એક સરળ ઉદાહરણ છે:
// ઉદાહરણ Jest ટેસ્ટ
import { interpret } from 'xstate';
import { productDetailsMachine } from './productDetailsMachine';
describe('productDetailsMachine', () => {
it('should transition from idle to loading on FETCH event', (done) => {
const service = interpret(productDetailsMachine).onTransition((state) => {
if (state.value === 'loading') {
expect(state.value).toBe('loading');
done();
}
});
service.start();
service.send('FETCH');
});
});
આંતરરાષ્ટ્રીયકરણ (i18n)
જ્યારે વૈશ્વિક પ્રેક્ષકો માટે એપ્લિકેશનો બનાવવામાં આવે છે, ત્યારે આંતરરાષ્ટ્રીયકરણ (i18n) આવશ્યક છે. ખાતરી કરો કે તમારું સ્ટેટ મશીન લોજિક અને UI રેન્ડરિંગ બહુવિધ ભાષાઓ અને સાંસ્કૃતિક સંદર્ભોને સમર્થન આપવા માટે યોગ્ય રીતે આંતરરાષ્ટ્રીયકૃત થયેલ છે. નીચેનાનો વિચાર કરો:
- ટેક્સ્ટ કન્ટેન્ટ: વપરાશકર્તાના લોકેલના આધારે ટેક્સ્ટ કન્ટેન્ટનું ભાષાંતર કરવા માટે i18n લાઇબ્રેરીઓનો ઉપયોગ કરો.
- તારીખ અને સમય ફોર્મેટ્સ: વપરાશકર્તાના પ્રદેશ માટે યોગ્ય ફોર્મેટમાં તારીખો અને સમય પ્રદર્શિત કરવા માટે લોકેલ-અવેર તારીખ અને સમય ફોર્મેટિંગ લાઇબ્રેરીઓનો ઉપયોગ કરો.
- ચલણ ફોર્મેટ્સ: વપરાશકર્તાના પ્રદેશ માટે યોગ્ય ફોર્મેટમાં ચલણ મૂલ્યો પ્રદર્શિત કરવા માટે લોકેલ-અવેર ચલણ ફોર્મેટિંગ લાઇબ્રેરીઓનો ઉપયોગ કરો.
- સંખ્યા ફોર્મેટ્સ: વપરાશકર્તાના પ્રદેશ માટે યોગ્ય ફોર્મેટમાં સંખ્યાઓ પ્રદર્શિત કરવા માટે લોકેલ-અવેર નંબર ફોર્મેટિંગ લાઇબ્રેરીઓનો ઉપયોગ કરો (દા.ત., દશાંશ વિભાજક, હજાર વિભાજક).
- જમણેથી-ડાબે (RTL) લેઆઉટ: અરબી અને હીબ્રુ જેવી ભાષાઓ માટે RTL લેઆઉટને સપોર્ટ કરો.
આ i18n પાસાઓને ધ્યાનમાં લઈને, તમે ખાતરી કરી શકો છો કે તમારી એપ્લિકેશન વૈશ્વિક પ્રેક્ષકો માટે સુલભ અને વપરાશકર્તા-મૈત્રીપૂર્ણ છે.
નિષ્કર્ષ
React ના useActionState
ને સ્ટેટ મશીન સાથે જોડવાથી મજબૂત અને અનુમાનિત યુઝર ઇન્ટરફેસ બનાવવાનો એક શક્તિશાળી અભિગમ મળે છે. UI રેન્ડરિંગથી સ્ટેટ લોજિકને અલગ કરીને અને નિયંત્રણનો સ્પષ્ટ પ્રવાહ લાગુ કરીને, સ્ટેટ મશીન કોડ ઓર્ગેનાઇઝેશન, જાળવણીક્ષમતા અને પરીક્ષણક્ષમતામાં સુધારો કરે છે. જ્યારે useActionState
હજુ પણ એક આગામી ફીચર છે, ત્યારે હવે સ્ટેટ મશીનને કેવી રીતે એકીકૃત કરવું તે સમજવાથી તમને તેના ફાયદાઓનો લાભ લેવા માટે તૈયાર કરવામાં આવશે જ્યારે તે ઉપલબ્ધ થશે. XState જેવી લાઇબ્રેરીઓ વધુ અદ્યતન સ્ટેટ મેનેજમેન્ટ ક્ષમતાઓ પ્રદાન કરે છે, જે જટિલ એપ્લિકેશન લોજિકને હેન્ડલ કરવાનું સરળ બનાવે છે.
સ્ટેટ મશીન અને useActionState
ને અપનાવીને, તમે તમારી React ડેવલપમેન્ટ કુશળતાને વધારી શકો છો અને એવી એપ્લિકેશનો બનાવી શકો છો જે વિશ્વભરના વપરાશકર્તાઓ માટે વધુ વિશ્વસનીય, જાળવણી કરી શકાય તેવી અને વપરાશકર્તા-મૈત્રીપૂર્ણ હોય.