2008-10-10 9 views
10

मैंने कभी भी यह अच्छी तरह से करने का कोई तरीका नहीं देखा है, मुझे यह देखने में दिलचस्पी होगी कि अन्य लोग इसे कैसे करते हैं। वर्तमान में मैं इसे इस तरह से प्रारूप:बड़े पैरामीटर सूचियों के साथ विधियों को प्रारूपित करने के लिए कैसे करें

public Booking createVehicleBooking(Long officeId, 
            Long start, 
            Long end, 
            String origin, 
            String destination, 
            String purpose,   
            String requirements, 
            Integer numberOfPassengers) throws ServiceException { 
/*..Code..*/ 
} 

उत्तर

15

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

  • इसी तरह के बड़े पैरामीटर सेट के साथ कई तरीकों, कि एक ही विधि एक पैरामीटर वस्तु लेने के साथ बदला जा सकता है कर रहे हैं: यह विशेष रूप से सच है, तो या तो है।

  • विधि create...

कहा जाता है तो अपने ऊपर कोड बन सकता है (मेरी सी क्षमा ++, मैं एक जावा डेवलपर हूँ):

class BuildVehicleBooking { 
    Long officeId; 
    Long start; 
    Long end; 
    String origin; 
    String destination; 
    String purpose;    
    String requirements; 
    Integer numberOfPassengers; 

    Booking createVehicleBooking() throws ServiceException { ... } 
} 

यह बिल्डर पैटर्न है । इस पैटर्न का लाभ यह है कि आप अंत में create विधि को कॉल करने से पहले, पैरामीटर एक-दूसरे से संबंधित पैरामीटर के बारे में कई भिन्नताओं सहित, और नई जानकारी के रूप में ओवरराइटिंग पैरामीटर के रूप में कई भिन्नताओं सहित पैरामीटर में पैरामीटर का एक जटिल सेट बना सकते हैं। ।

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

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

+0

दुर्भाग्य से मुझे नहीं लगता कि मैं इससे दूर हो सकता हूं क्योंकि यह एक वेब सेवा के लिए एक एसओएपी एंडपॉइंट है, लेकिन फिर भी बहुत जानकारीपूर्ण है। – abarax

+0

आप वेब सेवाओं के लिए भी इस तकनीक को पूरी तरह से नियोजित कर सकते हैं। आपको अपनी कक्षा को क्रमबद्ध करने की आवश्यकता है, और वेब सेवाओं को होस्ट करने के लिए आप जो भी उपयोग कर रहे हैं उसके आधार पर स्कीमा को संभावित रूप से तैनात करने की आवश्यकता है (उदाहरण के लिए, उदाहरण के लिए मुझे विश्वास होगा, जबकि एएसपीनेट इसे आपके लिए संभाल लेगा) – Jeremy

+1

बिल्डर पैटर्न उपयोगी है, अच्छी सलाह! कुल विश्व वर्चस्व (थ्रेड सुरक्षा) के लिए, सुनिश्चित करें कि निर्माण विधि उन्हें सत्यापित करने से पहले सभी मानकों की प्रतिलिपि बनाती है। (इसके अलावा, मामूली टिप्स: पूर्णांक के बजाय लोन, int के बजाय लंबे समय तक उपयोग करें और गेटर/सेटर विधियों को प्रदान करें।) – volley

8
public Booking createVehicleBooking(
    Long officeId, 
    Long start, 
    Long end, 
    String origin, 
    String destination, 
    String purpose,     
    String requirements, 
    Integer numberOfPassengers) 

throws ServiceException { 
/*..Code..*/ 
} 
+0

यदि कई अपवाद फेंक दिए गए हैं, तो क्या आप उनमें से प्रत्येक को लंबवत भी रखते हैं? –

+0

क्रिस - कितने पर निर्भर करता है। यदि पर्याप्त है कि यह स्क्रीन के किनारे से चलाता है, हाँ। सामान्य नियम यह है: यदि यह पक्ष से बाहर चला जाता है, तो उन्हें संरेखित करें। यदि फ़ंक्शन का नाम बहुत लंबा, घोंसला और इंडेंट है। –

+1

यह बहुत अच्छा है। एकमात्र परिवर्तन जो मैं करता हूं वह क्लोजिंग कोष्ठक को "फेंकता" के समान रेखा पर ले जाना है, ताकि आप आसानी से देख सकें कि यह एक बड़े कथन का हिस्सा है। – nickf

3

