2010-07-28 17 views
8

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

<?php 
    if (A) { 
    $output = someFunc(A); 
    } else if (B) { 
    $output = anotherFunc(B); 
    } else if (C) { 
    $output = yetAnotherFunc(C); 
    } else { 
    $output = 'default stuff'; 
    } 
?> 
<html template top half> 

<?php echo $output; ?> 

</html template bottom half> 

यह पहले ठीक काम करता था, और बहुत अच्छी तरह व्यवस्थित लग रहा था, लेकिन आवश्यक कार्यक्षमता 10 के कारक से बढ़ी है और यह तेजी से एक अस्पष्ट, शर्मनाक गड़बड़ में बदल रहा है और मुझे नहीं पता कि इससे कैसे बाहर निकलना है।

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

मुझे एहसास है कि एमवीसी एक समाधान है? लेकिन मुझे यहां से वहां जाने के लिए कठिन समय मिल रहा है ...

उपरोक्त कोड से संकेत दिए गए किसी भी सिरदर्द या अप्रिय यादों के लिए मैं क्षमा चाहता हूं। आपके समय के लिए शुक्रिया।

+3

+1 'किसी भी सिरदर्द या अप्रिय यादों के लिए उपर्युक्त कोड संकेत दिया जा सकता है': डी – karim79

+1

चरण 1: आराम करें .. – ChaosPandion

उत्तर

5

ऐसा लगता है कि बहुत से लोग ऐसा करते हैं, एक बड़ा अगर और/या केस स्टेटमेंट बढ़ता जा रहा है। उन सभी "अगर" चेक में समय लग सकता है। एमवीसी निश्चित रूप से जाने का एक शानदार तरीका है, लेकिन इसे लागू करने के कई तरीके हैं। मैं फ्रंट कंट्रोलर डिज़ाइन पैटर्न को भी देखने की अनुशंसा करता हूं, जिसे आमतौर पर एमवीसी के साथ प्रयोग किया जाता है।

आप कैसे काम कर रहे हैं यह बदलने का एक तरीका है एक सहयोगी सरणी का उपयोग करके "क्रियाओं" की परिभाषित सूची में स्विच करना। और अपने कार्यों को शामिल करने के लिए बदलें। फिर आपके पास एकाधिक फ़ंक्शन, चर और अन्य प्रोसेसिंग कोड हो सकते हैं।

$actions = array(
'A'=>'action1.php', 
'B'=>'action2.php', 
'C'=>'action3.php', 
'default'=>'action_default.php' 
); 
if (isset($actions[ $_GET['action'] ])) { 
    include($actions[ $_GET['action'] ]); 
} else { 
    include($actions['default']); 
} 

फिर अपने "सूचकांक" फाइल सिर्फ एक मार्ग उपकरण है, जो काफी मोर्चा नियंत्रक अवधारणा है।

+0

मुझे उत्सुकता है कि आप 'आवश्यकता' के बजाय 'include' का उपयोग क्यों कर रहे हैं। क्या इसके पीछे कोई कारण है? फ़ाइल की अनुपलब्ध होने पर – icktoofay

+0

आवश्यकताएं एक घातक त्रुटि जारी करेगी, जिसमें एक चेतावनी शामिल है। –

0

एक सामान्य सुझाव: क्या आपने Smarty पर एक नज़र डाली है? मैंने इसे काफी उपयोगी टेम्पलेट इंजन पाया। इसे शायद कुछ सीखने की आवश्यकता है लेकिन यह लंबे समय तक इसके लायक हो सकता है।

4

किसी ऑब्जेक्ट उन्मुख कोड में, जब भी आप if/else या केस स्टेटमेंट की श्रृंखला देखते हैं, तो यह अक्सर एक गुच्छा के बजाय ऑब्जेक्ट पदानुक्रम द्वारा बेहतर होता है यदि/else/else।

अपने विशेष मामले में, आपके पास ए, बी और सी के लिए 3 अलग-अलग कक्षाएं हो सकती हैं और केवल एक $ obj-> doit() विधि को कॉल करें। ए, बी, और सी प्रत्येक के पास doit() विधि के विभिन्न कार्यान्वयन होंगे।

यदि आप अपनी रट से बाहर निकलना चाहते हैं, तो मैं डिजाइन पैटर्न के बारे में एक पुस्तक पढ़ने की सलाह देता हूं। http://www.fluffycat.com/PHP-Design-Patterns/

पैटर्न है कि समस्या के इस विशेष प्रकार के लिए आप के लिए विशेष रुचि का हो सकता है:

  • रणनीति यहाँ PHP में डिजाइन पैटर्न के कुछ उदाहरण हैं।
  • कमांड।
  • फैक्टरी।

PHP उदाहरणों के साथ इन पैटर्न का विवरण उपरोक्त लिंक में हैं। मैं कहीं और डिजाइन पैटर्न के बारे में और अधिक पढ़ने की सिफारिश करता हूं, लेकिन उस लिंक में PHP उदाहरण हैं।

मैं वास्तव में उन लोगों में से 3 का नियमित रूप से उपयोग करता हूं जो आपके द्वारा वर्णित स्थितियों के समान या समान स्थितियों में कोड व्यवस्थित रूप से व्यवस्थित करने के लिए करते हैं। यह इस तरह काम करता है: - रणनीति। यह एक कुकी-कटर या मैड लिब्स शैली की तरह है। आपने फ़ंक्शन करने में शामिल मूलभूत बातें स्थापित की हैं। उपयोगकर्ता (आधार वर्ग का उपयोग करने वाला प्रोग्रामर) कुछ चीजों को ओवरराइड कर सकता है यदि उसे जरूरत है, लेकिन काम करने के लिए मूल बातें सभी जगह पर हैं। उदाहरण: हमें एक व्यवसाय प्रक्रिया करने की जरूरत है। आम तौर पर इसमें एक लेनदेन शुरू करना, काम के "मांस" करना, फिर सफाई और लॉगिंग करना शामिल है। शायद स्ट्रैजी/कुकी-कटर पैटर्न का उपयोग करने के लिए शायद अधिकतर लगता है, लेकिन यह अक्सर नहीं होता है: कोड के "मांस" में फेंकने वाली त्रुटि या अपवाद होने पर भी आपको सफाई करने की याद रखना आवश्यक है। रणनीति/कुकी-कटर पैटर्न का उपयोग करके, आप न्यूनतम बॉयलरप्लेट/दोहराए गए कोड के साथ ऐसा सब कुछ कर सकते हैं।

  • कमान: रणनीति पैटर्न मैं उपर्युक्त के विचारों के साथ संयुक्त, आप अपने कार्यों कि वास्तविक काम करने में कम बॉयलरप्लेट कोड है।

  • फैक्टरी। आप जिस स्थिति का सामना कर रहे हैं उसके लिए उचित प्रकार की कमांड उत्पन्न करने के लिए आप फैक्ट्री विधि का उपयोग करते हैं।

उन 3 डिजाइन पैटर्न एक साथ रखा स्थिति के इस प्रकार के लिए बहुत अच्छी तरह से काम करते हैं, और कुछ बहुत साफ कोड जहां आप अपने आप को दोहराने कभी नहीं हो सकता है।

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

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