2012-01-13 6 views
7

शायद इस के आसपास एक आसान तरीका है जिसे मैं नहीं देख रहा हूं, इसलिए उम्मीद है कि कोई मुझे यह समझा सकता है।बूस्ट और बाहरी डेटा स्रोतों के साथ फ्लाईवेइट्स

चलो कहते हैं कि मैं एक वर्ग करते हैं:

class A { 
public: 
    const double parameter; 
    const std::string name; 
    const std:: string fileName; 

    A(const double parameter, const std::string name, const std::string fileName) : 
     parameter(parameter), name(name), fileName(fileName) {}; 
}; 

और उस वर्ग के लिए जनरेटर है:

class AReader { 
public: 
    ifstream dataFile; 
    AReader(const std::string filename); 
    A* readObject(const std::string objectName); 
}; 

मैं इन A वस्तुओं को संभालने के लिए boost::flyweight उपयोग करने के लिए, क्योंकि वहाँ संभावित लाखों हो जाएगा चाहते हैं उनके संदर्भ में और हकीकत में वे बहुत सारे डेटा रखते हैं। उन्हें name और fileName पर एक साथ धोया जाएगा।

मुझे यह काम करने की क्या ज़रूरत है? AReader.readObject पर कॉल करने के लिए मुझे boost::flyweight की आवश्यकता है और परिणामस्वरूप A कक्षा हैश/स्टोर करें।

क्या AReader को एक पूर्ण कारखाना बनने और कस्टम फैक्ट्री के रूप में उपयोग करने की आवश्यकता है? या क्या फ्लाईवेट में डिफॉल्ट फैक्ट्री का उपयोग करना संभव है और किसी भी तरह AReader का उपयोग A उदाहरण (कारखाने द्वारा आवश्यक पूरे स्टोरेज पैटर्न को लागू करने के विरोध में) उत्पन्न करने के लिए किया जा सकता है, शायद AReader उदाहरण से फ्लाईवेट में कुछ तर्क हो सकता है? या क्या दूसरी कक्षा तक पहुंचने के बिना बाहरी डेटा स्रोत से const सार्वजनिक चर (यानी एक बार सेट, वे नहीं बदलते) प्राप्त करना संभव है?

संपादित

मैं भी अन्य सुझावों बूस्ट का उपयोग नहीं करने के लिए खुला रहा हूँ। यदि कोई बेहतर अनुकूल है तो मैं निश्चित रूप से फ्लाईवेट, या किसी अन्य पैटर्न के अपने कार्यान्वयन को लिख सकता हूं। लेकिन अगर मैं कुछ ऐसा उपयोग कर सकता हूं जो पहले से मौजूद है, तो यह सबसे अच्छा होगा। जो भी कोड लिखने की आवश्यकता है, उसे कम से कम जो भी लिखना है, हमेशा की तरह, समय सीमा कम होती है।

उत्तर

1

मैंने बूस्ट :: फ्लाईवेट का उपयोग नहीं किया है, लेकिन इसकी कम से कम इसकी आवश्यकता से Assignable (EqualityComparable और Hashable होने के अतिरिक्त) की आवश्यकता है। आपके const सदस्यों के साथ आप स्पष्ट रूप से Assignable स्पष्ट रूप से टाइप करते हैं। इसके दिखने से, आपको बनाने की आवश्यकता नहीं है यदि आपके पास कुंजी निकालने वाला है। एक प्रमुख निकालने वाले का उपयोग केवल कुंजी को Assignable होना चाहिए।

+0

वह फ्लाईवेट (असाइन करने योग्य की बजाय कुंजी निकालने वाला) में 'ए' प्राप्त करने के लिए क्या करने की आवश्यकता है, लेकिन एक सहायक वर्ग का उपयोग करने का एकमात्र तरीका है जो 'ए' उत्पन्न करता है इसे फ्लाईवेट (भंडारण और आवश्यक अन्य तरीकों को लागू करने) द्वारा उपयोग किए जाने वाले एक पूर्ण उड़ाए कारखाने को बनाओ? – tpg2114

0

अपने मामले में फ्लाईवेट का उपयोग करने का मूल तरीका फ्लाईवेट वापस करने के लिए readObject के लिए है। आंतरिक रूप से, readObject एक ब्रांड नई वस्तु बनाता है, और जब आप संबंधित फ्लाईवेट ऑब्जेक्ट बनाते हैं, तो यह जांचता है कि ऑब्जेक्ट पहले से ही फ्लाईवेट स्टोर में है या नहीं। यदि ऐसा है, तो यह आपकी नई वस्तु को छोड़ देगा, और स्टोर में ऑब्जेक्ट को संदर्भित करने वाले फ्लाईवेट को वापस कर देगा। यदि नहीं, तो यह नई वस्तु को अपने पूल में जोड़ता है।

अब, यह लागू करने के लिए तुच्छ होना चाहिए, लेकिन आपके उपयोग के मामले के आधार पर अक्षम हो सकता है। बेहतर प्रदर्शन के लिए, आप key_value कार्यक्षमता का उपयोग कर सकते हैं, जो आपको अपनी कुंजी के माध्यम से ऑब्जेक्ट्स का संदर्भ देने की अनुमति देता है, और केवल तभी उन्हें बनाते हैं जब वे स्टोर में पहले से मौजूद न हों।

0

हालांकि key_value फ्लाईवेट बिल को फिट करने लगता है, ऐसा लगता है कि वहां एक मामूली झटका है। आपको कुंजी प्रकार (key_value flyweights) के केवल एक पैरामीटर का उपयोग करके key_value Flyweight बनाने में सक्षम होना चाहिए।तो इसे अपनी इच्छित कुंजी (फ़ाइल नाम + नाम) के साथ काम करने के लिए आपको उन 2 फ़ील्ड को एक (tuple) में पैक करना होगा? यह भी सुनिश्चित नहीं है कि काम करेगा।)

मान लीजिए कि आप प्राप्त करने में रुचि रखते हैं सबसे कम काम के साथ, क्यों नहीं Flyweight Basics में प्रदर्शित आपकी कक्षा में स्ट्रिंग्स?

इसका मतलब यह है A वस्तुओं जिस तरह से आप चाहते हैं टुकड़ों में बांटा नहीं हैं, लेकिन तार आसानी से flyweighted कर रहे हैं, और इन अपनी स्मृति-समस्याग्रस्त क्षेत्रों होने लगते हैं। (जब तक यह एक oversimplification नहीं है)