2012-03-07 10 views
5

कोई भी विभिन्न टूल का उपयोग करके एक ही चीज़ को पूरा कर सकता है। तो क्या मैं नीचे उदाहरणों में हूं।PHP ओओपी: इंटरफ़ेस बनाम गैर-इंटरफ़ेस दृष्टिकोण - उदाहरण

एक इंटरफ़ेस/बहुरूपता का उपयोग दिखाता है (स्रोत: नेटटुट - मुझे लगता है)। एक और सीधा वर्ग इंटरैक्शन (मेरा) - जो कुछ बहुरूपता भी दिखाता है (call_tool() के माध्यम से)।

क्या आप मुझे बताएंगे, जो आप बेहतर तरीके से विचार करेंगे।

जो सुरक्षित, अधिक स्थिर, छेड़छाड़ प्रतिरोधी, भविष्य प्रमाण (afa कोड विकास संबंधित है) है।

कृपया दोनों में उपयोग किए गए दायरे/दृश्यता की जांच करें।

आपकी सामान्य सिफारिशें, जो सर्वोत्तम कोडिंग अभ्यास है।

इंटरफ़ेस:

 
class poly_base_Article { 

    public $title; 
    public $author; 
    public $date; 
    public $category; 

    public function __construct($title, $author, $date, $category = 0, $type = 'json') { 
     $this->title = $title; 
     $this->author = $author; 
     $this->date = $date; 
     $this->category = $category; 

     $this->type = $type; 
    } 

    public function call_tool() { 
     $class = 'poly_writer_' . $this->type . 'Writer'; 
     if (class_exists($class)) { 
      return new $class; 
     } else { 
      throw new Exception("unsupported format: " . $this->type); 
     } 
    } 

    public function write(poly_writer_Writer $writer) { 
     return $writer->write($this); 
    } 

} 

interface poly_writer_Writer { 

    public function write(poly_base_Article $obj); 
} 

class poly_writer_xmlWriter implements poly_writer_Writer { 

    public function write(poly_base_Article $obj) { 
     $ret = ''; 
     $ret .= '' . $obj->title . ''; 
     $ret .= '' . $obj->author . ''; 
     $ret .= '' . $obj->date . ''; 
     $ret .= '' . $obj->category . ''; 
     $ret .= ''; 
     return $ret; 
    } 

} 

class poly_writer_jsonWriter implements poly_writer_Writer { 

    public function write(poly_base_Article $obj) { 
     $array = array('article' => $obj); 
     return json_encode($array); 
    } 

} 

$article = new poly_base_Article('Polymorphism', 'Steve', time(), 0, $_GET['format']); 
echo $article->write($article->call_tool()); 

गैर इंटरफ़ेस

 
class npoly_base_Article { 

    public $title; 
    public $author; 
    public $date; 
    public $category; 

    public function __construct($title, $author, $date, $category = 0, $type = 'json') { 
     $this->title = $title; 
     $this->author = $author; 
     $this->date = $date; 
     $this->category = $category; 
     $this->type = $type; //encoding type - default:json 
    } 

    public function call_tool() { 
     //call tool function if exist 
     $class = 'npoly_writer_' . $this->type . 'Writer'; 
     if (class_exists($class)) { 
      $cls = new $class; 
      return $cls->write($this); 
     } else { 
      throw new Exception("unsupported format: " . $this->type); 
     } 
    } 

} 

class npoly_writer_jsonWriter { 

    public function write(npoly_base_Article $obj) { 
     $array = array('article' => $obj); 
     return json_encode($array); 
    } 

} 

class npoly_writer_xmlWriter { 

    public function write(poly_base_Article $obj) { 
     $ret = ''; 
     $ret .= '' . $obj->title . ''; 
     $ret .= '' . $obj->author . ''; 
     $ret .= '' . $obj->date . ''; 
     $ret .= '' . $obj->category . ''; 
     $ret .= ''; 
     return $ret; 
    } 

} 

$article = new npoly_base_Article('nPolymorphism', 'Steve', time(), 0, $_GET['format']); 
echo$article->call_tool(); 

MikeSW कोड

 
class poly_base_Article { 

    private $title; 
    private $author; 
    private $date; 
    private $category; 

    public function __construct($title, $author, $date, $category = 0) { 
     $this->title = $title; 
     $this->author = $author; 
     $this->date = $date; 
     $this->category = $category; 
    } 

