JavaScript डेकोरेटर्स प्रस्तावाचे सखोल विश्लेषण, ज्यात त्याचे सिंटॅक्स, उपयोग, फायदे आणि आधुनिक JavaScript विकासावरील संभाव्य परिणाम यांचा समावेश आहे.
JavaScript डेकोरेटर्स प्रस्ताव: पद्धत वर्धन आणि मेटाडेटा ॲनोटेशन
JavaScript, एक गतिशील आणि विकसित होणारी भाषा म्हणून, कोडची वाचनीयता, व्यवस्थापन क्षमता आणि विस्तार क्षमता सुधारण्याचे सतत मार्ग शोधत असते. या पैलूंवर लक्ष केंद्रित करण्याचे उद्दिष्ट असलेल्या सर्वात अपेक्षित वैशिष्ट्यांपैकी एक म्हणजे डेकोरेटर्स प्रस्ताव. हा लेख JavaScript डेकोरेटर्सचा एक विस्तृत आढावा देतो, त्यांच्या सिंटॅक्स, क्षमता आणि आधुनिक JavaScript विकासावरील संभाव्य परिणामांचे विश्लेषण करतो. सध्या स्टेज 3 चा प्रस्ताव असला तरी, डेकोरेटर्सचा अँंग्युलरसारख्या फ्रेमवर्कमध्ये मोठ्या प्रमाणावर वापर केला जातो आणि Babel सारख्या ट्रांसपायलरद्वारे ते अधिकाधिक स्वीकारले जात आहेत. यामुळे ते कोणत्याही आधुनिक JavaScript डेव्हलपरसाठी महत्त्वपूर्ण ठरतात.
JavaScript डेकोरेटर्स म्हणजे काय?
डेकोरेटर्स हे पायथन आणि जावासारख्या इतर भाषांमधून घेतलेले डिझाइन पॅटर्न आहेत. मूलत: ते एक विशेष प्रकारचे डिक्लेरेशन (Declaration) आहे जे क्लास, मेथड, एक्सेसर, प्रॉपर्टी किंवा पॅरामीटरला जोडले जाऊ शकते. डेकोरेटर्स @expression
सिंटॅक्स वापरतात, जिथे expression
चे मूल्य एका फंक्शनमध्ये रूपांतरित झाले पाहिजे. हे फंक्शन डेकोरेटेड डिक्लेरेशनबद्दल माहितीसह रनटाइमला कॉल केले जाईल.
डेकोरेटर्स म्हणजे कोडमध्ये थेट बदल न करता, विद्यमान कोडमध्ये अतिरिक्त कार्यक्षमता किंवा मेटाडेटा जोडण्याचा एक मार्ग आहे. हे अधिक घोषणात्मक (Declarative) आणि व्यवस्थापित करण्यायोग्य (Maintainable) कोडबेस (Codebase) तयार करते.
मूलभूत सिंटॅक्स आणि वापर
एक साधा डेकोरेटर हे एक फंक्शन आहे जे ते कशास डेकोरेट करत आहे यावर अवलंबून एक, दोन किंवा तीन आर्ग्युमेंट्स घेते:
- क्लास डेकोरेटरसाठी, आर्ग्युमेंट क्लासचा कन्स्ट्रक्टर (Constructor) असतो.
- मेथड किंवा एक्सेसर डेकोरेटरसाठी, आर्ग्युमेंट्स हे लक्ष्य ऑब्जेक्ट (क्लास प्रोटोटाइप किंवा स्टॅटिक सदस्यांसाठी क्लास कन्स्ट्रक्टर), प्रॉपर्टी की (मेथड किंवा एक्सेसरचे नाव) आणि प्रॉपर्टी डिस्क्रिप्टर (Property descriptor) असतात.
- प्रॉपर्टी डेकोरेटरसाठी, आर्ग्युमेंट्स हे लक्ष्य ऑब्जेक्ट आणि प्रॉपर्टी की असतात.
- पॅरामीटर डेकोरेटरसाठी, आर्ग्युमेंट्स हे लक्ष्य ऑब्जेक्ट, प्रॉपर्टी की आणि फंक्शनच्या पॅरामीटर लिस्टमध्ये पॅरामीटरचा इंडेक्स असतात.
क्लास डेकोरेटर्स
क्लास डेकोरेटर क्लास कन्स्ट्रक्टरला लागू केला जातो. याचा उपयोग क्लास डेफिनेशनचे निरीक्षण, सुधारणा किंवा पुनर्स्थित करण्यासाठी केला जाऊ शकतो. क्लासला फ्रेमवर्क किंवा लायब्ररीमध्ये रजिस्टर करणे हे एक सामान्य उदाहरण आहे.
उदाहरण: क्लास इंस्टेंटिएशन लॉग करणे
function logClass(constructor: Function) {
return class extends constructor {
constructor(...args: any[]) {
super(...args);
console.log(`New instance of ${constructor.name} created.`);
}
};
}
@logClass
class MyClass {
constructor(public message: string) {
}
}
const instance = new MyClass("Hello, Decorators!"); // Output: New instance of MyClass created.
या उदाहरणामध्ये, logClass
डेकोरेटर MyClass
कन्स्ट्रक्टरमध्ये बदल करतो आणि प्रत्येक वेळी नवीन इंस्टन्स तयार झाल्यावर एक संदेश लॉग करतो.
मेथड डेकोरेटर्स
मेथड डेकोरेटर्स क्लासमधील मेथड्सला लागू केले जातात. मेथडच्या वर्तनाचे निरीक्षण, सुधारणा किंवा पुनर्स्थित करण्यासाठी त्यांचा वापर केला जाऊ शकतो. हे मेथड कॉल्स लॉग करणे, आर्ग्युमेंट्स व्हॅलिडेट करणे किंवा कॅशिंग (caching) लागू करणे यासारख्या गोष्टींसाठी उपयुक्त आहे.
उदाहरण: मेथड कॉल्स लॉग करणे
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling method ${propertyKey} with arguments: ${JSON.stringify(args)}`);
const result = originalMethod.apply(this, args);
console.log(`Method ${propertyKey} returned: ${result}`);
return result;
};
return descriptor;
}
class Calculator {
@logMethod
add(a: number, b: number): number {
return a + b;
}
}
const calculator = new Calculator();
const sum = calculator.add(5, 3); // Output: Calling method add with arguments: [5,3]
// Output: Method add returned: 8
logMethod
डेकोरेटर add
मेथडचे आर्ग्युमेंट्स आणि रिटर्न व्हॅल्यू लॉग करतो.
एक्सेसर डेकोरेटर्स
एक्सेसर डेकोरेटर्स मेथड डेकोरेटर्ससारखेच असतात, परंतु ते getter किंवा setter मेथड्सना लागू होतात. प्रॉपर्टीजचा ॲक्सेस नियंत्रित करण्यासाठी किंवा व्हॅलिडेशन लॉजिक जोडण्यासाठी त्यांचा वापर केला जाऊ शकतो.
उदाहरण: सेटर व्हॅल्यूज व्हॅलिडेट करणे
function validate(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalSet = descriptor.set;
descriptor.set = function (value: number) {
if (value < 0) {
throw new Error("Value must be non-negative.");
}
originalSet.call(this, value);
};
}
class Temperature {
private _celsius: number = 0;
@validate
set celsius(value: number) {
this._celsius = value;
}
get celsius(): number {
return this._celsius;
}
}
const temperature = new Temperature();
temperature.celsius = 25; // OK
// temperature.celsius = -10; // Throws an error
validate
डेकोरेटर खात्री करतो की celsius
सेटर केवळ नॉन-निगेटिव्ह व्हॅल्यूज स्वीकारतो.
प्रॉपर्टी डेकोरेटर्स
प्रॉपर्टी डेकोरेटर्स क्लास प्रॉपर्टीजना लागू केले जातात. प्रॉपर्टीबद्दल मेटाडेटा परिभाषित करण्यासाठी किंवा त्याचे वर्तन सुधारण्यासाठी त्यांचा वापर केला जाऊ शकतो.
उदाहरण: आवश्यक प्रॉपर्टी परिभाषित करणे
function required(target: any, propertyKey: string) {
let existingRequiredProperties: string[] = target.__requiredProperties__ || [];
existingRequiredProperties.push(propertyKey);
target.__requiredProperties__ = existingRequiredProperties;
}
class UserProfile {
@required
name: string;
age: number;
constructor(data: any) {
this.name = data.name;
this.age = data.age;
const requiredProperties: string[] = (this.constructor as any).prototype.__requiredProperties__ || [];
requiredProperties.forEach(property => {
if (!this[property]) {
throw new Error(`Missing required property: ${property}`);
}
});
}
}
// const user = new UserProfile({}); // Throws an error: Missing required property: name
const user = new UserProfile({ name: "John Doe" }); // OK
required
डेकोरेटर name
प्रॉपर्टी आवश्यक म्हणून चिन्हांकित करतो. त्यानंतर कन्स्ट्रक्टर तपासतो की सर्व आवश्यक प्रॉपर्टीज उपस्थित आहेत की नाही.
पॅरामीटर डेकोरेटर्स
पॅरामीटर डेकोरेटर्स फंक्शन पॅरामीटर्सना लागू केले जातात. पॅरामीटरबद्दल मेटाडेटा जोडण्यासाठी किंवा त्याचे वर्तन सुधारण्यासाठी त्यांचा वापर केला जाऊ शकतो. ते इतर प्रकारच्या डेकोरेटर्सपेक्षा कमी सामान्य आहेत.
उदाहरण: डिपेंडेंसी इंजेक्ट करणे
import 'reflect-metadata';
const Injectable = (): ClassDecorator => {
return (target: any) => {
Reflect.defineMetadata('injectable', true, target);
};
};
const Inject = (token: any): ParameterDecorator => {
return (target: any, propertyKey: string | symbol | undefined, parameterIndex: number) => {
Reflect.defineMetadata('design:paramtypes', [token], target, propertyKey!)
};
};
@Injectable()
class DatabaseService {
connect() {
console.log("Connecting to the database...");
}
}
class UserService {
private databaseService: DatabaseService;
constructor(@Inject(DatabaseService) databaseService: DatabaseService) {
this.databaseService = databaseService;
}
getUser(id: number) {
this.databaseService.connect();
console.log(`Fetching user with ID: ${id}`);
}
}
const databaseService = new DatabaseService();
const userService = new UserService(databaseService);
userService.getUser(123);
या उदाहरणामध्ये, आम्ही reflect-metadata
वापरत आहोत (JavaScript/TypeScript मध्ये डिपेंडेंसी इंजेक्शन (Dependency injection) सह कार्य करताना ही एक सामान्य पद्धत आहे). @Inject
डेकोरेटर UserService कन्स्ट्रक्टरला DatabaseService चा इंस्टन्स इंजेक्ट करण्यास सांगतो. जरी वरील उदाहरण पुढील सेटअपशिवाय पूर्णपणे कार्यान्वित होऊ शकत नाही, तरी ते अपेक्षित परिणाम दर्शवते.
उपयोग आणि फायदे
डेकोरेटर्स विविध फायदे देतात आणि ते विविध उपयोगांसाठी वापरले जाऊ शकतात:
- मेटाडेटा ॲनोटेशन: डेकोरेटर्सचा उपयोग क्लासेस, मेथड्स आणि प्रॉपर्टीजला मेटाडेटा जोडण्यासाठी केला जाऊ शकतो. हा मेटाडेटा फ्रेमवर्क आणि लायब्ररीद्वारे अतिरिक्त कार्यक्षमता प्रदान करण्यासाठी वापरला जाऊ शकतो, जसे की डिपेंडेंसी इंजेक्शन, राऊटिंग आणि व्हॅलिडेशन.
- एस्पेक्ट-ओरिएंटेड प्रोग्रामिंग (AOP): डेकोरेटर्स अतिरिक्त वर्तन (Behavior) असलेल्या मेथड्सला रॅप (Wrap) करून लॉगिंग, सुरक्षा आणि ट्रान्झॅक्शन मॅनेजमेंटसारख्या AOP संकल्पना लागू करू शकतात.
- कोड रियुसेबिलिटी: डेकोरेटर्स रियुसेबल डेकोरेटर्समध्ये सामान्य कार्यक्षमतेला एक्स्ट्रॅक्ट करण्याची परवानगी देऊन कोड रियुसेबिलिटीला प्रोत्साहन देतात.
- सुधारित वाचनीयता: डेकोरेटर्स चिंतांचे विभाजन करून आणि बॉयलरप्लेट कोड कमी करून कोड अधिक वाचनीय आणि घोषणात्मक बनवतात.
- फ्रेमवर्क इंटिग्रेशन: अँंग्युलर, NestJS आणि MobX सारख्या लोकप्रिय JavaScript फ्रेमवर्कमध्ये डेकोरेटर्सचा मोठ्या प्रमाणावर उपयोग कंपोनंट्स, सर्व्हिसेस आणि इतर फ्रेमवर्क-विशिष्ट संकल्पना परिभाषित करण्यासाठी अधिक घोषणात्मक आणि स्पष्टपणे केला जातो.
वास्तविक जगातील उदाहरणे आणि आंतरराष्ट्रीय विचार
विविध प्रोग्रामिंग संदर्भांमध्ये डेकोरेटर्सची मूळ संकल्पना समान असली तरी, त्यांचा उपयोग विशिष्ट फ्रेमवर्क किंवा लायब्ररीवर आधारित बदलू शकतो. येथे काही उदाहरणे दिली आहेत:
- अँंग्युलर (Google द्वारे विकसित, जागतिक स्तरावर वापरले जाते): अँंग्युलर कंपोनंट्स, सर्व्हिसेस आणि डायरेक्टिव्हज परिभाषित करण्यासाठी डेकोरेटर्सचा मोठ्या प्रमाणावर वापर करते. उदाहरणार्थ,
@Component
डेकोरेटरचा उपयोग त्याच्या टेम्पलेट, स्टाईल्स आणि इतर मेटाडेटासह UI कंपोनंट परिभाषित करण्यासाठी केला जातो. हे विविध पार्श्वभूमीच्या डेव्हलपर्सना प्रमाणित दृष्टिकोन वापरून गुंतागुंतीचे यूजर इंटरफेस (User interface) सहजपणे तयार आणि व्यवस्थापित करण्यास अनुमती देते.@Component({ selector: 'app-my-component', templateUrl: './my-component.html', styleUrls: ['./my-component.css'] }) class MyComponent { // Component logic here }
- NestJS (अँंग्युलरद्वारे प्रेरित Node.js फ्रेमवर्क, जागतिक स्तरावर स्वीकारले जाते): NestJS डेकोरेटर्सचा उपयोग कंट्रोलर्स, रूट्स आणि मॉड्यूल्स परिभाषित करण्यासाठी करते.
@Controller
आणि@Get
डेकोरेटर्सचा उपयोग API एंडपॉइंट्स (API endpoints) आणि त्यांचे संबंधित हँडलर्स (handlers) परिभाषित करण्यासाठी केला जातो. हे डेव्हलपरच्या भौगोलिक स्थानाचा विचार न करता स्केलेबल (Scalable) आणि व्यवस्थापित करण्यायोग्य (Maintainable) सर्व्हर-साइड ॲप्लिकेशन्स (Server-side applications) तयार करण्याची प्रक्रिया सुलभ करते.@Controller('users') class UsersController { @Get() findAll(): string { return 'This action returns all users'; } }
- MobX (स्टेट मॅनेजमेंट लायब्ररी, React ॲप्लिकेशन्समध्ये जागतिक स्तरावर मोठ्या प्रमाणावर वापरली जाते): MobX डेकोरेटर्सचा उपयोग ऑब्झर्वेबल (Observable) प्रॉपर्टीज आणि कंप्यूटेड व्हॅल्यूज (Computed values) परिभाषित करण्यासाठी करते.
@observable
आणि@computed
डेकोरेटर्स डेटातील बदलांना आपोआप ट्रॅक करतात आणि त्यानुसार UI अपडेट करतात. हे डेव्हलपर्सना आंतरराष्ट्रीय प्रेक्षकांसाठी प्रतिसाद देणारे आणि कार्यक्षम यूजर इंटरफेस (User interface) तयार करण्यास मदत करते, ज्यामुळे गुंतागुंतीच्या डेटा फ्लोमध्येदेखील युजरचा अनुभव सुरळीत राहतो.class Store { @observable count = 0; @computed get doubledCount() { return this.count * 2; } increment() { this.count++; } }
आंतरराष्ट्रीय स्तरावरील विचार: जागतिक स्तरावरील प्रेक्षकांना लक्ष्य करणाऱ्या प्रोजेक्ट्समध्ये डेकोरेटर्स वापरताना, आंतरराष्ट्रीयकरण (i18n) आणि स्थानिकीकरण (l10n) विचारात घेणे महत्त्वाचे आहे. डेकोरेटर्स स्वतः i18n/l10n ला थेट हँडल करत नसले तरी, ते खालीलद्वारे प्रक्रियेस वर्धित करण्यासाठी वापरले जाऊ शकतात:
- भाषांतरासाठी मेटाडेटा जोडणे: भाषांतरित करण्याची आवश्यकता असलेल्या प्रॉपर्टीज किंवा मेथड्स चिन्हांकित करण्यासाठी डेकोरेटर्सचा उपयोग केला जाऊ शकतो. त्यानंतर हा मेटाडेटा संबंधित टेक्स्ट एक्स्ट्रॅक्ट (Extract) आणि भाषांतरित करण्यासाठी i18n लायब्ररीद्वारे वापरला जाऊ शकतो.
- डायनॅमिकली भाषांतर लोड करणे: युजरच्या लोकेलवर (Locale) आधारित भाषांतर डायनॅमिकली लोड करण्यासाठी डेकोरेटर्सचा उपयोग केला जाऊ शकतो. हे सुनिश्चित करते की ॲप्लिकेशन युजरच्या आवडीच्या भाषेत दर्शविले जाईल, मग त्यांचे स्थान काहीही असो.
- दिनांक आणि संख्या फॉरमॅट करणे: युजरच्या लोकेलनुसार (Locale) दिनांक आणि संख्या फॉरमॅट करण्यासाठी डेकोरेटर्सचा उपयोग केला जाऊ शकतो. हे सुनिश्चित करते की दिनांक आणि संख्या सांस्कृतिकदृष्ट्या योग्य स्वरूपात दर्शविल्या जातील.
उदाहरणार्थ, `@Translatable` नावाचा एक डेकोरेटर (Decorator) आहे जो प्रॉपर्टीला भाषांतरित करण्याची आवश्यकता आहे म्हणून चिन्हांकित करतो. मग एक i18n लायब्ररी कोडबेस स्कॅन (Scan) करू शकते, `@Translatable` ने चिन्हांकित केलेल्या सर्व प्रॉपर्टीज शोधू शकते आणि भाषांतरासाठी टेक्स्ट एक्स्ट्रॅक्ट (Extract) करू शकते. भाषांतरानंतर, लायब्ररी युजरच्या लोकेलवर (Locale) आधारित मूळ टेक्स्टला भाषांतरित केलेल्या व्हर्जनने (Version) बदलू शकते. हा दृष्टिकोन i18n/l10n च्या अधिक व्यवस्थित आणि व्यवस्थापित करण्यायोग्य (Maintainable) वर्कफ्लोला (Workflow) प्रोत्साहन देतो, विशेषत: मोठ्या आणि गुंतागुंतीच्या ॲप्लिकेशन्समध्ये.
प्रस्तावाची वर्तमान स्थिती आणि ब्राउझर सपोर्ट
JavaScript डेकोरेटर्स प्रस्ताव सध्या TC39 मानकीकरण प्रक्रियेत स्टेज 3 वर आहे. याचा अर्थ असा आहे की प्रस्ताव तुलनेने स्थिर आहे आणि भविष्यातील ECMAScript स्पेसिफिकेशनमध्ये (Specification) तो समाविष्ट केला जाण्याची शक्यता आहे.
डेकोरेटर्ससाठी मूळ ब्राउझर सपोर्ट अजूनही मर्यादित असला तरी, Babel किंवा TypeScript कंपायलरसारख्या ट्रांसपायलरचा (Transpilers) वापर करून ते बहुतेक आधुनिक JavaScript प्रोजेक्ट्समध्ये वापरले जाऊ शकतात. ही टूल्स (Tools) डेकोरेटर सिंटॅक्सला (Syntax) स्टँडर्ड JavaScript कोडमध्ये रूपांतरित करतात जो कोणत्याही ब्राउझर किंवा Node.js वातावरणात कार्यान्वित केला जाऊ शकतो.
Babel वापरणे: Babel सह डेकोरेटर्स वापरण्यासाठी, आपल्याला @babel/plugin-proposal-decorators
प्लगइन (Plugin) इंस्टॉल (Install) करणे आणि आपल्या Babel कॉन्फिगरेशन फाईलमध्ये (.babelrc
किंवा babel.config.js
) कॉन्फिगर (Configure) करणे आवश्यक आहे. आपल्याला `@babel/plugin-proposal-class-properties` ची देखील आवश्यकता असेल.
// babel.config.js
module.exports = {
presets: ['@babel/preset-env'],
plugins: [
['@babel/plugin-proposal-decorators', { legacy: true }],
['@babel/plugin-proposal-class-properties', { loose: true }]
],
};
TypeScript वापरणे: TypeScript मध्ये डेकोरेटर्ससाठी बिल्ट-इन सपोर्ट (Built-in support) आहे. आपल्याला आपल्या tsconfig.json
फाईलमध्ये experimentalDecorators
कंपायलर (Compiler) पर्याय सक्षम करणे आवश्यक आहे.
// tsconfig.json
{
"compilerOptions": {
"target": "es5",
"experimentalDecorators": true,
"emitDecoratorMetadata": true, // Optional, but useful for dependency injection
}
}
`emitDecoratorMetadata` पर्यायाकडे लक्ष द्या. हे डेकोरेटर्सद्वारे डिपेंडेंसी इंजेक्शन (Dependency injection) सक्षम करण्यासाठी `reflect-metadata` सारख्या लायब्ररीसह कार्य करते.
संभाव्य परिणाम आणि भविष्यातील दिशा
JavaScript डेकोरेटर्स प्रस्तावात आपण JavaScript कोड कसा लिहितो यावर महत्त्वपूर्ण परिणाम करण्याची क्षमता आहे. क्लासेस, मेथड्स आणि प्रॉपर्टीजना कार्यक्षमता जोडण्याचा अधिक घोषणात्मक (Declarative) आणि स्पष्ट मार्ग प्रदान करून, डेकोरेटर्स कोडची वाचनीयता, व्यवस्थापन क्षमता आणि रियुसेबिलिटी सुधारू शकतात.
जसजसा प्रस्ताव मानकीकरण प्रक्रियेतून पुढे जाईल आणि अधिकाधिक स्वीकारला जाईल, तसतसे अधिक फ्रेमवर्क आणि लायब्ररी अधिक अंतर्ज्ञानी (Intuitive) आणि शक्तिशाली डेव्हलपर अनुभव देण्यासाठी डेकोरेटर्स स्वीकारण्याची अपेक्षा करू शकतो.
शिवाय, डेकोरेटर्सची मेटाडेटा क्षमता टूलींग (Tooling) आणि कोड ॲनालिसिससाठी (Code analysis) नवीन शक्यता सक्षम करू शकते. उदाहरणार्थ, लिंटर्स (Linters) आणि कोड एडिटर्स (Code editors) अधिक अचूक आणि संबंधित सूचना आणि एरर मेसेजेस (Error messages) प्रदान करण्यासाठी डेकोरेटर मेटाडेटाचा उपयोग करू शकतात.
निष्कर्ष
JavaScript डेकोरेटर्स हे एक शक्तिशाली आणि आशादायक वैशिष्ट्य आहे जे आधुनिक JavaScript विकासास लक्षणीयरीत्या वर्धित करू शकते. त्यांचे सिंटॅक्स (Syntax), क्षमता आणि संभाव्य उपयोग समजून घेऊन, डेव्हलपर्स अधिक व्यवस्थापित करण्यायोग्य (Maintainable), वाचनीय आणि रियुसेबल (Reusable) कोड लिहिण्यासाठी डेकोरेटर्सचा लाभ घेऊ शकतात. मूळ ब्राउझर सपोर्ट अजूनही विकसित होत असला तरी, Babel आणि TypeScript सारखे ट्रांसपायलर (Transpilers) आज बहुतेक JavaScript प्रोजेक्ट्समध्ये डेकोरेटर्स वापरणे शक्य करतात. जसा प्रस्ताव मानकीकरणाकडे वाटचाल करत आहे आणि अधिकाधिक स्वीकारला जात आहे, डेकोरेटर्स JavaScript डेव्हलपरच्या शस्त्रागारातील (Arsenal) एक आवश्यक टूल बनण्याची शक्यता आहे.