स्विफ्ट प्रोटोकॉल नामकरण कन्वेंशन [बंद]


53

मुख्य रूप से c # बैकग्राउंड से आने वाली, मुझे किसी ऑब्जेक्ट के वर्णन के लिए "इंटरफ़ेस" शब्द का उपयोग करने के लिए उपयोग किया जाता है, जिसमें कोई कार्यान्वयन नहीं है जो व्यवहार को परिभाषित करता है। C # में, कन्वेंशन इंटरफ़ेस नामों को "I" के साथ प्रीपेंड करने के लिए है, जैसे कि IEnumerable, आदि।

बेशक, विभिन्न भाषाओं में अवधारणा के अलग-अलग नाम हैं। स्विफ्ट में, एक ही अवधारणा को "प्रोटोकॉल" कहा जाता है। जब मैं प्रोटोकॉल विकसित कर रहा हूं, तो अक्सर मेरे पास प्रोटोकॉल के लिए बहुत समान नाम होते हैं और एक वर्ग जो इसे लागू करता है। अब तक, मैं इन ऑब्जेक्ट्स के लिए "प्रोटोकॉल" शब्द को उसी तरह से जोड़ रहा हूं, जैसे मैं c # में "I" का उपयोग करता हूं, जैसे कि EnumerableProtocol, आदि।

स्विफ्ट में प्रोटोकॉल के लिए एक नामकरण सम्मेलन पर कोई विचार?



सामान्य तौर पर एक प्रोटोकॉल नाम में प्रयुक्त शब्दावली में एक क्षमता होनी चाहिए। Equatableकक्षाओं को बराबर किया जा सकता है, NSCopyingनकल करके कक्षाएं ली जा सकती हैं, आदि जो एकमात्र अपवाद दिमाग में आता है, वे प्रतिनिधि और डेटा स्रोत हैं, जो हैं SomethingDelegateया हैं SomethingDataSource। मुझे लगता है कि अंतर यह है कि मालिक वर्गों में कुछ ऐसा होगा var dataSource: SomethingDataSource, लेकिन आप कुछ ऐसा नहीं देखेंगे var foo: Equatable
बेन लेगियरियो

जवाबों:


82

यह उत्तर लिखे जाने के बाद के वर्षों में स्विफ्ट काफी परिपक्व हो गई है। डिजाइन दिशानिर्देश अब राज्य :

  • प्रोटोकॉल जो यह वर्णन करते हैं कि संज्ञाओं (जैसे Collection) के रूप में क्या पढ़ा जाना चाहिए ।

  • प्रोटोकॉल है कि एक का वर्णन क्षमता प्रत्यय का उपयोग कर नाम दिया जाना चाहिए able, ibleया ing(जैसे Equatable, ProgressReporting)।

डेविड जेम्स को इसे पेश करने के लिए धन्यवाद !

मूल उत्तर

