Complex classes like ArrayQuery often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use ArrayQuery, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 25 | class ArrayQuery |
||
| 26 | { |
||
| 27 | /** |
||
| 28 | * @var array the data to search, filter. |
||
| 29 | */ |
||
| 30 | private $data; |
||
| 31 | /** |
||
| 32 | * @var array the array tokenized so user can search multidimensional array by key paths -ie `parentkey.child` |
||
| 33 | */ |
||
| 34 | private $tokens; |
||
| 35 | /** |
||
| 36 | * @var array the conditions to apply |
||
| 37 | */ |
||
| 38 | private $conditions = []; |
||
| 39 | |||
| 40 | |||
| 41 | /** |
||
| 42 | * @param array $array |
||
| 43 | */ |
||
| 44 | public function __construct(array $array) |
||
| 51 | |||
| 52 | /** |
||
| 53 | * Adds a condition to apply the array |
||
| 54 | * |
||
| 55 | * @param string $key the key to search in the array |
||
| 56 | * @param mixed $value the value to search. It supports SQL like operator plus some custom ones: |
||
| 57 | * - `~` or `like` : like `%value%` in SQL |
||
| 58 | * - `n~` or `nlike` : like `NOT LIKE` in SQL |
||
| 59 | * @param string $operator the operator. It can be `and` or `or`. If any of `or` matches it will be added to the |
||
| 60 | * successful results. |
||
| 61 | * |
||
| 62 | * @return static |
||
| 63 | */ |
||
| 64 | public function addCondition($key, $value, $operator = 'and') |
||
| 112 | |||
| 113 | /** |
||
| 114 | * Returns the first matched result. |
||
| 115 | * @return array the first matched result, empty array if none found. |
||
| 116 | */ |
||
| 117 | public function one() |
||
| 127 | |||
| 128 | /** |
||
| 129 | * Returns array of matched results. |
||
| 130 | * @return array the matched results. |
||
| 131 | */ |
||
| 132 | public function find() |
||
| 146 | |||
| 147 | /** |
||
| 148 | * Tokenizes the array to ease the search in multidimensional arrays. |
||
| 149 | * |
||
| 150 | * @param array $array the array to tokenize |
||
| 151 | * @param string $prefix the key prefix |
||
| 152 | * @param bool $addParent whether to add parent value anyway. False |
||
| 153 | * |
||
| 154 | * @return array |
||
| 155 | */ |
||
| 156 | public function tokenize($array, $prefix = '', $addParent = true) |
||
| 177 | |||
| 178 | /** |
||
| 179 | * Checks data against conditions |
||
| 180 | * |
||
| 181 | * @param mixed $data the data to match against. |
||
| 182 | * |
||
| 183 | * @return bool true if matches condition |
||
| 184 | */ |
||
| 185 | private function matches($data) |
||
| 208 | } |
||
| 209 |