स्विफ्ट फ़ाइलों के नामकरण के लिए सबसे अच्छा अभ्यास क्या है जो मौजूदा वस्तुओं में एक्सटेंशन जोड़ते हैं?


165

एक्सटेंशन का उपयोग करके मौजूदा स्विफ्ट ऑब्जेक्ट प्रकारों में एक्सटेंशन जोड़ना संभव है, जैसा कि भाषा विनिर्देश में वर्णित है ।

परिणामस्वरूप, एक्सटेंशन बनाना संभव है जैसे:

extension String {
    var utf8data:NSData {
        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
    }
}

हालाँकि, ऐसी एक्सटेंशन वाली स्विफ्ट स्रोत फ़ाइलों के लिए सबसे अच्छा नामकरण अभ्यास क्या है?

पूर्व में, कन्वेंशन का extendedtype+categoryname.mउद्देश्य ऑब्जेक्टिव-सी टाइप के लिए उपयोग करना था जैसा कि ऑब्जेक्टिव-सी गाइड में चर्चा की गई थी । लेकिन स्विफ्ट उदाहरण में श्रेणी का नाम नहीं है, और इसे कॉल करना String.swiftउचित नहीं लगता है।

तो सवाल यह है: उपरोक्त Stringविस्तार को देखते हुए , स्विफ्ट स्रोत फ़ाइल को क्या कहा जाना चाहिए?


4
यह कोई कोडवर्ड प्रश्न नहीं है - मुझे इस विशेष उदाहरण की परवाह नहीं है, मैं जानना चाहता हूं कि स्विफ्ट नामकरण सम्मेलन क्या है।
अलब्लू

2
कोई नामकरण सम्मेलन नहीं है। केवल एक चीज जिस पर हमें जाना है वह है ऑब्जेक्टिव-सी से श्रेणियां, जो हमेशा ClassName+ExtensionNameप्रारूप का पालन ​​करती हैं , और जो मुझे बहुत सारे लोग अभी भी उपयोग नहीं करते हैं। इसके अलावा, मुझे लगता है कि सिर्फ कक्षाओं और एक्सटेंशन को एक साथ परिभाषित करने या फाइल को एक बेहतर नाम देने FooAbleTypesऔर एग्रीगेट में उदाहरणों को परिभाषित करने के बदले में क्लूनी मिल रहा है ।
कोडाफी

4
वहाँ है कोई नामकरण व्यवहार अभी तक। यहाँ एक विचार है: सभी वैश्विक विस्तार को एक साथ एक ही समय में पूरा करना Extensions.swift। इस तरह, आप उन्हें ट्रैक नहीं करेंगे और नए लोगों को कोडबेस तुरंत उन्हें नोटिस करेंगे। और मैं फ़ाइल वे की जरूरत कर रहे हैं करने के लिए एक बंद एक्सटेंशन निजी रखना चाहते हैं।
एंड्रयू

1
जैसा कि एंड्रयू कहते हैं, अभी तक कोई मानक नामकरण प्रथा नहीं है - इसलिए इस प्रश्न को विशेष रूप से राय प्राप्त करने के लिए कहा गया था ताकि एक नवगठित समुदाय कुछ सुझाए गए विचारों पर आ सके।
अलब्लू

1
एक भी Extension.swift फ़ाइल मेरी राय में जाने का तरीका है। इसके अंदर की संरचना को व्यवस्थित रखें (अपने तरीके से) जो आपको आसानी से चाहिए। एक एकल फ़ाइल विभिन्न प्रकार की परियोजनाओं से कॉपी या लिंक करना आसान है और सामान नहीं भूलना।
योहस्ट

जवाबों:


202

अधिकांश उदाहरण मैंने ऑब्जेक्टिव-सी के दृष्टिकोण की नकल करते हुए देखे हैं। ऊपर दिया गया उदाहरण एक्सटेंशन होगा:

String+UTF8Data.swift

लाभ यह है कि नामकरण सम्मेलन यह समझना आसान बनाता है कि यह एक विस्तार है, और किस वर्ग को बढ़ाया जा रहा है।

उपयोग करने Extensions.swiftया यहां तक StringExtensions.swiftकि समस्या यह है कि इसकी सामग्री को देखे बिना अपने नाम से फ़ाइल के उद्देश्य का अनुमान लगाना संभव नहीं है।

xxxable.swiftजावा द्वारा उपयोग किए गए दृष्टिकोण का उपयोग प्रोटोकॉल या एक्सटेंशन के लिए ठीक काम करता है जो केवल तरीकों को परिभाषित करते हैं। लेकिन फिर, ऊपर दिया गया उदाहरण एक विशेषता को परिभाषित UTF8Dataable.swiftकरता है जिससे बहुत अधिक व्याकरणिक अर्थ नहीं होता है।


