2011-02-11 4 views
5

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

function prepOptional($formData) { 

    $baseInfo=getBaseInfo(); 

    $_SESSION['fooData'] = (isset($formData['cbFoo']) ? prepBaseForm($baseInfo, 'foo', 
      'Option foo') : ''); 

    $_SESSION['opt1Data'] = (isset($formData['cbOpt1']) ? prepBaseForm($baseInfo, 'opt1', 
      'Option 1') : ''); 

    $_SESSION['barData'] = (isset($formData['cbBar']) ? prepBaseForm(prepOtherArray($formData), 'bar', 
      'Option bar', 'Optional argument') : ''); 

} 

समारोह तर्क के रूप में एक formdata सरणी स्वीकार करता है, और निहित मूल्यों यह सत्र में इसी सरणियों उत्पन्न करता है पर निर्भर करता है; यह मिलान करने वाले ध्वज के अस्तित्व की जांच के बाद ही होता है, इसलिए जारीकर्ता और टर्नरी ऑपरेटर।

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

यदि मान सरणी में मौजूद नहीं है, तो पीढ़ी के आदेश को बरकरार रखने के लिए कोड जानबूझकर संबंधित सत्र चर को "'साफ़ करता है (इस अंत में: क्या ऐसा करने का एक बेहतर तरीका है, इस पर विचार करना वे परिदृश्य हैं जिनमें दिए गए पीढ़ी के आदेश को तोड़ा जाएगा?)।

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

+0

प्रीबेसबेसफॉर्म() फ़ंक्शन चर सेट होने पर परीक्षण का काम कर सकता है। और ऐसा लगता है कि आपको इन बदसूरत स्केलर्स –

+0

की बजाय आपको '$ _SESSION [' data '] [' opt1 ']' की आवश्यकता है; हालांकि, जब भी मैं prepBaseForm फ़ंक्शन को कॉल करता हूं, तो मैं पूरे फॉर्मडाटा सरणी को पारित करने के कारण ओवरहेड से थोड़ा चिंतित हूं। मैं वास्तव में इस कोड को कक्षा में बदलने पर विचार करना शुरू कर रहा हूं, ताकि मैं इसका बेहतर तरीके से संरचित तरीके से देखभाल कर सकूं। हालांकि मुझे कुछ नहीं मिला है: कोड के किस हिस्से में आप सुझाव दे रहे थे कि मुझे स्केलर्स से छुटकारा पाना चाहिए? क्या आप फ़ंक्शन को मानों को सरणी के रूप में पास करने की सिफारिश कर रहे हैं, या फॉर्मडाटा में झंडे से संबंधित सत्र सरणी निर्धारित करने के लिए एक का उपयोग कर रहे हैं? –

उत्तर

4

एक विकल्प डिफ़ॉल्ट प्रदान करना होगा, और सामान्य स्थितिओं का उपयोग करके मूल्यों को बदलते समय इसे चलाएं। फिर आप सबकुछ एक साधारण लूप में डालकर और साफ कर सकते हैं .:

function prepOptional($formData) { 
    $baseInfo=getBaseInfo(); 

    $options = array(
     'foo' => 'Option foo', 
     'opt1' => 'Option Opt1', 
     'bar' => 'Option Bar', 
    ); 
    foreach ($options as $name => $text) { 
     //Add defaults for formData and Session arrays) 
     $formData += array('cb' . ucfirst($name) => ''); 
     $_SESSION += array($name . 'Data' => ''); 

     if ($formData['cb' . ucfirst($name)]) { 
      $_SESSION[$name . 'Data'] = prepBaseForm(
       $baseInfo, 
       $name, 
       $text 
      ); 
     } 
    } 
} 
+0

डिफ़ॉल्ट/ओवरराइड के लिए +1 और कोड को कम करने के लिए नामकरण सम्मेलनों का उपयोग –

+0

मुझे यह दृष्टिकोण पसंद है, धन्यवाद। मैं फ्लैग वैल्यू के रूप में दोस्ताना नाम पास करके और उस मूल्य को स्टोर करने के लिए विकल्प सरणी का उपयोग करने के बजाय इसे और अधिक कॉम्पैक्ट कर सकता हूं, मैं पीढ़ी के तर्क को पकड़ने के लिए इसका उपयोग कर सकता हूं, जहां प्रीबेसबेस के लिए इनपुट अलग-अलग होते हैं, और यह ठीक काम करना चाहिए। बहुत धन्यवाद, बस मुझे क्या चाहिए: डी –

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