2013-02-25 135 views
6

मैं वर्तमान में एक कोडबेस पर काम कर रहा हूं जहां चर के कुछ वर्ग हैं, जैसे डाटाबेस पथ, जिन्हें स्ट्रिंग्स के रूप में दर्शाया जाता है। इन (गैर-) प्रकारों पर अधिकांश संचालन एक उपयोगिता वर्ग में परिभाषित किए जाते हैं।"स्ट्रिंग-टाइप" कोड को दोबारा कैसे करें?

मैंने पारंपरिक ओओपी शैली में, उदाहरण विधियों के रूप में परिभाषित संचालन के साथ डेटाबेस का प्रतिनिधित्व करने के लिए एक नई कक्षा बनाई है। हालांकि यह बड़े कोडबेस के माध्यम से जाने और नए प्रकारों का उपयोग करने के लिए इसे पुनः प्रतिक्रिया देने के लिए काफी श्रमिक है। क्या किसी को यह सलाह है कि यह जल्दी और प्रभावी ढंग से कैसे करें?

+1

न चर में डेटाबेस पथ भंडारण या के साथ एक databasae प्रतिनिधित्व करने के लिए एक वर्ग बनाने तरीकों में परिभाषित संचालन, अच्छा ध्वनि। – NimChimpsky

उत्तर

1

डाटाबेस पथ ध्वनि जैसे वे मेरे लिए स्ट्रिंग होना चाहिए। और क्या समझ में आता है? और इन्हें कॉन्फ़िगरेशन फ़ाइलों या डेटाबेस में बाह्यकृत किया जाना चाहिए। यह आपकी समस्याओं का कम से कम है।

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

यदि आपको "जेनेरिक डीएओ" के लिए Google कुछ लिखना है। आप इस तरह सामान मिल जाएगा: अपने काम को ऐसा ही कुछ के बाद नमूनों नहीं है

http://www.ibm.com/developerworks/java/library/j-genericdao/index.html

हैं, तो इसे फेंक और फिर से लगता है कि चीजें।

+0

हाइबरनेट, वसंत, आदि का उपयोग करने का सीधा तरीका सबसे अच्छा नहीं हो सकता है, इसलिए अपने कोड के आधार पर चरण के बीच वैध कारण हो सकते हैं। मैंने खुद इसे कुछ बार देखा है। शिक्षण हाइबरनेट और वसंत भी बहुत प्रयास है। – SpaceTrucker

+0

मैं हाइबरनेट से सहमत हूं - मैं इसे किसी के लिए अनुशंसा नहीं करता। लेकिन मैं वसंत जेडीबीसी के साथ और असहमत नहीं हो सका। यह मृत सरल और अच्छी तरह से डिजाइन किया गया है। आप स्प्रिंग के कुछ हिस्सों को बिना मास्टर के इस्तेमाल कर सकते हैं। – duffymo

3

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

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

0

मैं आमतौर पर एप्लिकेशन/प्रक्रिया सीमा की सीमा पर स्ट्रिंग को अलग करने की कोशिश करता हूं, जैसे कि जब उन्हें किसी डेटाबेस से पुनर्प्राप्त किया जाता है या वेब ऑपरेशन के माध्यम से प्राप्त किया जाता है।

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

इसी तरह, ऑब्जेक्ट मॉडल को मैप/कनवर्ट/स्ट्रिंग फॉर्म में क्रमबद्ध किया जा सकता है क्योंकि यह आपके एप्लिकेशन/प्रक्रिया सीमा से बाहर निकलता है।

यह ध्यान देने योग्य है कि यह कड़ाई से टाइपिंग कुछ हद तक सूक्ष्म हो सकती है। मैं आमतौर पर आवेदन और डोमेन परतों में घुसपैठ xml देखते हैं। .NET स्पेस का एक समान उदाहरण ADO.NET डेटाटेबल्स (उनके स्ट्रिंग कॉलम नामों और अनियमित फ़ील्ड मानों के साथ) कक्षाओं/ऑब्जेक्ट्स में जितनी जल्दी हो सके उतने ही मैप करने में विफल रहेगा। मुझे कोई संदेह नहीं है कि जावा दुनिया में कई समान समकक्ष हैं। स्ट्रिंगली टाइपिंग केवल तारीख मानों तक ही सीमित नहीं है, क्योंकि मजाक जाता है।

1

एक तकनीक जिसे मैंने सी # में उपयोग किया है (और सिर्फ जावा में पोर्ट किया गया है - अगर मैंने कोई त्रुटि की है, तो मैं जावा में नया हूं) स्ट्रिंगली टाइपेड क्लासेस बनाने के लिए है, उदा।एक आधार वर्ग

public abstract class StringlyTyped { 
    private String value; 

    public StringlyTyped (String value){ 

     if (value == null){ 
      throw new IllegalArgumentException("value must not be null"); 
     } 
     this.value = value; 
    } 

    public String getValue() { return value; } 

    @Override 
    public boolean equals(Object other){ 
     if (other == this) { 
      return true; 
     } 

     if (other == null || !this.getClass().equals(other.getClass())){ 
      return false; 
     } 

     StringlyTyped o = (StringlyTyped)other; 
     return o.getValue().equals(this.getValue()); 
    } 

    @Override 
    public int hashCode(){ return this.getValue().hashCode(); } 

    @Override 
    public String toString() { return this.getValue(); } 
} 

फिर व्युत्पन्न वर्ग

public class ProviderName extends StringlyTyped { 

    public ProviderName(String value) { 
     super(value); 
    } 
} 

और उपयोग

public void Foo(ProviderName provider) { 
} 

यह भावना आप कई स्ट्रिंग parametrers, उदा तरीकों जब बनाता है आप

public void Foo(String username, String password, String db, String table, String constraint) 

से बच सकते हैं और इसके बजाय कोड है कि दृढ़ता से इस तरह लिखा गया है:

public void Foo(UserName username, Password password, DatabasePath db, TableName table...) 

आदि ...