2010-07-14 11 views
5

परियोजनाओं मैं मैं पर काम किया में कक्षाएं कि क्वेरी/अद्यतन डेटाबेस इस तरह की,क्या मुझे इस कक्षा को स्थिर बनाना चाहिए?

public class CompanyInfoManager 
{ 
    public List<string> GetCompanyNames() 
    { 
     //Query database and return list of company names 
    } 
} 

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

धन्यवाद,

उत्तर

2

यह निर्भर करता है। क्या आपको कभी भी अपना प्रोग्राम मल्टीथ्रेड करने की आवश्यकता होगी? क्या आपको कभी एक से अधिक डेटाबेस से कनेक्ट करने की आवश्यकता होगी? क्या आपको कभी इस कक्षा में राज्य को स्टोर करने की आवश्यकता होगी? क्या आपको अपने कनेक्शन के जीवनकाल को नियंत्रित करने की आवश्यकता है? क्या आपको भविष्य में डेटा कैशिंग की आवश्यकता होगी? यदि आप इनमें से किसी के लिए हाँ का उत्तर देते हैं, तो एक स्थिर वर्ग चीजों को अजीब बना देगा।

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

0

आप एक स्थिर वर्ग के लिए जाना यदि आप इसे इस तरह अपने बड़े पैमाने पर स्टेटलेस कि डिजाइन करने के लिए होगा। सामान्य रणनीति सामान्य डेटा एक्सेस फ़ंक्शंस के साथ बेस क्लास बनाना है और फिर ग्राहकों को लोड करने के लिए उन्हें विशिष्ट कक्षाओं में प्राप्त करना है।

यदि वस्तु निर्माण वास्तव में पूरे ऑपरेशन में ओवरहेड है, तो आप प्री-निर्मित ऑब्जेक्ट्स को पूलिंग करने पर भी देख सकते हैं। हालांकि, मुझे संदेह है कि यह मामला है।

आपको लगता है कि आपके बहुत से सामान्य डेटा एक्सेस कोड को स्थिर तरीकों से बनाया जा सकता है, लेकिन सभी डेटा एक्सेस के लिए एक स्थिर वर्ग ऐसा लगता है कि डिज़ाइन कहीं खो गया है।

स्टेटिक कक्षाओं में बहु-थ्रेडेड एक्सेस प्रति-से कोई समस्या नहीं है, लेकिन स्पष्ट रूप से ताले और स्थैतिक या साझा स्थिति समस्याग्रस्त है।

1

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

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

12

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

नोट: नीचे दिया गया कोड एक मोटा उदाहरण है और केवल उस बिंदु को व्यक्त करना है, जो आवश्यक रूप से संकलित और निष्पादित नहीं है।

public interface IRepository 
{ 
    public DataSet ExecuteQuery(string aQuery); 
    //Other methods to interact with the DB (such as update or insert) are defined here. 
} 

public class CompanyInfoManager 
{ 
    private IRepository theRepository; 
    public CompanyInfoManager(IRepository aRepository) 
    { 
     //A repository is required so that we always know what 
     //we are talking to. 
     theRepository = aRepository; 
    } 

    public List<string> GetCompanyNames() 
    { 
     //Query database and return list of company names 
     string query = "SELECT * FROM COMPANIES"; 
     DataSet results = theRepository.ExecuteQuery(query); 
     //Process the results... 
     return listOfNames; 
    } 
} 

CompanyInfoManager परीक्षण करने के लिए:

//Class to test CompanyInfoManager 
public class MockRepository : IRepository 
{ 
    //This method will always return a known value. 
    public DataSet ExecuteQuery(string aQuery) 
    { 
     DataSet returnResults = new DataSet(); 
     //Fill the data set with known values... 
     return returnResults; 
    } 
} 

//This will always contain known values that you can test. 
IList<string> names = new CompanyInfoManager(new MockRepository()).GetCompanyNames(); 

मैं निर्भरता इंजेक्शन के बारे में पर घूमना नहीं करना चाहता था। Misko Hevery's bloggreat post to get started के साथ बहुत विस्तार से चला गया है।

+0

धन्यवाद दिमाग के माध्यम से पारित किया जाता है। मेरे पास आपके उदाहरण के समान कुछ है। मैंने दिया नमूना कोड मेरी कक्षा का एक सुपर छीन लिया संस्करण है। हाँ, मुझे रिपोजिटरी पैटर्न भी पसंद है। इसके अलावा, मैं अपने डी कंटेनर के लिए CastleWindsor का उपयोग करता हूं। – sean717

0

कक्षा स्थिर बनाकर, आपके पास कठिन समय इकाई परीक्षण होगी, तब तक आप को आंतरिक रूप से कनेक्शन स्ट्रिंग को गैर-स्पष्ट तरीके से पढ़ने के लिए प्रबंधन करना होगा, या तो कक्षा के अंदर इसे पढ़कर कॉन्फ़िगरेशन फ़ाइल से या किसी क्लास से अनुरोध करना जो इन स्थिरांकों का प्रबंधन करता है। मैं नहीं बल्कि एक पारंपरिक तरीका

var manager = new CompanyInfoManager(string connectionString /*...and possible other dependencies too*/) 

और फिर एक वैश्विक/सार्वजनिक स्थैतिक चर के लिए असाइन करें में इस तरह के एक वर्ग का दृष्टांत हैं तो कि

//this can be accessed globally 
public static CompanyInfoManager = manager; 

वर्ग के लिए समझ में आता है, यानी तो अब आप आपके यूनिट परीक्षणों के लिए कोई लचीलापन बलिदान नहीं करेगा, क्योंकि कक्षा के सभी निर्भरताओं को इसके निर्माता

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