:) কোনও কিছু দিয়ে কী করা উচিত তা নিয়ে তাত্ত্বিক ধারণা এবং বিতর্ক করতে আমি পছন্দ করি না। এই ক্ষেত্রে বৈশিষ্ট্য। আমি কীগুলির জন্য আমার বৈশিষ্ট্যগুলি কার্যকর বলে মনে করব এবং আপনি তা থেকে শিখতে পারেন, বা এড়িয়ে যেতে পারেন।
বৈশিষ্ট্য - কৌশল প্রয়োগের জন্য তারা দুর্দান্ত । সংক্ষেপে কৌশলগত নকশার নিদর্শনগুলি কার্যকর যখন আপনি একই ডেটা হ্যান্ডেল করতে চান (ফিল্টার করা, সাজানো ইত্যাদি) আলাদাভাবে।
উদাহরণস্বরূপ, আপনার কাছে এমন কিছু পণ্যগুলির তালিকা রয়েছে যা আপনি কিছু মানদণ্ডের (ব্র্যান্ড, চশমা, যাই হোক না কেন), বা বিভিন্ন উপায়ে (দাম, লেবেল, যাই হোক না কেন) দ্বারা বাছাই করে ফিল্টার করতে চান। আপনি একটি বাছাই করা বৈশিষ্ট্য তৈরি করতে পারেন যা বিভিন্ন বাছাই করার ধরণের (সংখ্যা, স্ট্রিং, তারিখ, ইত্যাদি) এর জন্য বিভিন্ন ফাংশন ধারণ করে। তারপরে আপনি এই বৈশিষ্ট্যটি কেবল আপনার পণ্য শ্রেণিতেই ব্যবহার করতে পারবেন না (উদাহরণস্বরূপ যেমনটি দেওয়া হয়েছে), কিন্তু অন্যান্য শ্রেণিতেও একই ধরণের কৌশল প্রয়োজন (কিছু উপায়ে সংখ্যাসূচক বাছাই করা ইত্যাদি)।
এটি চেষ্টা করুন:
<?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>';
?>
একটি সমাপ্ত নোট হিসাবে, আমি আনুষাঙ্গিকগুলির মতো বৈশিষ্ট্যগুলি সম্পর্কে চিন্তা করি (যা আমি আমার ডেটা পরিবর্তন করতে ব্যবহার করতে পারি)। সহজ রক্ষণাবেক্ষণ, সংক্ষিপ্ত এবং ক্লিনার কোডের জন্য অনুরূপ পদ্ধতি এবং বৈশিষ্ট্য যা আমার ক্লাস থেকে কেটে ফেলা যায় এবং একক জায়গায় রাখা যেতে পারে।