हंगेरियन नोटेशन के कुछ रूप का उपयोग करना एक अच्छा विचार हो सकता है - महत्वपूर्ण अवधारणाओं का प्रतिनिधित्व करने के लिए जो टाइप सिस्टम के अंदर एन्कोड नहीं किए जा सकते। हालांकि, तथ्य यह है कि कुछ पहचानकर्ता एक प्रोटोकॉल को संदर्भित करता है स्विफ्ट (और सी #) में टाइप सिस्टम का हिस्सा है, और इस तरह के किसी भी उपसर्ग या प्रत्यय के रूप में केवल शोर जोड़ता है। स्पष्ट उपसर्ग या प्रत्यय अपवाद या घटनाओं जैसे अवधारणाओं के लिए एक बेहतर विचार है।

स्विफ्ट के लिए एक आधिकारिक शैली गाइड की अनुपस्थिति में, हमें अपने स्वयं के साथ आना होगा, या मौजूदा गाइड या कोड से उधार लेना होगा। उदाहरण के लिए, कोको के लिए ऑब्जेक्टिव-सी स्टाइल गाइड में यह खंड है:

वर्ग और प्रोटोकॉल नाम

प्रोटोकॉल का नाम उनके समूह व्यवहार के अनुसार होना चाहिए:

  • अधिकांश प्रोटोकॉल समूह से संबंधित तरीके जो विशेष रूप से किसी भी वर्ग से जुड़े नहीं हैं। इस प्रकार के प्रोटोकॉल का नाम दिया जाना चाहिए ताकि प्रोटोकॉल एक वर्ग के साथ भ्रमित न हो। एक सामान्य सम्मेलन एक गेरुंड ("... आईएनजी") फॉर्म का उपयोग करना है:

    NSLocking- अच्छा।
    NSLock- गरीब (एक वर्ग के लिए एक नाम की तरह लगता है)।

  • कुछ प्रोटोकॉल कई असंबंधित तरीकों का समूह बनाते हैं (बजाय कई अलग-अलग छोटे प्रोटोकॉल बनाने के)। ये प्रोटोकॉल एक ऐसे वर्ग से जुड़े होते हैं जो प्रोटोकॉल की प्रमुख अभिव्यक्ति है। इन मामलों में, कन्वेंशन प्रोटोकॉल को कक्षा के समान नाम देना है।

    इस तरह के प्रोटोकॉल का एक उदाहरण NSObjectप्रोटोकॉल है। यह प्रोटोकॉल समूह विधियाँ जो आप वर्ग पदानुक्रम में इसकी स्थिति के बारे में किसी भी वस्तु को क्वेरी करने के लिए उपयोग कर सकते हैं, इसे विशिष्ट विधियों को लागू करने के लिए और इसके संदर्भ गणना को बढ़ाने या घटाने के लिए कर सकते हैं। क्योंकि NSObjectवर्ग इन विधियों की प्राथमिक अभिव्यक्ति प्रदान करता है, प्रोटोकॉल को वर्ग के नाम पर रखा गया है।

हालाँकि, दूसरे बिंदु की सलाह अब लागू नहीं है:

क्‍योंकि वर्गों और प्रोटोकॉलों के नाम स्‍विफ्ट में एकीकृत होते हैं, NSObjectवस्‍तु-सी में प्रोटोकॉल को NSObjectProtocolस्विफ्ट में रीमेक किया जाता है । ( स्रोत )

यहाँ, …Protocolवर्ग से प्रोटोकॉल की अवहेलना करने के लिए प्रत्यय का उपयोग किया गया था।

स्विफ्ट स्टैंडर्ड लाइब्रेरी प्रोटोकॉल होता है Equatable, Comparableऔर Printable। ये कोको "... आईएनजी" फॉर्म का उपयोग नहीं करते हैं, बल्कि "..." प्रत्यय घोषित करते हैं कि इस प्रकार के किसी भी उदाहरण को एक निश्चित ऑपरेशन का समर्थन करना चाहिए।


निष्कर्ष

कुछ मामलों में जहां एक प्रोटोकॉल में केवल एक प्रासंगिक कार्यान्वयन होता है, एक "… प्रोटोकॉल" प्रत्यय समझ में आता है ताकि वर्ग और प्रोटोकॉल का एक ही नाम हो सकता है। हालांकि, यह केवल ऐसे मामलों तक सीमित होना चाहिए।

अन्यथा, नाम कुछ संज्ञा होना चाहिए जो दर्शाता है कि इस प्रोटोकॉल में कौन से संचालन शामिल हैं। एक क्रिया का "... आईएनजी" या "सक्षम" रूप का उपयोग करना एक अच्छा प्रारंभिक बिंदु हो सकता है, और ऐसे नाम वर्ग के नामों के लिए संघर्ष की संभावना नहीं है।

नाम EquatableProtocolहै सिफ़ारिश लायक नहीं । नाम Equatableया Equatingकहीं बेहतर होगा, और मुझे उम्मीद नहीं है कि किसी भी वर्ग का नाम होगा Equatable। इस मामले में, Protocolप्रत्यय शोर है।


6
FooDelegate भी आम है (कम से कम प्रतिनिधियों के लिए, जो लगभग हमेशा प्रोटोकॉल हैं ... शायद वास्तव में हमेशा)
स्ट्राइप्स

3
प्रति स्विफ्ट एपीआई डिजाइन दिशा-निर्देश: स्विफ्ट.ओआरडीएनडीआईजेशन / ap- design-guidelines >> प्रोटोकॉल जो यह वर्णन करते हैं कि कुछ चीज़ों को संज्ञाओं के रूप में पढ़ा जाना चाहिए (जैसे संग्रह)। >> एक क्षमता का वर्णन करने वाले प्रोटोकॉल को प्रत्यय सक्षम, ible, या ing (उदाहरण के लिए समान, ProgressReporting) का उपयोग करके नाम दिया जाना चाहिए।
डेविड जेम्स

1
@amon मुझे अपने वर्ग के BluetoothService या UserDataManager के लिए प्रोटोकॉल का नाम कैसे देना चाहिए? "... आईएनजी" या "... सक्षम" यहां फिट नहीं है और मैं "प्रोटोकॉल" प्रत्यय, किसी भी विचार से बचना चाहूंगा? Api Design Guidelines के अनुसार, प्रोटोकॉल इस मामले में होना चाहिए जैसे कि BluetoothService जैसी संज्ञा, लेकिन उसके बाद क्या नाम लागू होना चाहिए? BluetoothServiceImpl? Btw। कई उदाहरणों के बाद मैंने देखा है, मुझे लगता है कि C # में IAnything, IEquatable, ISmthAware जैसे D "उपसर्गों के साथ सर्वश्रेष्ठ तालमेल है: D
Wojciech Kulik

1
@WojciechKulik मुझे यकीन नहीं है कि आपके मामले में अच्छे नाम हो सकते हैं। बहुत कुछ इस बात पर निर्भर करता है कि उन प्रोटोकॉल का उपयोग कैसे किया जाएगा। हालाँकि,… सेवा और… प्रबंधक नाम एक प्रकार की कोड गंध हो सकते हैं - नाम मूल रूप से एक ही है यदि आप उस प्रत्यय को हटाते हैं। कुछ नामों पर विचार करें: ब्लूटूथ, ब्लूटूथकनेक्टिंग, ब्लूटूथप्रोटोकॉल, यूजरडेटा, यूजरडॉट रिपॉजिटरी, यूजरडॉटवेयर, यूजरडॉटप्रोटोकॉल।
आमोन

1
@DeclanMcKenna नामकरण काफी व्यक्तिपरक हो सकता है, और कौन सा नाम चुनना है यह हमेशा स्पष्ट नहीं है। लेकिन कई मामलों में प्रोटोकॉल का उपयोग कुछ कसकर बंद क्षमता को व्यक्त करने के लिए किया जाना चाहिए (इंटरफ़ेस अलगाव सिद्धांत भी तुलना करें)।
आमोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.