Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
Complex classes like ModuleOptions 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 ModuleOptions, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
17 | class ModuleOptions extends AbstractOptions implements ModuleOptionsInterface |
||
18 | { |
||
19 | /** |
||
20 | * Данные для конфига сериалайзеров |
||
21 | * |
||
22 | * @var array |
||
23 | */ |
||
24 | protected $serializers = []; |
||
25 | |||
26 | /** |
||
27 | * Конфиги сериалайзеров |
||
28 | * |
||
29 | * @var SerializerOptions[] |
||
30 | */ |
||
31 | protected $serializersOptions = []; |
||
32 | |||
33 | /** |
||
34 | * Данные для фабрик метеданных сериалайзеров |
||
35 | * |
||
36 | * @var array |
||
37 | */ |
||
38 | protected $metadataFactories = []; |
||
39 | |||
40 | /** |
||
41 | * Конфиги для фабрик метаданных |
||
42 | * |
||
43 | * @var PluginOptions[] |
||
44 | */ |
||
45 | protected $metadataFactoriesOptions = []; |
||
46 | |||
47 | /** |
||
48 | * Данные для хранилища хенделеров сериалайзера |
||
49 | * |
||
50 | * @var array |
||
51 | */ |
||
52 | protected $handlerRegistries = []; |
||
53 | |||
54 | /** |
||
55 | * Хранилища хенделеров сериалайзера |
||
56 | * |
||
57 | * @var PluginOptions[] |
||
58 | */ |
||
59 | protected $handlerRegistriesOptions = []; |
||
60 | |||
61 | /** |
||
62 | * Данные описывающие драйверы метаданных |
||
63 | * |
||
64 | * @var array |
||
65 | */ |
||
66 | protected $metadataDrivers = []; |
||
67 | |||
68 | /** |
||
69 | * Конфиги драйверов метаданных |
||
70 | * |
||
71 | * @var PluginOptions[] |
||
72 | */ |
||
73 | protected $metadataDriversOptions = []; |
||
74 | |||
75 | /** |
||
76 | * Данные описывающие конструкторы объектов |
||
77 | * |
||
78 | * @var array |
||
79 | */ |
||
80 | protected $objectConstructors = []; |
||
81 | |||
82 | /** |
||
83 | * Конфиги конструкторов объектов |
||
84 | * |
||
85 | * @var PluginOptions[] |
||
86 | */ |
||
87 | protected $objectConstructorsOptions = []; |
||
88 | |||
89 | /** |
||
90 | * Набор плагинов используемх для сериализации |
||
91 | * |
||
92 | * @var array |
||
93 | */ |
||
94 | protected $serializationVisitors = []; |
||
95 | |||
96 | /** |
||
97 | * Набор плагинов используемх для десериализации |
||
98 | * |
||
99 | * @var array |
||
100 | */ |
||
101 | protected $deserializationVisitors = []; |
||
102 | |||
103 | /** |
||
104 | * Набор данных описывающих диспетчеры событий |
||
105 | * |
||
106 | * @var array |
||
107 | */ |
||
108 | protected $eventDispatchers = []; |
||
109 | |||
110 | /** |
||
111 | * Устанавливает конфиги описывающие диспетчеры событий |
||
112 | * |
||
113 | * @var array |
||
114 | */ |
||
115 | protected $eventDispatchersOptions = []; |
||
116 | |||
117 | |||
118 | /** |
||
119 | * Набор данных описывающих парсеры типов |
||
120 | * |
||
121 | * @var array |
||
122 | */ |
||
123 | protected $typeParsers = []; |
||
124 | |||
125 | /** |
||
126 | * Устанавливает конфиги описывающие парсеры типов данных |
||
127 | * |
||
128 | * @var array |
||
129 | */ |
||
130 | protected $typeParsersOptions = []; |
||
131 | |||
132 | /** |
||
133 | * Устанавливает информацию о сериалайзерах |
||
134 | * |
||
135 | * @param array $serializer |
||
136 | * |
||
137 | * @return $this |
||
138 | */ |
||
139 | public function setSerializers(array $serializer) |
||
146 | |||
147 | /** |
||
148 | * Определяет есть ли сериалайзер с заданным именем |
||
149 | * |
||
150 | * @param string $serializerName |
||
151 | * |
||
152 | * @return $this |
||
153 | */ |
||
154 | public function hasSerializer($serializerName) |
||
158 | |||
159 | /** |
||
160 | * Возвращает конфиг сериалайзера с заданным именем |
||
161 | * |
||
162 | * @param $serializerName |
||
163 | * |
||
164 | * @return SerializerOptions |
||
165 | * @throws \Nnx\JmsSerializerModule\Options\Exception\InvalidArgumentException |
||
166 | */ |
||
167 | public function getSerializer($serializerName) |
||
182 | |||
183 | /** |
||
184 | * Устанавливает данные для фабрик метеданных сериалайзеров |
||
185 | * |
||
186 | * @param array $metadataFactories |
||
187 | * |
||
188 | * @return $this |
||
189 | */ |
||
190 | public function setMetadataFactories(array $metadataFactories) |
||
197 | |||
198 | |||
199 | /** |
||
200 | * Определяет есть ли фабрика метаданных с заданныим именем |
||
201 | * |
||
202 | * @param string $metadataFactoryName |
||
203 | * |
||
204 | * @return $this |
||
205 | */ |
||
206 | public function hasMetadataFactory($metadataFactoryName) |
||
210 | |||
211 | /** |
||
212 | * Возвращает конфиг фабрики метаданных с заданным именем |
||
213 | * |
||
214 | * @param $metadataFactoryName |
||
215 | * |
||
216 | * @return PluginOptions |
||
217 | * @throws \Nnx\JmsSerializerModule\Options\Exception\InvalidArgumentException |
||
218 | */ |
||
219 | View Code Duplication | public function gasMetadataFactory($metadataFactoryName) |
|
234 | |||
235 | /** |
||
236 | * Устанавливает данные для хранилища хенделеров сериалайзера |
||
237 | * |
||
238 | * @param array $handlerRegistries |
||
239 | * |
||
240 | * @return $this |
||
241 | */ |
||
242 | public function setHandlerRegistries(array $handlerRegistries) |
||
249 | |||
250 | /** |
||
251 | * Определяет есть ли хранилище хенделеров сериалайзера с заданныим именем |
||
252 | * |
||
253 | * @param string $handlerRegistryName |
||
254 | * |
||
255 | * @return $this |
||
256 | */ |
||
257 | public function hasHandlerRegistry($handlerRegistryName) |
||
261 | |||
262 | /** |
||
263 | * Возвращает конфиг хранилища хенделеров сериалайзера с заданныим именем |
||
264 | * |
||
265 | * @param $handlerRegistryName |
||
266 | * |
||
267 | * @return PluginOptions |
||
268 | * @throws \Nnx\JmsSerializerModule\Options\Exception\InvalidArgumentException |
||
269 | */ |
||
270 | View Code Duplication | public function getHandlerRegistry($handlerRegistryName) |
|
285 | |||
286 | /** |
||
287 | * Устанавливает данные описывающие драйверы метаданных |
||
288 | * |
||
289 | * @param array $metadataDrivers |
||
290 | * |
||
291 | * @return $this |
||
292 | */ |
||
293 | public function setMetadataDrivers(array $metadataDrivers) |
||
300 | |||
301 | |||
302 | /** |
||
303 | * Проверяет есть ли драйвер метаданных с заданным именем |
||
304 | * |
||
305 | * @param string $metadataDriverName |
||
306 | * |
||
307 | * @return $this |
||
308 | */ |
||
309 | public function hasMetadataDriver($metadataDriverName) |
||
313 | |||
314 | /** |
||
315 | * Возвращает конфиг драйвера метаданных по заданному имени |
||
316 | * |
||
317 | * @param $metadataDriverName |
||
318 | * |
||
319 | * @return PluginOptions |
||
320 | * @throws \Nnx\JmsSerializerModule\Options\Exception\InvalidArgumentException |
||
321 | */ |
||
322 | View Code Duplication | public function getMetadataDriver($metadataDriverName) |
|
337 | |||
338 | /** |
||
339 | * Устанавливает данные описывающие конструкторы объектов |
||
340 | * |
||
341 | * @param array $objectConstructors |
||
342 | * |
||
343 | * @return $this |
||
344 | */ |
||
345 | public function setObjectConstructors(array $objectConstructors) |
||
352 | |||
353 | |||
354 | /** |
||
355 | * Проверяет есть конструктор объектов с заданным именем |
||
356 | * |
||
357 | * @param string $objectConstructorName |
||
358 | * |
||
359 | * @return $this |
||
360 | */ |
||
361 | public function hasObjectConstructor($objectConstructorName) |
||
365 | |||
366 | /** |
||
367 | * Возвращает конструктор объектов по заданному имени |
||
368 | * |
||
369 | * @param $objectConstructorName |
||
370 | * |
||
371 | * @return PluginOptions |
||
372 | * @throws \Nnx\JmsSerializerModule\Options\Exception\InvalidArgumentException |
||
373 | */ |
||
374 | View Code Duplication | public function getObjectConstructor($objectConstructorName) |
|
389 | |||
390 | /** |
||
391 | * Устанавливает набор плагинов используемх для сериализации |
||
392 | * |
||
393 | * @param array $serializationVisitors |
||
394 | * |
||
395 | * @return $this |
||
396 | */ |
||
397 | public function setSerializationVisitors(array $serializationVisitors) |
||
403 | |||
404 | |||
405 | /** |
||
406 | * Проверяет по указанному имени, наличие набора плагинов используемых для сериализации данных |
||
407 | * |
||
408 | * @param string $serializationVisitorName |
||
409 | * |
||
410 | * @return $this |
||
411 | */ |
||
412 | public function hasSerializationVisitor($serializationVisitorName) |
||
416 | |||
417 | |||
418 | /** |
||
419 | * Возвращает по указанному имени, набор плагинов используемых для сериализации данных |
||
420 | * |
||
421 | * @param $serializationVisitorName |
||
422 | * |
||
423 | * @return PluginOptions |
||
424 | * @throws \Nnx\JmsSerializerModule\Options\Exception\InvalidArgumentException |
||
425 | */ |
||
426 | public function getSerializationVisitor($serializationVisitorName) |
||
434 | |||
435 | /** |
||
436 | * Возвращает набор плагинов используемых для десериализации |
||
437 | * |
||
438 | * @param array $deserializationVisitors |
||
439 | * |
||
440 | * @return $this |
||
441 | */ |
||
442 | public function setDeserializationVisitors(array $deserializationVisitors) |
||
448 | |||
449 | |||
450 | /** |
||
451 | * Проверяет по указанному имени, наличие набора плагинов используемых для десериализации данных |
||
452 | * |
||
453 | * @param string $deserializationVisitorName |
||
454 | * |
||
455 | * @return $this |
||
456 | */ |
||
457 | public function hasDeserializationVisitor($deserializationVisitorName) |
||
461 | |||
462 | |||
463 | /** |
||
464 | * Возвращает по указанному имени, набор плагинов используемых для десериализации данных |
||
465 | * |
||
466 | * @param $deserializationVisitorName |
||
467 | * |
||
468 | * @return PluginOptions |
||
469 | * @throws \Nnx\JmsSerializerModule\Options\Exception\InvalidArgumentException |
||
470 | */ |
||
471 | public function getDeserializationVisitor($deserializationVisitorName) |
||
479 | |||
480 | /** |
||
481 | * Устанавливает набор данных описывающих диспетчеры событий |
||
482 | * |
||
483 | * @param array $eventDispatchers |
||
484 | * |
||
485 | * @return $this |
||
486 | */ |
||
487 | public function setEventDispatchers(array $eventDispatchers) |
||
494 | |||
495 | /** |
||
496 | * Проверяет есть ли диспетчер событий с заданным именем |
||
497 | * |
||
498 | * @param string $eventDispatcherName |
||
499 | * |
||
500 | * @return $this |
||
501 | */ |
||
502 | public function hasEventDispatcher($eventDispatcherName) |
||
506 | |||
507 | /** |
||
508 | * Возвращает диспетчер событий по заданному имени |
||
509 | * |
||
510 | * @param $eventDispatcherName |
||
511 | * |
||
512 | * @return PluginOptions |
||
513 | * @throws \Nnx\JmsSerializerModule\Options\Exception\InvalidArgumentException |
||
514 | */ |
||
515 | View Code Duplication | public function getEventDispatcher($eventDispatcherName) |
|
530 | |||
531 | /** |
||
532 | * Устанавливает набор данных описывающих парсеры типов |
||
533 | * |
||
534 | * @param array $typeParsers |
||
535 | * |
||
536 | * @return $this |
||
537 | */ |
||
538 | public function setTypeParsers(array $typeParsers) |
||
545 | |||
546 | |||
547 | /** |
||
548 | * Проверяет есть ли парсер типов с заданным именем |
||
549 | * |
||
550 | * @param string $typeParserName |
||
551 | * |
||
552 | * @return $this |
||
553 | */ |
||
554 | public function hasTypeParser($typeParserName) |
||
558 | |||
559 | /** |
||
560 | * Возвращает парсер типов с заданным именем |
||
561 | * |
||
562 | * @param $typeParserName |
||
563 | * |
||
564 | * @return PluginOptions |
||
565 | * @throws \Nnx\JmsSerializerModule\Options\Exception\InvalidArgumentException |
||
566 | */ |
||
567 | View Code Duplication | public function getTypeParser($typeParserName) |
|
582 | } |
||
583 |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.