जब एक टीम / कंपनी एक फ्रेमवर्क / कंपाइलर / टूल-सेट तैयार करती है, तो उनके पास पहले से ही कुछ अनुभव होता है, सर्वोत्तम प्रथाओं का सेट। वे इसे दिशानिर्देश के रूप में साझा करते हैं। दिशानिर्देश सिफारिशें हैं । यदि आपको कोई पसंद नहीं है तो आप उनकी उपेक्षा कर सकते हैं। कंपाइलर अभी भी आपके कोड को संकलित करेगा । हालांकि जब रोम में ...
यह मेरी दृष्टि है कि टाइपस्क्रिप्ट टीम क्यों नहीं I
-प्रूफिंग इंटरफेस की सिफारिश करती है।
I
-इंटरफ़िक्स-फ़ॉर-इंटरफ़ेस समर्थकों से मुख्य तर्क यह है कि प्रीफ़िक्सिंग तुरंत ग्रॉकिंग (पीकिंग) के लिए सहायक है कि क्या प्रकार एक इंटरफ़ेस है। कथन है कि उपसर्ग तुरंत ग्रैकिंग के लिए मददगार है (झांकना) हंगेरियन अंकन की एक अपील है । I
इंटरफ़ेस नाम के लिए उपसर्ग, C
वर्ग के लिए, A
सार वर्ग के लिए, s
स्ट्रिंग चर के लिए, c
कांस्टेबल चर के लिए, i
पूर्णांक चर के लिए। मैं मानता हूं कि इस तरह की नाम सजावट आपको पहचानकर्ता पर माउस लहराए बिना या हॉट-की के माध्यम से परिभाषा टाइप करने के लिए नेविगेट करने के बिना जानकारी प्रदान कर सकती है। यह छोटा सा लाभ हंगेरियन नोटेशन द्वारा दिया गया है नुकसान और अन्य कारणों से उल्लिखित है। समकालीन रूपरेखा में हंगेरियन नोटेशन का उपयोग नहीं किया जाता है। सी # हैI
ऐतिहासिक कारणों (COM) के कारण इंटरफेस के लिए उपसर्ग (और यह C # में एकमात्र उपसर्ग है)। .NET आर्किटेक्ट में से एक में (ब्रैड अब्राम) को लगता है कि यह उपसर्ग का उपयोग नहीं करनाI
बेहतर होता । टाइपस्क्रिप्ट COM-लीगेसी-मुक्त है, क्योंकि इसमें नो I
-प्रिफ़िक्स-फॉर-इंटरफ़ेस नियम है।
कारण # 2 I
-विक्षेप उपसर्ग सिद्धांत का उल्लंघन करता है
मान लेते हैं कि आपको कुछ ब्लैक-बॉक्स मिलता है। आपको कुछ प्रकार के संदर्भ मिलते हैं जो आपको उस बॉक्स के साथ बातचीत करने की अनुमति देते हैं। आपको इसकी परवाह नहीं करनी चाहिए कि यह एक इंटरफेस है या एक क्लास। आप बस इसके इंटरफ़ेस भाग का उपयोग करें। यह जानने की मांग करना कि यह क्या है (इंटरफ़ेस, विशिष्ट कार्यान्वयन या अमूर्त वर्ग) एनकैप्सुलेशन का उल्लंघन है।
उदाहरण: मान लें कि आपको एपीआई डिजाइन मिथक को ठीक करने की आवश्यकता है : अपने कोड में अनुबंध के रूप में ICar
इंटरफ़ेस जैसे इंटरफ़ेस हटाएं और Car
इसके बजाय आधार-वर्ग का उपयोग करें। फिर आपको सभी उपभोक्ताओं में ऐसा प्रतिस्थापन करने की आवश्यकता है। I
-निफिक्स ब्लैक-बॉक्स कार्यान्वयन विवरण पर उपभोक्ताओं की अंतर्निहित निर्भरता की ओर जाता है।
कारण # 3 बुरे नामकरण से सुरक्षा
डेवलपर्स नामों के बारे में ठीक से सोचने के लिए आलसी हैं। नामकरण कंप्यूटर विज्ञान में दो कठिन चीजों में से एक है । जब एक डेवलपर को एक इंटरफ़ेस निकालने की आवश्यकता होती है, तो उसे अक्षर I
को वर्ग नाम में जोड़ना आसान होता है और आपको एक इंटरफ़ेस नाम मिलता है। I
इंटरफेस के लिए उपसर्ग को रोकना डेवलपर्स को उनके दिमाग को तनाव के लिए उपयुक्त नाम चुनने के लिए मजबूर करता है। चुना हुआ नाम न केवल उपसर्ग में अलग होना चाहिए बल्कि इरादे के अंतर पर जोर देना चाहिए।
अमूर्तता का मामला: आपको इंटरफ़ेस और संबद्ध वर्ग को परिभाषित नहीं करना चाहिए । एक अमूर्त है और यह अनुबंध के लिए इस्तेमाल किया जाना चाहिए। कार्यान्वयन में वर्णनात्मक, विशिष्ट नाम होने चाहिए ।ICar
Car
Car
SportsCar, SuvCar, HollowCar
अच्छा उदाहरण: WpfeServerAutosuggestManager implements AutosuggestManager
, FileBasedAutosuggestManager implements AutosuggestManager
।
खराब उदाहरण AutosuggestManager implements IAutosuggestManager
:।
मेरे व्यवहार में, मैंने बहुत से ऐसे लोगों से मुलाकात की, जिन्होंने Car implements ICar
नामकरण योजना वाले एक अलग इंटरफ़ेस में एक वर्ग के इंटरफ़ेस रहित भाग को नकल किया । अलग इंटरफ़ेस प्रकार में एक वर्ग का डुप्लिकेट इंटरफ़ेस हिस्सा जादुई रूप से इसे अमूर्त में नहीं बदलता है। आपको अभी भी ठोस कार्यान्वयन मिलेगा लेकिन डुप्लिकेट इंटरफ़ेस इंटरफ़ेस के साथ। यदि आपका एब्स्ट्रैक्शन इतना अच्छा नहीं है, तो इंटरफ़ेस पार्ट को डुप्लिकेट करना किसी भी तरह से इसमें सुधार नहीं करेगा। अमूर्तन निकालना कठिन काम है।
नोट: TS में आपको मॉकिंग क्लासेस या ओवरलोडिंग कार्यक्षमता के लिए अलग इंटरफ़ेस की आवश्यकता नहीं है। एक अलग इंटरफ़ेस बनाने के बजाय जो किसी वर्ग के सार्वजनिक सदस्यों का वर्णन करता है आप टाइपस्क्रिप्ट उपयोगिता प्रकारों का उपयोग कर सकते हैं । Eg Required<T>
एक प्रकार का निर्माण करता है जिसमें सभी प्रकार के सार्वजनिक सदस्य होते हैं T
।
export class SecurityPrincipalStub implements Required<SecurityPrincipal> {
public isFeatureEnabled(entitlement: Entitlement): boolean {
return true;
}
public isWidgetEnabled(kind: string): boolean {
return true;
}
public areAdminToolsEnabled(): boolean {
return true;
}
}
यदि आप कुछ सार्वजनिक सदस्यों को छोड़कर एक प्रकार का निर्माण करना चाहते हैं तो आप ओमिट और बहिष्कृत के संयोजन का उपयोग कर सकते हैं ।
I
उपसर्ग का उपयोग करने से आपको और आपकी टीम को समझ में आता है, तो इसका उपयोग करें। यदि नहीं, (शायदSomeThing
) जावा शैली (इंटरफ़ेस) के साथSomeThingImpl
(कार्यान्वयन) तो हर तरह से उपयोग करें।