मैं इसके बारे में कई वस्तुओं के बजाय इसके बारे में जाने के इच्छुक हूं।

तो यह

public Booking createVehicleBooking(Long officeId, DateRange dates, TripDetails trip) 

हो जाता है DATERANGE और यात्रा विवरण केवल डेटा के प्रासंगिक हिस्सों में निम्न शामिल है। हालांकि तर्कसंगत रूप से डेटरेंज यात्रा का हिस्सा हो सकता है, जबकि यात्रियों और यात्रियों की संख्या को TripDetails से हटाया जा सकता है और अनुरोध का हिस्सा बना दिया जा सकता है।

वास्तव में डेटा को पासा करने के कई तरीके हैं लेकिन मुझे अपनी बड़ी सूची को संबंधित पैरामीटर के समूहों में तोड़ना और उनके लिए एक ऑब्जेक्ट बनाना एक स्पष्ट प्रोग्रामिंग शैली और संभावित पुन: उपयोग को बढ़ाने की अनुमति देगा।

और याद रखें कि यह हमेशा इस प्रकार एक ओर जहां BookingParameters TripDetails शामिल है और तिथि सीमा के साथ-साथ वस्तुओं अन्य पैरामीटर के रूप में आप

public Booking createVehicleBooking(BookingParameters parameters) 

के लिए अनुमति देने वस्तु में वस्तुओं बैठाना करना संभव है।

+0

यह प्रश्न स्वरूपण के बारे में है। (कभी-कभी आपको रिफैक्टरिंग से पहले दिए गए कोड बेस के साथ काम करने की आवश्यकता होती है ;-) –

2

बुला ओर मैं इस तरह की टिप्पणियां का उपयोग करके नाम वाले पैरामीटर अनुकरण करना चाहते पर:

booking.createVehicleBooking(
    getOfficeId(),  // Long officeId 
    startVariable,  // Long start 
    42,     // Long end 
    getOrigin(),  // String origin 
    "destination",  // String destination 
    "purpose",   // String purpose  
    "requirements",  // String requirements 
    3     // Integer numberOfPassengers 
); 
1

मैं लाइन दृष्टिकोण है कि आप दिखा रहे हैं प्रति एक परम पसंद है। मुझे लगता है कि इसे दृष्टि से स्कैन करना और देखना है कि क्या मौजूद है।

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

+0

यदि आपके पास कोई अन्य प्रश्न है, तो कृपया [पूछें प्रश्न] (// stackoverflow.com/questions/ask) बटन पर क्लिक करके इसे पूछें। – manetsus

+0

मैनेट्सस, मेरे पाठ का कौन सा हिस्सा आपको लगता है कि यह एक प्रश्न है? मैं यह इंगित कर रहा था कि वहां कई तृतीय पक्ष पुस्तकालय हैं जो कई मानकों के साथ कॉल करना समाप्त करते हैं, जहां परम की ऊर्ध्वाधर सूची होने से इसे पढ़ने में आसान बनाता है। – Evvo

1

Google Java Style Guide इस सीधे संबोधित नहीं करता है, लेकिन मैं यानी

अमरूद में वे का प्रारूप तैयार किया है चीजों के साथ सहमत हैं, com.google.common.collect.Collections2.transform में:

public static <F, T> Collection<T> transform(
    Collection<F> fromCollection, Function<? super F, T> function) { 
    return new TransformedCollection<>(fromCollection, function); 
} 

com.google.common.collect.ImmutableRangeMap.toImmutableRangeMap में

public static <T, K extends Comparable<? super K>, V> 
    Collector<T, ?, ImmutableRangeMap<K, V>> toImmutableRangeMap(
     Function<? super T, Range<K>> keyFunction, 
     Function<? super T, ? extends V> valueFunction) { 
    return CollectCollectors.toImmutableRangeMap(keyFunction, valueFunction); 
} 

मैं मान लें कि नियम हैं:

  • विधि नाम और ब्रेस
  • इंडेंट मापदंडों उन्हें शरीर

व्यक्तिगत रूप से अलग करने के एक अतिरिक्त स्तर के बाद

  • तोड़ (एक पंक्ति यदि संभव हो तो उस पर रखने की कोशिश करें), मैं तोड़ने के लिए पसंद करते हैं प्रत्येक पैरामीटर के बाद यदि मुझे बिल्कुल तोड़ना है, यानी

    public static Foo makeFoo(
        Foo foo, 
        Bar bar, 
        Baz baz) 
         throws FooException { 
        f(); 
    } 
    
  • संबंधित मुद्दे