TypeScript using कीवर्ड आणि Explicit Resource Management
प्रोडक्शनमध्ये मेमरी लीक (Memory leaks) अनेकदा एकाच चुकीमुळे होतात: डेव्हलपर्स रिसोर्सेस (resources) मिळवतात पण ते रिलीज करायला विसरतात.
एरर आल्यानंतरही डेटाबेस कनेक्शन्स (Database connections) उघडे राहतात. फाईल हँडल्स (File handles) सिस्टम रिसोर्सेसचा वापर करतात. WebSocket क्लायंट्स मृत सर्व्हरशी कनेक्टेड राहतात. जेव्हा तुम्ही finally ब्लॉक्समध्ये मॅन्युअल क्लीनअपवर अवलंबून असता, तेव्हा असे घडते.
TypeScript चा using कीवर्ड ही समस्या सोडवतो. हा ECMAScript Explicit Resource Management प्रस्तावाचा एक भाग आहे. तो 'disposable pattern' द्वारे क्लीनअपची खात्री देतो. जेव्हा एखादा रिसोर्स त्याच्या स्कोपमधून (scope) बाहेर पडतो, तेव्हा TypeScript त्याची 'disposal method' आपोआप चालवते.
तुम्हाला आता मॅन्युअल finally ब्लॉक्सची गरज नाही. तुम्ही क्लीनअप करायला विसरणार नाही आणि कनेक्शन्स लीक होणार नाहीत.
हे कसे कार्य करते:
usingकीवर्ड रिसोर्सेस स्कोपमधून बाहेर पडल्यावर त्यांचे डिस्पोजल (disposal) सुनिश्चित करतो.- 'Disposable' रिसोर्सेस सिंक (sync) कामांसाठी
Symbol.disposeकिंवा असिंक (async) कामांसाठीSymbol.asyncDisposeलागू करतात. - TypeScript
usingडिक्लेरेशनचे रूपांतरtry-finallyब्लॉक्समध्ये करते, ज्यामध्ये एक ऑटोमॅटिक डिस्पोजल स्टॅक असतो. - हा पॅटर्न अर्ली रिटर्न (early returns), थ्रो केलेल्या एक्सेप्शन्स (exceptions) किंवा विसरलेल्या कोडमुळे होणारे लीक रोखतो.
डेटाबेस कनेक्शन्स, फाईल हँडल्स, लॉक्स (locks) किंवा टाइमर्स यांसारख्या निश्चित जीवनकाल (lifetime) असलेल्या कोणत्याही रिसोर्ससाठी using वापरा.
ही यंत्रणा 'disposal protocol' वापरते. ऑब्जेक्ट्स Symbol.dispose द्वारे की (key) केलेली मेथड लागू करतात. जेव्हा स्कोप सामान्य पूर्णता, रिटर्न किंवा एक्सेप्शनद्वारे बाहेर पडतो, तेव्हा TypeScript ती मेथड कॉल करते.
फाईल हँडलचे उदाहरण:
class FileHandle {
private handle: number;
constructor(path: string) {
this.handle = openFileSync(path);
}
[Symbol.dispose]() {
if (this.handle !== -1) {
closeFileSync(this.handle);
this.handle = -1;
}
}
read(buffer: Buffer): number {
return readSync(this.handle, buffer);
}
}
function processFile(path: string) {
using file = new FileHandle(path);
const buffer = Buffer.alloc(1024);
file.read(buffer);
}
डिस्पोजल एका जनरेट केलेल्या finally ब्लॉक मध्ये चालते. फंक्शनमध्ये एरर आल्यास किंवा फंक्शन लवकर रिटर्न झाल्यासही ते चालते.
TypeScript एक 'disposal stack' मेंटेन करते. तुम्ही ज्या क्रमाने रिसोर्सेस मिळवले आहेत, त्याच्या उलट क्रमाने ते डिस्पोज करते. हे बहुतेक क्लीनअप लॉजिकसाठी नैसर्गिक डिपेंडन्सी ऑर्डरशी (dependency order) जुळते.
असिंक्रोनस (asynchronous) क्लीनअपसाठी await using वापरा. यासाठी रिसोर्सने Symbol.asyncDispose लागू करणे आवश्यक आहे. TypeScript पुढे जाण्यापूर्वी रिटर्न केलेल्या Promise ची प्रतीक्षा (await) करेल.
यशस्वी होण्यासाठी तीन नियम:
- तुमच्या डिस्पोजल मेथड्समध्ये एक्सेप्शन्स थ्रो करू नका. त्याऐवजी एरर्स अंतर्गत कॅच (catch) करा आणि लॉग करा.
- सिंक्रोनस
Symbol.disposeमेथडमध्ये असिंक ऑपरेशन्स वापरू नका. त्याऐवजीSymbol.asyncDisposeवापरा. - लक्षात ठेवा की
usingडिक्लेरेशन 'block-scoped' असतात.ifब्लॉक मधील रिसोर्स तो ब्लॉक संपल्यावर डिस्पोज होतो, फंक्शन संपल्यावर नाही.
हा पॅटर्न नगण्य रनटाइम कॉस्टसह (runtime cost) सुरक्षितता प्रदान करतो.
Source: https://dev.to/jsmanifest/typescript-using-keyword-and-explicit-resource-management-done-right-22pg
