2015-12-25 6 views
8

मेरे पास एक क्लाइंट लाइब्रेरी है जिसमें मैं अपनी बाकी सेवा के लिए http दूरस्थ कॉल कर रहा हूं और फिर मैं उस ग्राहक को List<DataResponse> वापस लौटा रहा हूं जो मेरी लाइब्रेरी को प्रतिक्रिया के साथ कॉल कर रहा है, जो मुझे मेरे आरईएसटी से मिल रहा है अगर DataResponse ऑब्जेक्ट के आसपास लपेटा गया है तो किसी भी त्रुटि के साथ सेवा।लंबे कन्स्ट्रक्टर बनाने से कैसे बचें

public enum ErrorCode { 

    // enum values 

    private final int code; 
    private final String status; 
    private final String description; 

    // constructors and getters 

} 

यहाँ है मेरी StatusCode enum वर्ग और::

public enum StatusCode { 
    SUCCESS, FAILURE; 
} 

तुम मेरे DataResponse वर्ग में देख सकते हैं मैं क्षेत्रों में बहुत कुछ तो है

public class DataResponse { 

    private final String response; 
    private final boolean isLink; 
    private final TypeOfId idType; 
    private final long ctime; 
    private final long lmd; 
    private final String maskInfo; 

    // below are for error stuff 
    private final ErrorCode error; 
    private final StatusCode status; 

    // constructors and getters here 

} 

यहाँ मेरी ErrorCode enum वर्ग है इसके आधार पर मेरे पास एक बहुत लंबा कन्स्ट्रक्टर है और जब भी मैं DataResponse ऑब्जेक्ट करता हूं तो मेरे पास new DataResponse(.......) के साथ एक बड़ी लाइन है। भविष्य में मेरे पास और फ़ील्ड हो सकते हैं लेकिन अभी के लिए मेरे पास केवल इन फ़ील्ड हैं।

क्या कोई बेहतर तरीका है जिसका उपयोग मैं DataResponse ऑब्जेक्ट बनाने के लिए कर सकता हूं और फिर मेरी लाइब्रेरी से List<DataResponse> वापस लौटा सकता हूं?

+5

आप निर्माता पैटर्न का उपयोग कर सकते हैं। – YoungHobbit

+0

http://stackoverflow.com/a/6395981/3885376 –

+0

मैं अभी तक किसी निर्माता पर निर्भर नहीं हूं। आपके पास बहुत सारे क्षेत्र हैं? अपघटन के लिए नौकरी की तरह लगता है। [यह उत्तर] देखें (http://stackoverflow.com/questions/33784390/object-oriented- डिज़ाइन-how-important-is-encapsulation-when-therere-lots-of-da/33785266#33785266)। यदि आपको अभी भी लगता है कि आप बाद में कन्स्ट्रक्टर को बहुत अधिक डेटा पास कर रहे हैं, तो आप एक बिल्डर पैटर्न का उपयोग कर सकते हैं। हालांकि उचित अपघटन आमतौर पर चाल करता है। मुझे वैकल्पिक पैरामीटर के लिए उपयोगी बनाने के लिए बिल्डर्स मिलते हैं (टेलीस्कोपिंग कन्स्ट्रक्टर से बचने के लिए जो कई मानकों से परहेज करने के बजाय डिफ़ॉल्ट मानों की आपूर्ति करते हैं) –

उत्तर

14

builder pattern का तुरंत उपयोग न करें। यह के साथ फ़ील्ड के टन के प्रकारों के लिए नहीं है। यह वैकल्पिक फ़ील्ड के टन के प्रकारों के लिए है।

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

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


इसके साथ, आपको decompose अपने प्रकार का होना चाहिए। मुझे यकीन नहीं है कि lmd या ctime है, या वास्तव में DataResponse का प्रतिनिधित्व करना है, इसलिए मैं आपको यह नहीं बता सकता कि आपको किस तरह से विघटन करना चाहिए। लेकिन मैं आपको बता सकता हूं कि cohesion इस तरह का निर्धारण करता है।

class DataResponseDetails { 
    private boolean isLink; 
    private String maskInfo; 
    private TypeOfId idType; 

    public DataResponseDetails(boolean isLink, String maskInfo, TypeOfId idType) { 
     //... 
    } 
} 

अब आप अपने DataResponseDataResponseDetails से बना जा सकता है::

class DataResponse { 
    private DataResponseDetails details; 
    private String response; 
    //... 

    public DataResponse(DataResponseDetails details, String response, ...) { 
     //... 
    } 
} 

अपने निर्माता महसूस बहुत ज्यादा अभी भी आवश्यकता है

isLink, maskInfo और idType संभवतः एक DataResponseDetails वस्तु में विघटित किया जा सकता है? अधिक विघटित करें!

+0

मैं इसे जोड़ दूंगा, मेरे लिए वैकल्पिक विकल्प के लिए वैकल्पिक वर्ग (गुवा या जावा 8 से एक) का उपयोग करने के लिए सबसे अच्छा अभ्यास माना जाना चाहिए, शून्य मूल्यों से छुटकारा पाने के लिए –

0

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

public class DataResponse { 

     private final String response; 
     private final boolean isLink; 
     private final TypeOfId idType; 
     private final long ctime; 
     private final long lmd; 
     private final String maskInfo; 

     // below are for error stuff 
     private final ErrorCode error; 
     private final StatusCode status; 

     // constructors and getters here 


     public static class Builder { 

      private final String response; 
      private final boolean isLink; 
      private final TypeOfId idType; 
      private final long ctime; 
      private final long lmd; 
      private final String maskInfo; 

      // below are for error stuff 
      private final ErrorCode error; 
      private final StatusCode status; 

      public Builder reponse(final String response) { 
       this.response = response; 
       return this; 
      } 

      public Builder isLing(final boolean isLink) { 
       this.isLink = isLink; 
       return this; 
      } 

      public DataResponse builder() { 
       return new DataResponse(this); 
      } 

      ... 

     } 

     private DataResponse(final Builder builder) { 
      this.response = builder.response; 
      this.isLink = builder.isLink; 
     } 
    } 

और उसके बाद इस प्रकार कुछ करना:

DataResponse response = new DataResponse.Builder().reponse(anyResponse).isLink(isLink).build(); 
4

शायद तुम क्षेत्रों के छोटे तार्किक समूहों की पहचान एक उन्हें वस्तुओं में स्थानांतरित कर सकते हैं

यहाँ आप क्या कोड का उपयोग कर की तरह लग सकता है एक वर्ग की। फिर आप इन सभी वस्तुओं को अपने DataResponse ऑब्जेक्ट्स में इकट्ठा कर सकते हैं।

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