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




मंगलवार को जन्मे बच्चे का नाम क्या रखें (4)

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

StringExtensions.swift

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

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

नतीजतन, एक्सटेंशन बनाना संभव है जैसे कि:

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

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

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

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


मेरी प्राथमिकता फ़ाइल की शुरुआत में "Extension_" डालना है। (मैंने सभी संबंधित एक्सटेंशन को एक ही फाइल में रखा है।)

इस तरह, सभी एक्सटेंशन फाइलें मेरे ऐप की निर्देशिका और एक्सकोड के नेविगेटर में, वर्णानुक्रम में एक साथ हैं। बेशक, नेविगेटर में, मैं उन्हें भी समूहित कर सकता हूं।

तो, एक स्ट्रिंग-संबंधित एक्सटेंशन Extension_String.swift


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

String+UTF8Data.swift

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

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

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


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

मेरे पास एक कक्षा थी जो मेरे बैक-एंड से बात करती है, जिसे 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 तो सर्वर को सेट करने और API संस्करण प्राप्त करने के लिए बस कोर सर्वर API लागू करता है। असली काम दो फाइलों में विभाजित है:

Server_ReggyCloudProtocol.swift
Server_ProReggyCloudProtocol.swift

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

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

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







xcode