1
हालांकि एक नामकरण सम्मेलन द्वारा जो बढ़ाया जा रहा है वह अनुमान लगा सकता है, यह आईएचएमओ एक अनावश्यक जटिलता है। <Name> + <extention> .swift फ़ाइलों के टन के बजाय, मैं एक ही एक्सटेंशन .swift फ़ाइल रखता हूं जिसका उपयोग मैं आमतौर पर प्रत्येक प्रोजेक्ट के लिए करता हूं। फ़ाइल को आंतरिक रूप से इस तरह व्यवस्थित किया जाता है कि किसी विशेष वर्ग को जो विस्तारित है, खोजना आसान है।
योहस्ट

18
यह उत्तर, <name> + <extention> .swift, वास्तव में Xcode 8 में कोर डेटा के लिए NSManagedObject उप-वर्ग बनाते समय Xcode करता है। उदाहरण: Foo + CoreDataProperties.swift।
जेरी क्रिनोक 20

4
क्या होगा अगर विस्तार कई तरीकों को लागू करता है?
एलेक्सवीपेरल

2
बस के रूप में संभव के रूप में वर्णनात्मक हो। उदाहरण के लिए, यदि आपके पास छवि के लिए एक एक्सटेंशन है जिसमें फ़िल्टर लागू करने के लिए अलग-अलग फ़ंक्शन शामिल हैं, तो इसे नाम दें Image + Filters.swift। विस्तारित फ़ंक्शंस पर संबंधित समूहों के लिए विभिन्न फ़ाइलों का उपयोग करना ठीक है। समूह से जुड़ी चीजें एक साथ, लेकिन असंबंधित चीजों को अलग रखें। जीवन अच्छा रहेगा।
पिकनिक

यदि आप के कन्वेंशन का उपयोग कर रहे हैं ExtendedType+Functionality.swift, तो क्या सभी Stringएक्सटेंशन को सॉर्ट करना अच्छा है , उदाहरण के लिए, फ़ोल्डर के तहत अपने स्वयं के सबफ़ोल्डर (यानी Stringया String Extensions) में Extensions? या Extensionsफ़ोल्डर के तहत एक ही स्तर पर सभी एक्सटेंशन फ़ाइलों को स्टोर करना बेहतर है ?
नूह वाइल्डर

8

कोई स्विफ्ट सम्मेलन नहीं है। इसे सरल रखें:

StringExtensions.swift

मैं प्रत्येक वर्ग के लिए एक फ़ाइल बनाता हूं, जिसका विस्तार कर रहा हूं। यदि आप सभी एक्सटेंशन के लिए एक एकल फ़ाइल का उपयोग करते हैं, तो यह जल्दी से जंगल बन जाएगा।


8
यह विशेष रूप से पुन: प्रयोज्य प्रतीत नहीं होता है।
केलर

1
इसकी तुलना में?
माइक Taverne

3
एक एकल (या स्पष्ट रूप से भरोसेमंद) उद्देश्य की सेवा करने वाले वर्ग एक्सटेंशन की एकल (या कसकर युग्मित) फ़ाइल की तुलना में। "StringExtensions" की तरह कुछ लगता है कि इसमें सामान्य उद्देश्य से सब कुछ शामिल हो सकता है स्ट्रिंग सैनिटाइजेशन से ऐप-विशिष्ट तर्क- जो कि पुन: उपयोग एक चिंता का विषय है, तो सबसे अच्छा तरीका नहीं हो सकता है। कोको नामकरण सम्मेलन को लागू करने के बजाय कार्य की ओर झुकता है। मैं तर्क देता हूं कि "स्ट्रिंगटेक्स्टेंशन" उत्तरार्द्ध को इंगित करता है। एक तरफ नामकरण सम्मेलन, मैं स्वीकार किए जाते हैं जवाब पसंद करते हैं, निश्चित रूप से ObjC में, लेकिन स्विफ्ट में यह मॉड्यूल के कारण एक बेहतर दृष्टिकोण की तरह लगता है।
केलर

2
यह समझ आता है। मैं एक एकल ऐप के बारे में अधिक सोच रहा था जहां पुन: उपयोग एक चिंता का विषय नहीं था। उदाहरण के लिए, मान लें कि मेरे कुछ असंबंधित स्ट्रिंग फ़ंक्शंस हैं जिन्हें मैं एक्सटेंशन के रूप में उपयोग करना चाहता हूं - मैं एक फ़ाइल बना सकता हूं और इन सभी कार्यों को वहां रख सकता हूं, या प्रति फ़ंक्शन एक फ़ाइल बना सकता हूं। मुझे उस मामले में एक फ़ाइल की सादगी पसंद है। लेकिन आपका तर्क ध्वनि है। धन्यवाद।
माइक टवेर्न

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