    public function setTitle($title) { 
     return $this->title = $title; 
    } 

    public function getTitle() { 
     return $this->title; 
    } 

    public function getAuthor() { 
     return $this->author; 
    } 

    public function getDate() { 
     return $this->date; 
    } 

    public function getCategory() { 
     return $this->category; 
    } 


} 

interface poly_writer_Writer { 

    public function write(poly_base_Article $obj); 
} 

class poly_writer_xmlWriter implements poly_writer_Writer { 

    public function write(poly_base_Article $obj) { 

     $ret = ''; 
     $ret .= '' . $obj->getTitle() . ''; 
     $ret .= '' . $obj->getAuthor() . ''; 
     $ret .= '' . $obj->getDate() . ''; 
     $ret .= '' . $obj->getCategory() . ''; 
     $ret .= ''; 
     return $ret; 
    } 

} 

class poly_writer_jsonWriter implements poly_writer_Writer { 

    public function write(poly_base_Article $obj) { 
     //array replacement 
     //$obj_array = array('title' => $obj->getTitle(), 'author' => $obj->getAuthor(), 'date' => $obj->getDate(), 'category' => $obj->getCategory()); 
     //$array = array('article' => $obj_array); 

     $array = array('article' => $obj); //$obj arrives empty 
     return json_encode($array); 
    } 

} 

class WriterFactory { 

    public static function GetWriter($type='json') { 
     switch ($type) { 
      case 'json': 
      case 'xml': $class = 'poly_writer_' . $type . 'Writer'; 
       return new $class; 
       break; 
      default: throw new Exception("unsupported format: " . $type); 
     } 
    } 

} 

$article = new poly_base_Article('nPolymorphism', 'Steve', time(), 0); 
$writer=WriterFactory::GetWriter($_GET['format']); 

echo $writer->write($article); 

उत्तर

2

अहम, अपने दृष्टिकोण कोई बात नहीं कुछ खामियां है क्या संस्करण (अगर मैं इसे सही) । पहली बात, poly_base_Article उन क्षेत्रों को उजागर करता है जो encapsulation को तोड़ता है और थोड़ी देर में ओओपी का उपयोग करने के उद्देश्य को हरा देता है।

अगला, आपके पास $ _GET पैरामीटर के माध्यम से एक अच्छा इंजेक्शन है। वर्ग ऐसा करने के लिए उचित तरीके से किया जाना चाहिए जैसे कि

class poly_base_Article { 

private $title; 
private $author; 
private $date; 
private $category; 

public function __construct($title, $author, $date, $category = 0) { 
    $this->title = $title; 
    $this->author = $author; 
    $this->date = $date; 
    $this->category = $category; 

} 

public function getTitle() { return $this->title;} 
//...other getters defined here... 

    public function AsArray() 
    { 
      return (array) $this; 
    } 

//this could be removed 
public function write(poly_writer_Writer $writer) { 
    return $writer->write($this); 
} 
} 

लिखने विधि हालांकि आवश्यक हो प्रतीत नहीं होता है, तो आप सिर्फ वस्तु सीधे लिखने के लिए लेखक बताओ।

* call_tool * विधि एक सेवा से संबंधित होना चाहिए या एक कारखाने पद्धति के रूप में poly_writer_Writer (Btw, आप और अधिक प्राकृतिक कुछ वर्गों के नामकरण और इंटरफेस बदलना चाहिए), इस

की तरह कुछ का एक उदाहरण बनाने के लिए
class WriterFactory 
{ 
    public static function GetWriter($type='json') 
     { 
     switch($type) 
     { 
      case 'json' 
      case 'xml': $class= 'poly_writer_' . $type . 'Writer'; 
      return new $class; 
       break; 
      default: throw new Exception("unsupported format: " . $type); 
      } 
     } 
} 


    $article = new poly_base_Article('nPolymorphism', 'Steve', time(), 0); 
    $writer=WriterFactory::GetWriter(, $_GET['format']); 
echo $writer->write($article); 

कौन सा सुरक्षित, अधिक स्थिर, प्रतिरोधी, भविष्य सबूत छेड़छाड़ है (वायु सेना अकादमी कोड विकास का संबंध है)।

यह केवल डेवलपर कौशल और अनुशासन पर निर्भर करता है। इस particualr मामले में, कोड मैं लिखा है सुरक्षित, प्रतिरोधी और भविष्य सबूत छेड़छाड़ है: पी

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

