Complex classes like Indexer 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 Indexer, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
7 | class Indexer extends Tree |
||
8 | { |
||
9 | const TARGET_INDEX_PERCENT = 0.96; |
||
10 | const DEFAULT_ZONE_RESULT = -1; |
||
11 | const LEVEL_DELIMITER_SYMBOL = "."; |
||
12 | const TOTAL_LEVELS = 4; |
||
13 | |||
14 | protected $dataSourcePath = null; |
||
15 | protected $dataSource; |
||
16 | protected $timezones = array(); |
||
17 | protected $lookup = array(); |
||
18 | protected $currentQuadrants = array(); |
||
19 | |||
20 | |||
21 | public function __construct($dataDirectory = null, $dataSourcePath = null) |
||
26 | |||
27 | /** |
||
28 | * Initialize the current quadrants attribute for the first indexing iteration |
||
29 | */ |
||
30 | protected function initCurrentQuadrants() |
||
51 | |||
52 | /** |
||
53 | * Read the new timezones json to be indexed |
||
54 | */ |
||
55 | protected function readDataSource() |
||
64 | |||
65 | /** |
||
66 | * Save timezones values from the reference file (timezones json) to timezones array attribute |
||
67 | */ |
||
68 | protected function setTimezonesArray() |
||
74 | |||
75 | /** |
||
76 | * Find the timezones that intersect with or are within the quadrant polygon |
||
77 | * @param $timezonesToInspect |
||
78 | * @param $quadrantBounds |
||
79 | * @return array |
||
80 | */ |
||
81 | protected function whichTimeZonesIntersect($timezonesToInspect, $quadrantBounds) |
||
105 | |||
106 | /** |
||
107 | * Create new level of quadrants from the previous bounds, the intersected found timezones and the previous zone ID |
||
108 | * @param $zoneId |
||
109 | * @param $intersectedZones |
||
110 | * @param $quadrantBounds |
||
111 | * @return array |
||
112 | */ |
||
113 | protected function getNextQuadrants($zoneId, $intersectedZones, $quadrantBounds) |
||
161 | |||
162 | /** |
||
163 | * Select timezones to find the intersections |
||
164 | * @param $previousTimezone |
||
165 | * @return array |
||
166 | */ |
||
167 | protected function selectTimeZonesToInspect($previousTimezone) |
||
179 | |||
180 | /** |
||
181 | * Update the lookup table |
||
182 | * @param $zoneResult |
||
183 | * @param $curQuadrantId |
||
184 | */ |
||
185 | protected function updateLookup($zoneResult, $curQuadrantId) |
||
194 | |||
195 | /** |
||
196 | * Get intersection features from current quadrant and each intersected timezone areas |
||
197 | * @param $intersectionResult |
||
198 | * @param $curQuadrant |
||
199 | * @return array |
||
200 | */ |
||
201 | protected function getIntersectionFeatures($intersectionResult, $curQuadrant) |
||
220 | |||
221 | /** |
||
222 | * Find the associated zones to the current quadrants and the next quadrants to be evaluated |
||
223 | * @param $intersectionResult |
||
224 | * @param $curQuadrant |
||
225 | * @param $lastLevelFlag |
||
226 | * @return array |
||
227 | */ |
||
228 | protected function getAssociatedZonesAndNextQuadrants($intersectionResult, $curQuadrant, $lastLevelFlag) |
||
260 | |||
261 | /** |
||
262 | * Check if the current indexing iteration should be carry on or not |
||
263 | * @param $curLevel |
||
264 | * @param $numQuadrants |
||
265 | * @return bool |
||
266 | */ |
||
267 | protected function validIndexingPercentage($curLevel, $numQuadrants) |
||
275 | |||
276 | /** |
||
277 | * Index current quadrants and get the new ones |
||
278 | * @param $lastLevelFlag |
||
279 | * @return array |
||
280 | */ |
||
281 | protected function indexQuadrants($lastLevelFlag) |
||
292 | |||
293 | /** |
||
294 | * Main function that run all index processing |
||
295 | */ |
||
296 | protected function generateIndexes() |
||
314 | |||
315 | /** |
||
316 | * Create the directory tree |
||
317 | * @param $path |
||
318 | */ |
||
319 | protected function createDirectoryTree($path) |
||
331 | |||
332 | /** |
||
333 | * Create json file from timezone features |
||
334 | * @param $features |
||
335 | * @param $path |
||
336 | * @return bool|int |
||
337 | */ |
||
338 | protected function writeGeoFeaturesToJson($features, $path) |
||
348 | |||
349 | /** |
||
350 | * Build tree array to be save in a json file later |
||
351 | * @return array |
||
352 | */ |
||
353 | protected function buildTree() |
||
361 | |||
362 | /** |
||
363 | * Write the quadrant tree in a json file |
||
364 | * @return bool|int |
||
365 | */ |
||
366 | protected function writeQuadrantTreeJson() |
||
377 | |||
378 | /** |
||
379 | * Set the input data source |
||
380 | * @param $path |
||
381 | * @throws ErrorException |
||
382 | */ |
||
383 | public function setGeoDataSource($path) |
||
391 | |||
392 | /** |
||
393 | * Main public function that starts all processing |
||
394 | */ |
||
395 | public function createQuadrantTreeData() |
||
404 | |||
405 | /** |
||
406 | * Find the intersected timezones and the next quadrant to be evaluated |
||
407 | * @param $lastLevelFlag |
||
408 | * @param $curQuadrant |
||
409 | * @return array |
||
410 | */ |
||
411 | protected function findTimezonesAndNextQuadrants($lastLevelFlag, $curQuadrant) |
||
422 | |||
423 | /** |
||
424 | * Add level to the lookup table where the quadrant tree is being defined |
||
425 | * @param $zoneResult |
||
426 | * @param $levelPath |
||
427 | * @return mixed |
||
428 | */ |
||
429 | protected function addLevelToLookup($zoneResult, $levelPath) |
||
437 | |||
438 | /** |
||
439 | * Remove level from the lookup table where the quadrant tree is being defined |
||
440 | * @param $levelPath |
||
441 | */ |
||
442 | protected function removeLevelFromLookup($levelPath) |
||
455 | } |
||
456 |