1

मैं पसंद करता हूं StringExtensions.swiftजब तक कि मैंने फ़ाइल को किसी चीज़ में विभाजित करने के लिए बहुत अधिक चीजें नहीं जोड़ीं String+utf8Data.swiftऔर String+Encrypt.swift

एक और बात, इसी तरह की फ़ाइलों को एक में मिलाने से आपकी इमारत और अधिक तेज़ होगी। का संदर्भ लें अनुकूलन-स्विफ्ट-बिल्ड-टाइम्स


1
एक ही चीज़ के लिए दो फ़ाइल नामकरण सम्मेलनों का होना। मुझे लगता है कि यह बुरा है।
अर्थ-मायने

@ अर्थ-मायने यह निर्भर करता है। दो नामकरण सम्मेलन Apple दस्तावेज़ों द्वारा प्रसिद्ध और अनुशंसित दोनों हैं। जैसा चाहते हो वैसा करो।
डॉनसॉन्ग

मैं चाहता हूं कि अधिक प्रोग्रामर नामकरण और कोड [स्वरूपण] विविधताओं को सीमित करके लालित्य के लिए प्रयास करेंगे।
अर्थ-मामले

@ अर्थ-मामलों में लालित्य के दो पहलू हैं, यह एक शास्त्रीय विवादास्पद समस्या की तरह है कि सी-जैसी भाषाओं में घुंघराले ब्रेसिज़ कैसे लिखें। यह तुच्छ है, इसलिए मुझे नहीं लगता कि किसी एक को चुनना और इसे अनिवार्य करना तब तक आवश्यक है जब तक कि अधिकांश लोग ऐसा करने के लिए सहमत न हों।
डॉनसॉन्ग

मेरा मतलब था संगति का लालित्य: नाम एक्सटेंशन के लिए एक तरह का उपयोग करना, या घुंघराले ब्रेसिज़ रखने का एक तरीका। तब मुझे लगता है कि विभिन्न घुंघराले ब्रेस शैलियों की पठनीयता में एक औसत दर्जे का अंतर है; इसलिए मुझे नहीं लगता कि यह बिल्कुल 'तुच्छ' है।
अर्थ-मायने

0

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

मेरे पास एक वर्ग था जो मेरे बैक-एंड पर बात करता है, जिसे बुलाया जाता है Server। यह दो अलग-अलग लक्ष्य एप्लिकेशन को कवर करने के लिए बड़ा होना शुरू हुआ। कुछ लोग एक बड़ी फ़ाइल पसंद करते हैं, लेकिन सिर्फ तार्किक रूप से एक्सटेंशन के साथ अलग हो जाते हैं। मेरी प्राथमिकता प्रत्येक फ़ाइल को अपेक्षाकृत कम रखना है, इसलिए मैंने निम्नलिखित समाधान चुना। Serverमूल रूप से CloudAdapterProtocolइसके सभी तरीकों के अनुरूप और कार्यान्वित किया गया। मैंने जो किया वह प्रोटोकॉल को एक पदानुक्रम में बदलने के लिए था, इसे अधीनस्थ प्रोटोकॉल का संदर्भ देकर:

protocol CloudAdapterProtocol: ReggyCloudProtocol, ProReggyCloudProtocol {
    var server: CloudServer {
        get set
    }
    func getServerApiVersion(handler: @escaping (String?, Error?) -> Swift.Void)
}

में Server.swiftमेरे पास है

import Foundation
import UIKit
import Alamofire
import AlamofireImage

