Complex classes like ApiEvent 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 ApiEvent, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
17 | class ApiEvent extends AbstractEvent |
||
18 | { |
||
19 | /** |
||
20 | * @var object[] |
||
21 | */ |
||
22 | private $objects; |
||
23 | |||
24 | /** |
||
25 | * @var string[] |
||
26 | */ |
||
27 | private $sources = []; |
||
28 | |||
29 | /** |
||
30 | * @var string[] |
||
31 | */ |
||
32 | private $libraries = []; |
||
33 | |||
34 | /** |
||
35 | * @var \SplObjectStorage |
||
36 | */ |
||
37 | private $callbacks; |
||
38 | |||
39 | /** |
||
40 | * @var \SplObjectStorage |
||
41 | */ |
||
42 | private $requirements; |
||
43 | |||
44 | /** |
||
45 | * @param object[] $objects |
||
46 | */ |
||
47 | 68 | public function __construct(array $objects) |
|
53 | |||
54 | /** |
||
55 | * @param string|null $class |
||
56 | * |
||
57 | * @return bool |
||
58 | */ |
||
59 | 8 | public function hasObjects($class = null) |
|
65 | |||
66 | /** |
||
67 | * @param string|null $class |
||
68 | * |
||
69 | * @return object[] |
||
70 | */ |
||
71 | 8 | public function getObjects($class = null) |
|
87 | |||
88 | /** |
||
89 | * @return bool |
||
90 | */ |
||
91 | 20 | public function hasSources() |
|
95 | |||
96 | /** |
||
97 | * @return string[] |
||
98 | */ |
||
99 | 20 | public function getSources() |
|
103 | |||
104 | /** |
||
105 | * @param string[] $sources |
||
106 | */ |
||
107 | 8 | public function setSources(array $sources) |
|
112 | |||
113 | /** |
||
114 | * @param string[] $sources |
||
115 | */ |
||
116 | 8 | public function addSources(array $sources) |
|
122 | |||
123 | /** |
||
124 | * @param string $source |
||
125 | * |
||
126 | * @return bool |
||
127 | */ |
||
128 | 16 | public function hasSource($source) |
|
132 | |||
133 | /** |
||
134 | * @param string $source |
||
135 | */ |
||
136 | 16 | public function addSource($source) |
|
142 | |||
143 | /** |
||
144 | * @param string $source |
||
145 | */ |
||
146 | 4 | public function removeSource($source) |
|
151 | |||
152 | /** |
||
153 | * @return bool |
||
154 | */ |
||
155 | 20 | public function hasLibraries() |
|
159 | |||
160 | /** |
||
161 | * @return string[] |
||
162 | */ |
||
163 | 20 | public function getLibraries() |
|
167 | |||
168 | /** |
||
169 | * @param string[] $libraries |
||
170 | */ |
||
171 | 8 | public function setLibraries(array $libraries) |
|
176 | |||
177 | /** |
||
178 | * @param string[] $libraries |
||
179 | */ |
||
180 | 8 | public function addLibraries(array $libraries) |
|
186 | |||
187 | /** |
||
188 | * @param string $library |
||
189 | * |
||
190 | * @return bool |
||
191 | */ |
||
192 | 16 | public function hasLibrary($library) |
|
196 | |||
197 | /** |
||
198 | * @param string $library |
||
199 | */ |
||
200 | 16 | public function addLibrary($library) |
|
206 | |||
207 | /** |
||
208 | * @param string $library |
||
209 | */ |
||
210 | 4 | public function removeLibrary($library) |
|
215 | |||
216 | /** |
||
217 | * @return bool |
||
218 | */ |
||
219 | 12 | public function hasCallbacks() |
|
223 | |||
224 | /** |
||
225 | * @return \SplObjectStorage |
||
226 | */ |
||
227 | 4 | public function getCallbacks() |
|
231 | |||
232 | /** |
||
233 | * @param string $callback |
||
234 | * @param object|null $object |
||
235 | * |
||
236 | * @return bool |
||
237 | */ |
||
238 | 8 | public function hasCallback($callback, $object = null) |
|
248 | |||
249 | /** |
||
250 | * @param object $object |
||
251 | * @param string|null $callback |
||
252 | * |
||
253 | * @return bool |
||
254 | */ |
||
255 | 8 | public function hasCallbackObject($object, $callback = null) |
|
259 | |||
260 | /** |
||
261 | * @param $object |
||
262 | * |
||
263 | * @return string|null |
||
264 | */ |
||
265 | 8 | public function getCallback($object) |
|
269 | |||
270 | /** |
||
271 | * @param string $callback |
||
272 | * |
||
273 | * @return object |
||
274 | */ |
||
275 | 8 | public function getCallbackObject($callback) |
|
283 | |||
284 | /** |
||
285 | * @param object $object |
||
286 | * @param string $callback |
||
287 | */ |
||
288 | 8 | public function addCallback($object, $callback) |
|
294 | |||
295 | /** |
||
296 | * @param object $object |
||
297 | */ |
||
298 | 4 | public function removeCallbackObject($object) |
|
302 | |||
303 | /** |
||
304 | * @param string $callback |
||
305 | */ |
||
306 | 4 | public function removeCallback($callback) |
|
312 | |||
313 | /** |
||
314 | * @param object|null $object |
||
315 | * |
||
316 | * @return bool |
||
317 | */ |
||
318 | 20 | public function hasRequirements($object = null) |
|
328 | |||
329 | /** |
||
330 | * @return \SplObjectStorage |
||
331 | */ |
||
332 | 4 | public function getRequirements() |
|
336 | |||
337 | /** |
||
338 | * @param object $object |
||
339 | * |
||
340 | * @return string[] |
||
341 | */ |
||
342 | 16 | public function getRequirementsObject($object) |
|
346 | |||
347 | /** |
||
348 | * @param object $object |
||
349 | * @param string[] $requirements |
||
350 | */ |
||
351 | 8 | public function setRequirements($object, array $requirements) |
|
356 | |||
357 | /** |
||
358 | * @param object $object |
||
359 | * @param string[] $requirements |
||
360 | */ |
||
361 | 8 | public function addRequirements($object, array $requirements) |
|
367 | |||
368 | /** |
||
369 | * @param object $object |
||
370 | * @param string|null $requirement |
||
371 | * |
||
372 | * @return bool |
||
373 | */ |
||
374 | 16 | public function hasRequirement($object, $requirement = null) |
|
379 | |||
380 | /** |
||
381 | * @param object $object |
||
382 | * @param string $requirement |
||
383 | */ |
||
384 | 16 | public function addRequirement($object, $requirement) |
|
397 | |||
398 | /** |
||
399 | * @param object $object |
||
400 | * @param string|null $requirement |
||
401 | */ |
||
402 | 4 | public function removeRequirement($object, $requirement = null) |
|
421 | } |
||
422 |
This check looks at variables that are passed out again to other methods.
If the outgoing method call has stricter type requirements than the method itself, an issue is raised.
An additional type check may prevent trouble.