2012-03-30 15 views
5

मैं एक साथी डेवलपर के कुछ कोड देख रहा था, और लगभग रोया। विधि परिभाषा में 12 तर्क हैं। मेरे अनुभव से .. यह अच्छा नहीं है। अगर यह मैं था, तो मैं किसी तरह की वस्तु में भेजता।ऐसी कोई विधि बनाने के बेहतर तरीके क्या हैं जो कई तर्क लेते हैं? (10+?)

क्या ऐसा करने के लिए एक और अधिक पसंदीदा तरीका है (दूसरे शब्दों में, इसे ठीक करने और क्यों समझाए जाने का सबसे अच्छा तरीका क्या है)?

public long Save (
    String today, 
    String name, 
    String desc, 
    int ID, 
    String otherNm, 
    DateTime dt, 
    int status, 
    String periodID, 
    String otherDt, 
    String submittedDt 
) 

मेरी गरीब चर नाम की उपेक्षा - वे उदाहरण हैं

+1

क्या तर्क किसी तरह से संबंधित हैं? यदि ऐसा है, तो उन्हें एक ऑब्जेक्ट में समूहित करें जो अर्थपूर्ण वर्णन करता है। आशा करता हूँ की ये काम करेगा। –

+0

मैंने सोचा कि यह एक उचित सवाल था, इसे बंद करने के लिए दो वोट क्यों हैं? – Cody

उत्तर

5

यह भाषा पर निर्भर करता है।

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

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

2

हाँ, उपयोग की वस्तुओं। साथ ही, यदि संभवतः यह सारी जानकारी की आवश्यकता है तो फ़ंक्शन शायद बहुत अधिक कर रहा है, इसलिए छोटे कार्यों का उपयोग करें।

+1

यही मैंने सोचा था। यह वास्तव में केवल एक तालिका में डेटा डालने .. – Cody

1

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

1

वस्तुओं का उपयोग करें।

class User { ... } 
User user = ... 
Save(user); 

यह निर्णय नए पैरामीटर जोड़ने के लिए आसान तरीका प्रदान करता है।

0

मुझे लगता है कि आप जिस समस्या का सामना कर रहे हैं वह विधि कॉल को देखने में सक्षम है और पता है कि कौन सा तर्क प्राप्त कर रहा है। जावा जैसी भाषा में यह एक हानिकारक समस्या है, जिसमें कीवर्ड तर्क या जेएसओएन हैश नामक तर्कों को पारित करने की कमी है।

इस स्थिति में, Builder pattern एक उपयोगी समाधान है। यह अधिक ऑब्जेक्ट्स है, तीन कुल है, लेकिन आप जिस समस्या का वर्णन कर रहे हैं उसके लिए अधिक समझदार कोड की ओर जाता है। इसलिए इस मामले में तीन वस्तुओं जैसे होगा:

  1. बात: स्टेटफुल इकाई, आम तौर पर अडिग (यानी ही टिककर खेल केवल)
  2. ThingBuilder: कारखाने वर्ग, एक बात इकाई बनाता है और अपने मूल्यों को निर्धारित करता है ।
  3. थिंगडाओ: बिल्डर पैटर्न का उपयोग करने के लिए आवश्यक नहीं है, लेकिन आपके प्रश्न को संबोधित करता है।

इंटरेक्शन

/* 
ThingBuilder is a static inner class of Thing, where each of its 
"set" method calls returns the ThingBuilder instance being worked with 
while the final "build()" call returns the instantiated Thing instance. 
*/ 
Thing thing = Thing.createBuilder(). 
       .setToday("2012/04/01") 
       .setName("Example") 
       // ...etc... 
       .build(); 

// the Thing instance as get methods for each property 
thing.getName(); 

// get your reference to thingDAO however it's done 
thingDAO.save(thing); 

परिणाम आप नामित तर्कों और अपरिवर्तनीय उदाहरण मिलता है।

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