रिॲक्ट स्ट्रिक्टमोडसाठी एक सर्वसमावेशक मार्गदर्शक, ज्यामध्ये त्याचे फायदे, सामान्य वापर आणि ते तुमच्या डेव्हलपमेंट वर्कफ्लोमध्ये कशी सुधारणा करते याचे विश्लेषण आहे.
रिॲक्ट स्ट्रिक्टमोड: तुमच्या डेव्हलपमेंट वातावरणाला सुपरचार्ज करणे
वेब डेव्हलपमेंटच्या सतत बदलणाऱ्या जगात, तुमच्या ॲप्लिकेशन्सची मजबुती आणि देखरेखक्षमता सुनिश्चित करणे अत्यंत महत्त्वाचे आहे. रिॲक्ट, युझर इंटरफेस तयार करण्यासाठी एक अग्रगण्य जावास्क्रिप्ट लायब्ररी, या प्रयत्नात मदत करण्यासाठी एक शक्तिशाली साधन देते: स्ट्रिक्टमोड. स्ट्रिक्टमोड ही कोणतीही जादूची कांडी नाही जी तुमचा सर्व कोड आपोआप दुरुस्त करते; उलट, हे केवळ डेव्हलपमेंटसाठी एक साधन आहे जे तुम्हाला संभाव्य समस्या लवकर ओळखण्यास मदत करते, ज्यामुळे अधिक स्वच्छ, अधिक कार्यक्षम आणि भविष्यवेधी रिॲक्ट ॲप्लिकेशन्स तयार होतात.
रिॲक्ट स्ट्रिक्टमोड म्हणजे काय?
स्ट्रिक्टमोड हा रिॲक्टमधील एक हेतुपुरस्सर डेव्हलपमेंट मोड आहे जो त्याच्या वंशजांसाठी (descendants) अतिरिक्त तपासणी आणि चेतावणी सक्रिय करतो. हे तुमच्या कंपोनेंट्स आणि त्यांच्या कोडमधील संभाव्य समस्यांवर प्रकाश टाकण्यासाठी डिझाइन केले आहे, ज्या सामान्य डेव्हलपमेंट दरम्यान लक्षात येत नाहीत. हे अँटी-पॅटर्न्स, डेप्रिकेटेड (deprecated) फीचर्स आणि संभाव्य परफॉर्मन्स अडथळे प्रोडक्शनमध्ये मोठ्या समस्या बनण्यापूर्वी ओळखण्यास मदत करते. याचा विचार असा करा की जणू एक सतर्क कोड रिव्ह्यूअर डेव्हलपमेंट दरम्यान तुमच्या कंपोनेंट्सची सतत तपासणी करत आहे.
हे समजून घेणे महत्त्वाचे आहे की स्ट्रिक्टमोड केवळ डेव्हलपमेंट बिल्डमध्ये सक्रिय असतो. प्रोडक्शनमधील तुमच्या ॲप्लिकेशनच्या कामगिरीवर किंवा वर्तनावर त्याचा कोणताही परिणाम होत नाही. याचा अर्थ असा की तुम्ही वापरकर्त्यांच्या अनुभवावर परिणाम होण्याची चिंता न करता डेव्हलपमेंट दरम्यान त्याचा सुरक्षितपणे आणि उदारपणे वापर करू शकता.
स्ट्रिक्टमोड वापरण्याचे फायदे
स्ट्रिक्टमोड अनेक फायदे देतो, ज्यामुळे अधिक मजबूत आणि देखरेख करण्यायोग्य कोडबेस तयार होतो:
- असुरक्षित लाइफसायकल मेथड्स ओळखणे: स्ट्रिक्टमोड लेगसी लाइफसायकल मेथड्सच्या वापरास फ्लॅग करतो, ज्या विशेषतः समवर्ती रेंडरिंग (concurrent rendering) परिस्थितीत समस्या निर्माण करतात. उदाहरणार्थ, हे `componentWillMount`, `componentWillReceiveProps`, आणि `componentWillUpdate` सारख्या मेथड्सबद्दल चेतावणी देते, ज्यांचा अनेकदा गैरवापर होतो आणि असिंक्रोनस वातावरणात अनपेक्षित वर्तनास कारणीभूत ठरू शकतात. या मेथड्स डेप्रिकेटेड केल्या जात आहेत आणि भविष्यातील रिॲक्ट आवृत्त्यांमधून काढून टाकल्या जातील. ही ओळख तुम्हाला `getDerivedStateFromProps` किंवा `getSnapshotBeforeUpdate` सारख्या सुरक्षित पर्यायांकडे स्थलांतरित होण्यास मदत करते.
- डेप्रिकेटेड API वापराविषयी चेतावणी: जसा रिॲक्ट विकसित होत आहे, तसे काही APIs नवीन, अधिक कार्यक्षम पर्यायांसाठी डेप्रिकेटेड केले जातात. स्ट्रिक्टमोड तुम्हाला सतर्क करतो जेव्हा तुमचा कोड हे डेप्रिकेटेड APIs वापरतो, ज्यामुळे तुम्हाला शिफारस केलेल्या बदलांकडे स्थलांतरित होण्यासाठी पुरेसा वेळ मिळतो. हा सक्रिय दृष्टिकोन तुमचा कोडबेस अद्ययावत आणि भविष्यातील रिॲक्ट आवृत्त्यांशी सुसंगत राहण्याची खात्री करतो. जुन्या स्ट्रिंग रेफ्स (string refs) API चा वापर होत असलेल्या जागा शोधून त्यांना नवीन `createRef` API मध्ये स्थलांतरित करणे हे याचे एक उत्तम उदाहरण आहे.
- अनपेक्षित साइड इफेक्ट्स शोधणे: स्ट्रिक्टमोड असे कंपोनेंट्स ओळखण्यास मदत करतो जे अनपेक्षित साइड इफेक्ट्ससह रेंडर होतात. साइड इफेक्ट्स म्हणजे अशा क्रिया ज्या कंपोनेंटच्या स्कोपच्या बाहेर काहीतरी बदलतात, जसे की थेट DOM मध्ये बदल करणे किंवा असिंक्रोनस रिक्वेस्ट करणे. स्ट्रिक्टमोड हेतुपुरस्सर कंपोनेंट कन्स्ट्रक्टर्स आणि रेंडर मेथड्स सारख्या विशिष्ट फंक्शन्सना दोनदा कॉल (double-invokes) करतो, ज्यामुळे संभाव्य विसंगती आणि साइड इफेक्ट्स उघड होतात. जर तुमच्या कंपोनेंटचे रेंडर फंक्शन अनपेक्षितपणे त्याच्या स्कोपच्या बाहेर स्टेट बदलत असेल, तर डबल इन्व्होकेशनमुळे ही समस्या उघड होण्याची शक्यता आहे. हे चुकीच्या स्टेट मॅनेजमेंट किंवा ग्लोबल व्हेरिएबल्सच्या अपघाती बदलांशी संबंधित त्रुटी शोधण्यासाठी विशेषतः उपयुक्त आहे. कल्पना करा की एक फंक्शन रेंडरिंग दरम्यान ग्लोबल काउंटर वाढवते – स्ट्रिक्टमोड लगेचच हे चुकीचे वर्तन उघड करेल.
- फास्ट रिफ्रेश डेव्हलपमेंट अनुभव सक्षम करणे: स्ट्रिक्टमोड रिॲक्टच्या फास्ट रिफ्रेश फीचरसोबत चांगल्या प्रकारे काम करतो, ज्यामुळे डेव्हलपमेंट दरम्यान अधिक विश्वसनीय आणि जलद अपडेट्स मिळतात. जेव्हा तुम्ही एखादी फाइल संपादित करता तेव्हा फास्ट रिफ्रेश रिॲक्ट कंपोनेंट स्टेट जपून ठेवतो, ज्यामुळे तुम्हाला तुमची प्रगती न गमावता रिअल-टाइममध्ये बदल दिसतात. स्ट्रिक्टमोड तुमच्या कंपोनेंट्सना वारंवार रेंडरिंग आणि स्टेट अपडेट्ससाठी लवचिक बनवून फास्ट रिफ्रेशला योग्यरित्या कार्य करण्यास मदत करतो.
- की (Keys) प्रमाणित करणे: कंपोनेंट्सच्या याद्या रेंडर करताना, रिॲक्ट DOM कार्यक्षमतेने अपडेट करण्यासाठी `key` प्रॉपवर अवलंबून असतो. स्ट्रिक्टमोड तुम्हाला चेतावणी देतो जर की (keys) गहाळ असतील किंवा यादीमध्ये युनिक नसतील. चुकीच्या की (keys) वापरल्याने परफॉर्मन्स समस्या आणि अनपेक्षित रेंडरिंग वर्तन होऊ शकते, विशेषतः जेव्हा यादीमध्ये आयटम जोडले किंवा काढले जातात. उदाहरणार्थ, ॲरे इंडेक्सला की म्हणून वापरणे सुरुवातीला काम करू शकते, परंतु जेव्हा यादीची पुनर्रचना केली जाते तेव्हा समस्या निर्माण होऊ शकतात.
- अनपेक्षित बदलण्यायोग्य स्टेट (Mutable State) तपासणे: स्ट्रिक्टमोड अशा केसेस शोधण्यात मदत करतो जिथे तुम्ही अपघाताने एकाच स्टेटला अनेक कंपोनेंट्स किंवा तुमच्या ॲप्लिकेशनच्या भागांमधून बदलत आहात. हे स्टेट ऑब्जेक्टला तात्पुरते फ्रीज करून साध्य करते, ज्यामुळे तुम्ही ते थेट बदलण्याचा प्रयत्न केल्यास एरर येतो. हे वैशिष्ट्य गुंतागुंतीच्या स्टेट मॅनेजमेंट पॅटर्न्स असलेल्या जटिल ॲप्लिकेशन्समध्ये विशेषतः उपयुक्त आहे.
स्ट्रिक्टमोड कसे सक्षम करावे
स्ट्रिक्टमोड सक्षम करणे सोपे आहे. तुम्ही तुमच्या कंपोनेंट ट्रीच्या ज्या भागाची तपासणी करू इच्छिता, त्याला फक्त <React.StrictMode> कंपोनेंटने रॅप (wrap) करा. तुम्ही ते तुमच्या संपूर्ण ॲप्लिकेशनला किंवा विशिष्ट कंपोनेंट्सना लागू करू शकता ज्यात समस्या असू शकतात असे तुम्हाला वाटते.
संपूर्ण ॲप्लिकेशनवर स्ट्रिक्टमोड लागू करणे
तुमच्या संपूर्ण ॲप्लिकेशनसाठी स्ट्रिक्टमोड सक्षम करण्यासाठी, तुमच्या `index.js` किंवा `App.js` फाइलमधील रूट कंपोनेंटला रॅप करा:
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
विशिष्ट कंपोनेंट्सवर स्ट्रिक्टमोड लागू करणे
तुम्ही तुमच्या कंपोनेंट ट्रीच्या विशिष्ट भागांवरही स्ट्रिक्टमोड लागू करू शकता:
function MyComponent() {
return (
<div>
<Header />
<React.StrictMode>
<MySuspectComponent />
</React.StrictMode>
<Footer />
</div>
);
}
या उदाहरणात, केवळ MySuspectComponent आणि त्याचे वंशज (descendants) स्ट्रिक्टमोडच्या तपासणीच्या अधीन असतील.
सामान्य वापर प्रकरणे आणि उदाहरणे
चला काही व्यावहारिक उदाहरणे पाहूया की स्ट्रिक्टमोड तुम्हाला तुमच्या रिॲक्ट ॲप्लिकेशन्समधील संभाव्य समस्या ओळखण्यात आणि त्या दूर करण्यात कशी मदत करू शकतो:
१. असुरक्षित लाइफसायकल मेथड्स ओळखणे
डेप्रिकेटेड componentWillMount मेथड वापरणाऱ्या कंपोनेंटचा विचार करा:
class MyComponent extends React.Component {
componentWillMount() {
// Performing side effects here (e.g., fetching data)
console.log("Fetching data in componentWillMount");
}
render() {
return <div>Hello, world!</div>;
}
}
जेव्हा स्ट्रिक्टमोड सक्षम असतो, तेव्हा रिॲक्ट कन्सोलमध्ये एक चेतावणी देईल की componentWillMount डेप्रिकेटेड आहे आणि त्याऐवजी componentDidMount (कंपोनेंट माउंट झाल्यावर डेटा आणण्यासाठी) किंवा getDerivedStateFromProps (प्रॉप्सवर आधारित स्टेटसाठी) यांसारख्या सुरक्षित पर्यायांचा वापर केला पाहिजे.
२. अनपेक्षित साइड इफेक्ट्स शोधणे
कल्पना करा की एक कंपोनेंट रेंडरिंग दरम्यान अनवधानाने ग्लोबल व्हेरिएबलमध्ये बदल करतो:
let globalCounter = 0;
function MyComponent() {
globalCounter++; // Side effect during rendering
return <div>Counter: {globalCounter}</div>;
}
स्ट्रिक्टमोड MyComponent फंक्शनला दोनदा कॉल करेल, ज्यामुळे प्रत्येक रेंडर दरम्यान globalCounter दोनदा वाढेल. यामुळे अनपेक्षित साइड इफेक्ट लवकर उघड होईल आणि तुम्हाला कोड दुरुस्त करण्याची संधी मिळेल. काऊंटर व्यवस्थापित करण्यासाठी रिॲक्टच्या स्टेट मेकॅनिझमचा वापर करणे हा एक चांगला दृष्टिकोन आहे:
import React, { useState } from 'react';
function MyComponent() {
const [counter, setCounter] = useState(0);
// Example of where to fetch data and then set state
React.useEffect(() => {
// Perform any side effects like fetching data from an API
// and then update the state
setCounter(prevCounter => prevCounter + 1); // No side effect outside scope
}, []); // The empty array [] ensures this runs only once on mount
return <div>Counter: {counter}</div>;
}
३. याद्यांमधील की (Keys) प्रमाणित करणे
योग्य की (keys) शिवाय आयटम्सची यादी रेंडर करणाऱ्या कंपोनेंटचा विचार करा:
function MyListComponent() {
const items = ['Item 1', 'Item 2', 'Item 3'];
return (
<ul>
{items.map(item => <li>{item}</li>)} // Missing keys!
</ul>
);
}
स्ट्रिक्टमोड तुम्हाला चेतावणी देईल की की (keys) गहाळ आहेत आणि प्रत्येक यादी आयटमला त्या दिल्या पाहिजेत. ही चेतावणी तुम्हाला प्रत्येक <li> एलिमेंटला एक युनिक की प्रॉप जोडण्यासाठी मार्गदर्शन करेल. उदाहरणार्थ, जर तुमच्याकडे युनिक आयडी असलेल्या ऑब्जेक्ट्सचा ॲरे असेल, तर तुम्ही आयडीला की म्हणून वापरू शकता:
function MyListComponent() {
const items = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' },
];
return (
<ul>
{items.map(item => <li key={item.id}>{item.name}</li>)}
</ul>
);
}
स्ट्रिक्टमोड आणि थर्ड-पार्टी लायब्ररीज
स्ट्रिक्टमोड तुम्हाला तुमच्या रिॲक्ट ॲप्लिकेशन्समध्ये वापरल्या जाणाऱ्या थर्ड-पार्टी लायब्ररीजमधील संभाव्य समस्या ओळखण्यासही मदत करू शकतो. जर एखादी लायब्ररी डेप्रिकेटेड APIs वापरत असेल किंवा अनपेक्षित साइड इफेक्ट्स दाखवत असेल, तर स्ट्रिक्टमोड या समस्या उघड करेल, ज्यामुळे तुम्हाला ती लायब्ररी वापरणे सुरू ठेवायचे की पर्याय शोधायचा याबाबत माहितीपूर्ण निर्णय घेता येईल. हे लक्षात ठेवणे महत्त्वाचे आहे की तुम्ही थर्ड-पार्टी लायब्ररीजमधील समस्या "दुरुस्त" करू शकत नाही. तुमचे पर्याय साधारणपणे असे आहेत:
- एक पर्यायी लायब्ररी शोधा जी सक्रियपणे मेंटेन केली जाते आणि स्ट्रिक्टमोडद्वारे फ्लॅग केलेल्या पॅटर्न्स टाळते.
- लायब्ररीला फोर्क करा, समस्या स्वतः दुरुस्त करा आणि स्वतःची आवृत्ती मेंटेन करा (हे सामान्यतः फक्त लहान लायब्ररीजसाठीच व्यवहार्य आहे).
- चेतावणी स्वीकारा आणि संभाव्य धोके समजून घ्या.
स्ट्रिक्टमोडच्या मर्यादा
स्ट्रिक्टमोड हे एक मौल्यवान साधन असले तरी, त्याच्या मर्यादांबद्दल जागरूक असणे महत्त्वाचे आहे:
- केवळ डेव्हलपमेंटसाठी: स्ट्रिक्टमोड फक्त डेव्हलपमेंट मोडमध्ये कार्य करतो. तो प्रोडक्शनमध्ये कोणतीही रनटाइम तपासणी किंवा सुरक्षा प्रदान करत नाही.
- पूर्ण समाधान नाही: स्ट्रिक्टमोड संभाव्य समस्या ओळखण्यास मदत करतो परंतु तुमचा कोड पूर्णपणे बग-मुक्त असल्याची हमी देत नाही. तुमच्या ॲप्लिकेशनची गुणवत्ता सुनिश्चित करण्यासाठी सखोल चाचण्या लिहिणे आणि सर्वोत्तम पद्धतींचे पालन करणे अजूनही आवश्यक आहे.
- फॉल्स पॉझिटिव्ह: काही दुर्मिळ प्रकरणांमध्ये, स्ट्रिक्टमोड फॉल्स पॉझिटिव्ह निर्माण करू शकतो, विशेषतः जेव्हा कंपोनेंट्समधील गुंतागुंतीच्या परस्परक्रिया किंवा काही थर्ड-पार्टी लायब्ररीजशी व्यवहार करताना. चेतावणींचे काळजीपूर्वक विश्लेषण करणे आणि त्या खऱ्या समस्या दर्शवतात की केवळ डेव्हलपमेंट वातावरणातील निरुपद्रवी कलाकृती आहेत हे ठरवणे महत्त्वाचे आहे.
- परफॉर्मन्सवर परिणाम (किरकोळ): डबल इन्व्होकेशन्स आणि अतिरिक्त तपासणीमुळे, स्ट्रिक्टमोडचा डेव्हलपमेंट वातावरणावर थोडा परफॉर्मन्सवर परिणाम होतो. तथापि, हा परिणाम सामान्यतः नगण्य असतो आणि तुम्हाला स्ट्रिक्टमोड वापरण्यापासून परावृत्त करू नये. लक्षात ठेवा, तो फक्त डेव्हलपमेंट दरम्यान सक्रिय असतो, प्रोडक्शनमध्ये नाही.
स्ट्रिक्टमोड वापरण्यासाठी सर्वोत्तम पद्धती
स्ट्रिक्टमोडचे फायदे जास्तीत जास्त मिळवण्यासाठी, या सर्वोत्तम पद्धतींचा विचार करा:
- लवकर आणि वारंवार सक्षम करा: स्ट्रिक्टमोडला तुमच्या डेव्हलपमेंट वर्कफ्लोमध्ये शक्य तितक्या लवकर समाकलित करा. तुम्ही जितक्या लवकर त्याचा वापर सुरू कराल, तितके तुमच्या कोडबेसमध्ये खोलवर रुजण्यापूर्वी संभाव्य समस्या ओळखणे आणि दुरुस्त करणे सोपे होईल.
- चेतावणींना त्वरित प्रतिसाद द्या: स्ट्रिक्टमोडच्या चेतावणींकडे दुर्लक्ष करू नका. त्यांना कृती करण्यायोग्य आयटम म्हणून माना ज्यांची चौकशी आणि निराकरण करणे आवश्यक आहे. चेतावणींकडे दुर्लक्ष केल्याने भविष्यात अधिक गंभीर समस्या उद्भवू शकतात.
- सखोल चाचणी करा: स्ट्रिक्टमोड तुमच्या चाचणी प्रयत्नांना पूरक आहे परंतु त्यांची जागा घेत नाही. तुमच्या कंपोनेंट्सची अचूकता आणि मजबुती सुनिश्चित करण्यासाठी सर्वसमावेशक युनिट टेस्ट आणि इंटिग्रेशन टेस्ट लिहा.
- तुमचे निर्णय डॉक्युमेंट करा: जर तुम्हाला स्ट्रिक्टमोडची चेतावणी आढळली जी तुम्हाला फॉल्स पॉझिटिव्ह वाटत असेल किंवा तुम्ही विशिष्ट कारणास्तव दुर्लक्ष करण्याचे ठरवले असेल, तर तुमचा निर्णय स्पष्टपणे डॉक्युमेंट करा. यामुळे इतर डेव्हलपर्सना तुमचा तर्क समजण्यास आणि अनावश्यकपणे त्या समस्येवर परत येणे टाळण्यास मदत होईल. `// eslint-disable-next-line react/no-deprecated` सारख्या कमेंट्स तात्पुरत्या स्वरूपात एखाद्या विशिष्ट समस्येकडे दुर्लक्ष करण्यासाठी मौल्यवान ठरू शकतात, जर रिफॅक्टरिंग त्वरित शक्य नसेल, तरीही भविष्यातील कामासाठी त्याकडे लक्ष वेधले जाते.
- तुमच्या टीमला शिक्षित करा: तुमच्या डेव्हलपमेंट टीममधील सर्व सदस्यांना स्ट्रिक्टमोडचा उद्देश आणि फायदे समजले आहेत याची खात्री करा. त्यांना सातत्याने त्याचा वापर करण्यास आणि चेतावणींना त्वरित प्रतिसाद देण्यास प्रोत्साहित करा.
जागतिक संदर्भात स्ट्रिक्टमोड
रिॲक्टच्या स्ट्रिक्टमोडमागील तत्त्वे सार्वत्रिक आहेत आणि जगभरातील वेब डेव्हलपमेंट टीम्सना लागू होतात. तुमचे स्थान, संस्कृती किंवा तुम्ही वापरत असलेले विशिष्ट तंत्रज्ञान काहीही असले तरी, मजबूत, देखरेख करण्यायोग्य आणि भविष्यवेधी कोडची गरज सारखीच राहते. स्ट्रिक्टमोड टीम्सना सर्वोत्तम पद्धतींचे पालन करण्यास आणि सामान्य चुका टाळण्यास मदत करतो, ज्यामुळे उच्च-गुणवत्तेचे सॉफ्टवेअर आणि अधिक कार्यक्षम विकास प्रक्रिया साधता येतात.
विविध आंतरराष्ट्रीय वातावरणात काम करणाऱ्या टीम्ससाठी, स्ट्रिक्टमोड विशेषतः मौल्यवान असू शकतो. हे सुसंगततेला प्रोत्साहन देण्यास मदत करते आणि कोडिंग शैली किंवा विकास पद्धतींमधील फरकांमुळे उद्भवू शकणाऱ्या चुकांचा धोका कमी करते. मार्गदर्शक तत्त्वे आणि तपासणीचा एक समान संच प्रदान करून, स्ट्रिक्टमोड सहकार्याची सोय करतो आणि प्रत्येकजण समान मानकांनुसार काम करत आहे याची खात्री करतो.
निष्कर्ष
रिॲक्ट स्ट्रिक्टमोड एक शक्तिशाली साधन आहे जे तुमच्या डेव्हलपमेंट वातावरणात लक्षणीय वाढ करू शकते आणि तुमच्या रिॲक्ट ॲप्लिकेशन्सची गुणवत्ता सुधारू शकते. अतिरिक्त तपासणी आणि चेतावणी सक्षम करून, ते तुम्हाला संभाव्य समस्या लवकर ओळखण्यास मदत करते, ज्यामुळे अधिक स्वच्छ, अधिक कार्यक्षम आणि भविष्यवेधी कोड तयार होतो. जरी हे एक रामबाण उपाय नसले तरी, स्ट्रिक्टमोड कोणत्याही रिॲक्ट डेव्हलपरच्या टूलकिटमध्ये एक मौल्यवान भर आहे आणि त्याचे फायदे त्याच्या मर्यादांपेक्षा खूप जास्त आहेत.
स्ट्रिक्टमोडचा स्वीकार करून आणि सर्वोत्तम पद्धतींचे पालन करून, तुम्ही अधिक मजबूत, देखरेख करण्यायोग्य आणि स्केलेबल रिॲक्ट ॲप्लिकेशन्स तयार करू शकता जे अपवादात्मक वापरकर्ता अनुभव देतात.