2017-02-01 5 views
5

के साथ बेहतर डेटा एक्सेस लेयर कैसे लिखें I कुछ छोटी परियोजनाओं में रियलम का उपयोग कर रहा हूं और मुझे यह पसंद है। मैं बड़ी परियोजनाओं में इसका उपयोग करने के लिए आगे बढ़ने की उम्मीद कर रहा हूं और मैं अपनी डेटा एक्सेस लेयर की बेहतर संरचना की तलाश में हूं।रीयल

मैं इसी तरह के question पर आया और मैंने वहां मिली जानकारी पर निर्माण करने की कोशिश की। चर्चा की गई दृष्टिकोण डीएओ पैटर्न है इसलिए मैंने उस पर एक शॉट दिया।

यह मेरी मॉडल कक्षा है।

class Chat: Object { 
    dynamic var id: String = "" 
    dynamic var createdAt: Date = Date() 
    dynamic var creatorId: String = "" 
    dynamic var title: String? 
    let chatMessages = List<ChatMessage>() 

    override static func primaryKey() -> String? { 
     return "id" 
    } 

    convenience init(fromJSON json: JSON) { 
     self.init() 
     // ... 
    } 
} 

तो मैं एक ChatDAOProtocol बनाई गई सभी सुविधा सहायक तरीकों धारण करने के लिए।

protocol ChatDAOProtocol { 
    func addMessage(_ message: ChatMessage) 
    func getChatThumbnail() -> UIImage 
    func getParticipants(includingMe: Bool) -> [Participant]? 
    static func getChat(fromId id: String) -> Chat? 
    static func getChat(fromCreatorId id: String) -> Chat? 
} 

अन्त में मैं एक वर्ग ChatHelper कहा जाता है कि उन सभी प्रोटोकॉल तरीकों को लागू किया बनाया।

class ChatHelper: ChatDAOProtocol { 
    func addMessage(_ message: ChatMessage) { 

    } 

    func getChatThumbnail() -> UIImage { 
     return UIImage() 
    } 

    func getParticipants(includingMe: Bool) -> [Participant]? { 
     return nil 
    } 

    static func getChat(fromId id: String) -> Chat? { 
     return nil 
    } 

    static func getChat(fromCreatorId id: String) -> Chat? { 
     return nil 
    } 

} 

यह पहले से ही सभी वीसी और सामान के सभी डेटाबेस संबंधित कोड छिड़काव से बेहतर लगता है। लेकिन मुझे अभी भी कुछ संदेह हैं।

उदाहरण के लिए, कहें कि मुझे चैट के सभी प्रतिभागियों को प्राप्त करने की आवश्यकता है, अब मुझे ChatHelper कक्षा पर विधि को कॉल करना होगा। और अगर मैं बस चैट शीर्षक प्राप्त करना चाहता हूं, तो मैं Chat ऑब्जेक्ट की title संपत्ति को कॉल करता हूं। एक बहुत एकीकृत इंटरफेस की तरह प्रतीत नहीं होता है। क्या मुझे सहायक में सभी संपत्तियों के लिए गेटर्स और सेटर्स भी शामिल करना चाहिए। तो Chat ऑब्जेक्ट को कभी भी सीधे नहीं कहा जाता है (शायद एक उदाहरण बनाने के अलावा)।

या

मैं Chat वस्तु ही ChatDAOProtocol प्रोटोकॉल के अनुरूप बना दें? तो सभी सुविधा विधियों के साथ-साथ गुण सीधे Chat ऑब्जेक्ट से सीधे पहुंच योग्य हैं?

या इनमें से दोनों की तुलना में बेहतर तरीका है?

उत्तर

2

यह बहुत मुश्किल सवाल है क्योंकि यह वास्तव में इस बात पर निर्भर करता है कि आप रियलम के साथ सीधे बातचीत करने से कितना दूर रहना चाहते हैं, और आप रियलम के प्रदर्शन से कितना समझौता करना चाहते हैं।

व्यक्तिगत रूप से, मुझे लगता है कि यह ठीक है अगर आप क्वेरी को दूर कर रहे हैं और तर्क लिख रहे हैं, लेकिन फिर भी सीधे रियलम मॉडल ऑब्जेक्ट्स से पढ़ रहे हैं। यदि आप किसी अन्य ऑब्जेक्ट-आधारित डेटाबेस (कोर डेटा की तरह) में स्थानांतरित हो जाते हैं, तो जब आप अभिभावक वर्ग को दोबारा प्रतिक्रिया देंगे, तो ये ऑब्जेक्ट्स किसी अन्य चीज़ से संबंधित होंगे (उदाहरण के लिए, RLMObject से NSManagedObject), जिस तरह से इन ऑब्जेक्ट्स से आपके व्यवसाय तर्क को पढ़ा नहीं जाएगा ।

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

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

एक अन्य विचार: आप वस्तुओं के बैच को एक प्रॉपर्टी अपडेट कर रहे हैं, तो आप वस्तुओं एक भी लिखने लेनदेन में अपडेट किया जाता है के सभी सुनिश्चित बंद काफी बेहतर हो सकता है, के बजाय सहायक वर्ग आंतरिक रूप से एक लिखने लेनदेन खोलने प्रत्येक बार सहायक विधि कहा जाता है।

+0

उत्तर के लिए धन्यवाद। मैं उन बिंदुओं को लेता हूं जिनका आपने उल्लेख किया है और मेरे कोड को फिर से काम करते हैं। तो क्या आपको लगता है कि एक ही 'चैट' कक्षा में सहायक तरीके से बेहतर है या उन सहायक तरीकों के लिए अलग 'चैटहेल्पर' वर्ग बनाना बेहतर है? – Isuru

संबंधित मुद्दे