class Server: CloudAdapterProtocol {
.
.
func getServerApiVersion(handler: @escaping (String?, Error?) -> Swift.Void) {
.
.
}

Server.swiftतब बस सर्वर स्थापित करने और एपीआई संस्करण प्राप्त करने के लिए कोर सर्वर एपीआई को लागू करता है। असली काम दो फ़ाइलों में विभाजित है:

Server_ReggyCloudProtocol.swift
Server_ProReggyCloudProtocol.swift

ये संबंधित प्रोटोकॉल को लागू करते हैं।

इसका मतलब है कि आपको अन्य फाइलों में (इस उदाहरण में अलामोफायर के लिए) आयात घोषणाओं की आवश्यकता है, लेकिन मेरे विचार में अंतर को अलग करने के संदर्भ में इसका एक स्वच्छ समाधान है।

मुझे लगता है कि यह दृष्टिकोण बाहरी रूप से निर्दिष्ट वर्गों के साथ-साथ आपके स्वयं के साथ भी समान रूप से अच्छी तरह से काम करता है।


0

यह एक बहस भी क्यों है? क्या मुझे अपने सभी उप वर्गों को _Subclasses.swift नामक फ़ाइल में डाल देना चाहिए। मुझे नहीं लगता। स्विफ्ट में मॉड्यूल आधारित नाम रिक्ति है। एक प्रसिद्ध स्विफ्ट क्लास का विस्तार करने के लिए एक फ़ाइल की आवश्यकता होती है जो उसके उद्देश्य के लिए विशिष्ट हो। मेरे पास एक बड़ी टीम हो सकती है जो एक ऐसी फाइल बनाती है जो UIViewExtensions.swift है जो बिना किसी उद्देश्य के व्यक्त करती है और डेवलपर्स को भ्रमित करेगी और परियोजना में आसानी से नकल की जा सकती है जो निर्माण नहीं करेगी। ऑब्जेक्टिव-सी नामकरण सम्मेलन ठीक काम करता है और जब तक स्विफ्ट का असली नाम रिक्ति है, यह जाने का सबसे अच्छा तरीका है।


मेरे मामले में, मुझे लगता है कि UIViewExtensions.swift नामक एक फाइल रखने के लिए यह सही समझ में आता है, बशर्ते उस फ़ाइल में परिभाषित एक्सटेंशन किसी भी / सभी UIView वर्गों के लिए समझ में आए, जैसे कि 'placeIn (UIView)' विधि। यदि यह उपयोग-विशिष्ट है (यानी केवल ऐप के एक हिस्से के लिए, कस्टम व्यू डेकोरेशन के आसपास कहें, तो मैं UIView + CustomDecoration.swift करूंगा। बिंदु यह है कि आप एक सामान्यीकरण करने से पहले उपयोग पर विचार करें जैसे कि UIViewExtensions नामक एक फ़ाइल कह रही है। .swift जो बिना किसी उद्देश्य के व्यक्त करता है 'जब उद्देश्य सभी UIViews के लिए सामान्य एक्सटेंशन है।
मार्क ए। डोनोहे

0

सभी जगह अपनी टिप्पणियों को जोड़ने के बजाय, मैं उन सभी को एक उत्तर में यहाँ पर रख रहा हूँ।

व्यक्तिगत रूप से, मैं एक हाइब्रिड दृष्टिकोण लेता हूं जो अच्छी उपयोगिता और स्पष्टता दोनों देता है, जबकि उस वस्तु के लिए एपीआई सतह क्षेत्र को अव्यवस्थित नहीं करता है जो मैं बढ़ा रहा हूं।

उदाहरण के लिए, किसी भी स्ट्रिंग के लिए उपलब्ध होने के लिए कुछ भी समझ में आता है जैसे और ।StringExtensions.swifttrimRight()removeBlankLines()

हालाँकि, अगर मेरा कोई एक्सटेंशन फंक्शन formatAsAccountNumber()होता है , तो यह उस फाइल में नहीं जाएगा क्योंकि 'अकाउंट नंबर' कोई ऐसी चीज नहीं है जो स्वाभाविक रूप से किसी भी / सभी स्ट्रिंग्स पर लागू होगी और केवल खातों के संदर्भ में समझ में आती है। उस स्थिति में, मैं एक फ़ाइल बनाऊंगा Strings+AccountFormatting.swiftया शायद Strings+CustomFormatting.swiftकिसी formatAsAccountNumber()फ़ंक्शन के साथ भी अगर वास्तव में इसे प्रारूपित करने के लिए कई प्रकार / तरीके हैं।

वास्तव में, उस अंतिम उदाहरण में, मैंने अपनी टीम को पहले की तरह एक्सटेंशन का उपयोग करने से सक्रिय रूप से मना कर दिया, और इसके बजाय कुछ इस तरह प्रोत्साहित करेगा जैसे AccountNumberFormatter.format(String)कि Stringएपीआई सतह क्षेत्र को बिल्कुल भी नहीं छूना चाहिए, जैसा कि यह नहीं होना चाहिए। अपवाद तब होगा जब आपने उस एक्सटेंशन को उसी फ़ाइल में परिभाषित किया हो, जहाँ उसका उपयोग किया गया हो, लेकिन तब उसका स्वयं का फ़ाइल नाम नहीं होगा।


0

मैं +इस तथ्य को रेखांकित करना पसंद करता हूं, जिसमें एक्सटेंशन शामिल हैं:

String+Extensions.swift

और अगर फ़ाइल बहुत बड़ी हो जाती है, तो आप इसे प्रत्येक उद्देश्य के लिए विभाजित कर सकते हैं:

String+UTF8Data.swift

String+Encrypt.swift

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.