लेखक फैक्टरी मूल रूप से कारखाना पैटर्न है जो लेखक का एक उदाहरण बनाता है और अमूर्तता देता है - यह बहुरूपता है जहां इंटरफ़ेस उपयोगी है।यह दृष्टिकोण इंटरफ़ेस के नए कार्यान्वयन को जोड़ने और कोड इंजेक्शन के खिलाफ सुरक्षा के लिए भी बहुत आसान बनाता है। स्विच यह जांचना है कि केवल $ प्रकार के मान्य मानों की अनुमति है। आप अन्य स्थानों में $ प्रकार को मान्य कर सकते हैं लेकिन यह एकमात्र ऐसा स्थान है जो लेखकों को बनाने से संबंधित सबकुछ को संभालना चाहिए। भले ही आप इसे बाहर सत्यापित करना चाहते हैं, फिर भी आप WriterFactory में एक स्थिर विधि बनाते हैं जो सत्य/झूठी और उपयोग से वापस आ जाएगा।

इंटरफेस के बारे में एक फड होने के बारे में ... इंटरफेस का उपयोग करना ओओपी कैसे किया जाना चाहिए। यह एक अमूर्तता के खिलाफ कार्यक्रम करने का सबसे अच्छा अभ्यास है और इंटरफेस 'सर्वश्रेष्ठ' अमूर्तता है। इसे स्पष्ट रूप से रखने के लिए: यदि इंटरफेस एक फीड हैं, तो ओओपी एक फीड है।

आपके दूसरे उदाहरण के बारे में, सबसे पहले, लेखक जो बनाता है वह विधि पहले स्थान पर नहीं होना चाहिए क्योंकि यह लेखक के लेख को लेख में जोड़ता है और उन 2 में बहुत कुछ सामान्य नहीं है। यह एसआरपी (एकल उत्तरदायित्व सिद्धांत) का तोड़ रहा है।

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

इसके अलावा सी # जैसी भाषा में, आपके पास एक रिटर्न प्रकार होगा और फिर, इष्टतम उपयोग के रूप में, आप इसे इंटरफ़ेस प्रकार के रूप में वापस कर देंगे (सी # गतिशील प्रकारों का समर्थन करता है जो मानते हैं कि PHP में थोड़ा सा व्यवहार करना है ताकि आप कर सकें गतिशील और परवाह नहीं करते हैं, लेकिन यह प्रदर्शन दंड के साथ आता है और यदि वापस लौटाया गया तरीका नहीं है तो यह अपवाद फेंक देगा)

+0

$ _GET - वह वास्तव में q का हिस्सा नहीं था। ;), इसलिए मैंने ज्यादा ध्यान नहीं दिया। लाइव कोड में यह प्रत्येक कोण से ठीक से देखा जाएगा। लेकिन आप सही हैं, मुझे इसे जाने नहीं देना चाहिए, भले ही वह क्यू से बाहर हो। गुंजाइश। – Jeffz

+0

यदि आप poly_base_Article गुण निजी बनाते हैं, तो उदाहरण कैसे हो सकता है poly_writer_xmlWriter उन्हें एक्सेस? उनके बीच कोई संबंध नहीं है – Jeffz

+0

WriterFactory - क्या यह सिर्फ अतिरिक्त ऑब्जेक्ट नहीं बना रहा है इसके बिना अतिरिक्त कार्यक्षमता जोड़ा गया है? – Jeffz

1

मैं this video की सिफारिश करके पूरी श्रृंखला शुरू करूंगा, और श्रृंखला से अन्य वीडियो ।

दो शर्तों जो इंटरफेस बेहतर बनाना होगा रहे हैं:

  • आप एक टीम में काम कर रहे हैं
  • दीर्घकालिक परियोजना इंटरफेस के

उपयोग प्रलेखन का एक और सेट, जब आप की तरह कार्य करता अपने कोडबेस की कार्यक्षमता का विस्तार करने की आवश्यकता है। इसके बाद principle of least astonishment का भी उपयोग किया जाता है।

बहुत छोटे & त्वरित परियोजना में इंटरफेस का उपयोग करने में कोई बात नहीं है।

+0

मैं इंटरफेस का उपयोग कर रहा हूं कहीं भी मुझे परियोजना की जटिलता के आकार के बावजूद कुछ अमूर्त करने की आवश्यकता है – MikeSW