2011-06-16 18 views
7

मैं मूल रूप से एक विज्ञापन-प्रणाली के लिए डिस्प्ले-मॉड्यूल बना रहा हूं जिसे मैंने बनाया है।ऑब्जेक्ट ओरिएंटेड डिज़ाइन के साथ if-statement से बचें, PHP

मैं दोहराए गए बयान के साथ निम्नलिखित निर्माण से बचने की कोशिश कर रहा हूं।

मेरी आंत महसूस मुझे बताती है कि ऐसा करने का एक शानदार तरीका है, शायद बहुरूपता के साथ?

<?php 

class Ad { 
    public $adState = 'active'; 
} 

class AdWriter { 
    public function displayAd(Ad $ad, $viewmode = 'visitor') { 
     if ($viewmode =='visitor') { 
      if ($adState == 'active') {} 

      else if ($adState == 'paused') {} 

      else if ($adState == 'inactive') {} 

     } 

     else if ($viewmode = 'owner') { 
      if ($adState == 'active') {} 

      else if ($adState == 'paused') {} 

      else if ($adState == 'inactive') {} 
     } 

     else if ($viewmode == 'administrator') { 
      if ($adState == 'active') {} 

      else if ($adState == 'paused') {} 

      else if ($adState == 'inactive') {} 
     } 
    } 
} 

?> 

उत्तर

0

मैं काम पर StackOverflow पर चुपके कर रहा हूँ, तो अपनी सभी संभावनाओं का एक विस्तृत जबाब लिखने के लिए समय नहीं है। viewmode पर एक स्विच का उपयोग

switch $viewmode { 
    case 'visitor': 
    your_code_here; 
    break; 
    case 'owner': 
    your_code_here; 
    break; 
    default: 
    will_run_if_nothing_above_matches; 
    break; 
} 
+2

उसने एक बेहतर तरीका पूछा, और आपने इसे दिखाया। अच्छा। :) –

+2

हालांकि वास्तव में कुछ भी खत्म नहीं किया था? मैं अभी भी राज्यों के लिए बार-बार जांच कर अटक गया हूं। – Poyan

+0

-1 यह प्रभावी रूप से ifs – Gordon

4

आप एक Factory (Pattern) बना सकते हैं, और 'प्रदर्शन एक विशिष्ट Ad एक interface को लागू करने के लिए एक सरल समारोह होने बनाने के लिए:

लेकिन' साफ अप 'उन भारतीय विदेश सेवा के लिए, आप यह कर सकते हैं ' उदाहरण के लिए।

छद्म उदाहरण:

class AdFactory { 

    public static function getAd($sType) { 
     switch($sType) { 
      case "AdOne": 
       return new AdOne(); 
      case "AdTwo": 
       return new AdTwo(); 
     } 
    } 
    throw new Exception("Unknown ad!"); 
} 

class AdOne implement AdInterface { 
    public function display() { 
     // All that AdOne does when displaying. 
    } 
} 

interface AdInterface { 
    public function display() { } 
} 

$oAd1 = AdFactory::getAd('typeOne'); 
$oAd1->display(); 

$oAd2 = AdFactory::getAd('typeTwo'); 
$oAd2->display(); 
+0

जैसा ही है, मैं इसे देख लूंगा; धन्यवाद। – Poyan

3

गुजर $ viewmode के बजाय, एक वस्तु है कि इस viewmore के लिए तर्क संपुटित और उसके विधि है कि काम करना होगा कहेंगे गुजरती हैं। इस तरह आप if-statement की आवश्यकता से बचेंगे।

0
switch($viewmode){ 
    case "visitor": 
     switch($adstate){ 
      case "active": 
       //statement 
       break; 
      case "paused": 
      break; 
      case "inactive": 
      break; 
     } 
     break; 
    case "owner": 
     break; 
    case "administrator": 
     break; 
} 
0

this book के 8 अध्याय में आप अपने प्रश्न का बहुत विस्तृत उत्तर पा सकते हैं।

संक्षेप में: Composition या कारखानों का उपयोग करें। (वेस्ले वैन ओपडॉर्प का जवाब देखें)।

इसके अलावा, गणनीय के रूप में स्ट्रिंग तर्क के प्रयोग से बचें: इस तर्क के साथ $viewmode = 'visitor'
, आप स्मृति में इस तर्क के सभी संभव मूल्यों रखने के लिए होगा। या उन्हें याद रखने के लिए समारोह के कोड में देखो। और ये मान तार हैं - टाइपो के लिए अच्छी जगह। साथ ही, फीचर में मूल्यों को बदलना बहुत मुश्किल होगा, क्योंकि इस विधि की सभी कॉल में हार्डकोडेड स्ट्रिंग्स होंगे।
उपयोग वर्ग स्थिरांक:

class AdWriter { 
const view_mode_visitor = 1; 
... 

इसके अलावा, $adState - गलत कोड, $ प्रशासनिक> राज्य होना चाहिए। लेकिन सार्वजनिक क्षेत्रों का उपयोग करना भी बुरा व्यवहार है :)

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