:) मुझे यह पसंद नहीं है कि किसी चीज़ के साथ क्या किया जाए, इस बारे में बहस और बहस करना। इस मामले में लक्षण। मैं आपको दिखाता हूं कि मुझे क्या लक्षण मिलते हैं जो आपके लिए उपयोगी हैं और आप इसे सीख सकते हैं या इसे अनदेखा कर सकते हैं।
लक्षण - वे रणनीतियों को लागू करने के लिए महान हैं । रणनीति डिजाइन पैटर्न, संक्षेप में, उपयोगी होते हैं जब आप चाहते हैं कि एक ही डेटा को अलग-अलग तरीके से (फ़िल्टर्ड, सॉर्ट किया गया, आदि) संभाला जाए।
उदाहरण के लिए, आपके पास उन उत्पादों की एक सूची है, जिन्हें आप कुछ मानदंडों (ब्रांड, चश्मा, जो भी) के आधार पर फ़िल्टर करना चाहते हैं, या अलग-अलग माध्यमों (मूल्य, लेबल, जो भी) द्वारा क्रमबद्ध किया गया है। आप एक सॉर्टिंग विशेषता बना सकते हैं जिसमें अलग-अलग सॉर्टिंग प्रकार (संख्यात्मक, स्ट्रिंग, तिथि, आदि) के लिए अलग-अलग फ़ंक्शन होते हैं। फिर आप इस विशेषता का उपयोग न केवल अपने उत्पाद वर्ग (उदाहरण में दिए गए), बल्कि अन्य वर्गों में भी कर सकते हैं, जिन्हें समान रणनीतियों (कुछ डेटा, आदि के लिए संख्यात्मक प्रकार लागू करने के लिए) की आवश्यकता होती है।
कोशिश करो:
<?php
trait SortStrategy {
private $sort_field = null;
private function string_asc($item1, $item2) {
return strnatcmp($item1[$this->sort_field], $item2[$this->sort_field]);
}
private function string_desc($item1, $item2) {
return strnatcmp($item2[$this->sort_field], $item1[$this->sort_field]);
}
private function num_asc($item1, $item2) {
if ($item1[$this->sort_field] == $item2[$this->sort_field]) return 0;
return ($item1[$this->sort_field] < $item2[$this->sort_field] ? -1 : 1 );
}
private function num_desc($item1, $item2) {
if ($item1[$this->sort_field] == $item2[$this->sort_field]) return 0;
return ($item1[$this->sort_field] > $item2[$this->sort_field] ? -1 : 1 );
}
private function date_asc($item1, $item2) {
$date1 = intval(str_replace('-', '', $item1[$this->sort_field]));
$date2 = intval(str_replace('-', '', $item2[$this->sort_field]));
if ($date1 == $date2) return 0;
return ($date1 < $date2 ? -1 : 1 );
}
private function date_desc($item1, $item2) {
$date1 = intval(str_replace('-', '', $item1[$this->sort_field]));
$date2 = intval(str_replace('-', '', $item2[$this->sort_field]));
if ($date1 == $date2) return 0;
return ($date1 > $date2 ? -1 : 1 );
}
}
class Product {
public $data = array();
use SortStrategy;
public function get() {
// do something to get the data, for this ex. I just included an array
$this->data = array(
101222 => array('label' => 'Awesome product', 'price' => 10.50, 'date_added' => '2012-02-01'),
101232 => array('label' => 'Not so awesome product', 'price' => 5.20, 'date_added' => '2012-03-20'),
101241 => array('label' => 'Pretty neat product', 'price' => 9.65, 'date_added' => '2012-04-15'),
101256 => array('label' => 'Freakishly cool product', 'price' => 12.55, 'date_added' => '2012-01-11'),
101219 => array('label' => 'Meh product', 'price' => 3.69, 'date_added' => '2012-06-11'),
);
}
public function sort_by($by = 'price', $type = 'asc') {
if (!preg_match('/^(asc|desc)$/', $type)) $type = 'asc';
switch ($by) {
case 'name':
$this->sort_field = 'label';
uasort($this->data, array('Product', 'string_'.$type));
break;
case 'date':
$this->sort_field = 'date_added';
uasort($this->data, array('Product', 'date_'.$type));
break;
default:
$this->sort_field = 'price';
uasort($this->data, array('Product', 'num_'.$type));
}
}
}
$product = new Product();
$product->get();
$product->sort_by('name');
echo '<pre>'.print_r($product->data, true).'</pre>';
?>
एक समापन नोट के रूप में, मैं सामान की तरह लक्षण के बारे में सोचता हूं (जिसका उपयोग मैं अपने डेटा को बदलने के लिए कर सकता हूं)। इसी तरह के तरीके और गुण जो मेरी कक्षाओं से काटे जा सकते हैं और आसान रखरखाव, छोटे और क्लीनर कोड के लिए एक ही जगह पर रखे जा सकते हैं।