:) ฉันไม่ชอบทฤษฎีและอภิปรายเกี่ยวกับสิ่งที่ควรทำกับบางสิ่ง ในกรณีนี้ลักษณะ ฉันจะแสดงให้คุณเห็นสิ่งที่ฉันพบว่ามีประโยชน์และคุณสามารถเรียนรู้จากมันหรือไม่สนใจมัน
ลักษณะ - พวกเขาเป็นที่ดีในการใช้กลยุทธ์ รูปแบบการออกแบบกลยุทธ์โดยย่อมีประโยชน์เมื่อคุณต้องการจัดการข้อมูลเดียวกัน (กรองเรียงลำดับ ฯลฯ ) แตกต่างกัน
ตัวอย่างเช่นคุณมีรายการผลิตภัณฑ์ที่คุณต้องการกรองออกตามเกณฑ์บางอย่าง (แบรนด์รายละเอียดอะไรก็ตาม) หรือเรียงลำดับตามวิธีการที่แตกต่างกัน (ราคาฉลากอะไรก็ตาม) คุณสามารถสร้างลักษณะการจัดเรียงที่มีฟังก์ชั่นที่แตกต่างกันสำหรับประเภทการเรียงลำดับที่แตกต่างกัน (ตัวเลข, สตริง, วันที่, ฯลฯ ) จากนั้นคุณสามารถใช้คุณลักษณะนี้ไม่เพียง แต่ในคลาสผลิตภัณฑ์ของคุณ (ตามที่ระบุในตัวอย่าง) แต่ยังอยู่ในคลาสอื่น ๆ ที่ต้องการกลยุทธ์ที่คล้ายคลึงกัน (เพื่อใช้การเรียงลำดับตัวเลขกับข้อมูลบางอย่าง ฯลฯ )
ลองมัน:
<?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>';
?>
ในฐานะที่เป็นบันทึกการปิดฉันคิดว่าลักษณะเช่นอุปกรณ์เสริม (ซึ่งฉันสามารถใช้เพื่อแก้ไขข้อมูลของฉัน) วิธีการและคุณสมบัติที่คล้ายกันซึ่งสามารถตัดออกจากชั้นเรียนของฉันและใส่ไว้ในที่เดียวเพื่อการบำรุงรักษาง่ายรหัสที่สั้นลงและสะอาดขึ้น