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:
| 1 | <?php |
||
| 13 | class ViewReferenceManager |
||
| 14 | { |
||
| 15 | private $manager; |
||
| 16 | private $repository; |
||
| 17 | private $transformer; |
||
| 18 | |||
| 19 | /** |
||
| 20 | * ViewReferenceManager constructor. |
||
| 21 | * |
||
| 22 | * @param ViewReferenceConnectorManagerInterface $manager |
||
| 23 | * @param ViewReferenceConnectorRepositoryInterface $repository |
||
| 24 | * @param ViewReferenceTransformerChain $transformer |
||
| 25 | */ |
||
| 26 | public function __construct(ViewReferenceConnectorManagerInterface $manager, ViewReferenceConnectorRepositoryInterface $repository, ViewReferenceTransformerChain $transformer) |
||
| 32 | |||
| 33 | /** |
||
| 34 | * This method save a tree of viewReferences. |
||
| 35 | * |
||
| 36 | * @param array $viewReferences |
||
| 37 | * @param null $parentId |
||
| 38 | * @param bool|true $reset |
||
| 39 | */ |
||
| 40 | public function saveReferences(array $viewReferences, $parentId = null, $reset = true) |
||
| 41 | { |
||
| 42 | // Reset redis if wanted |
||
| 43 | if ($reset) { |
||
| 44 | $this->manager->reset(); |
||
| 45 | } |
||
| 46 | // Parse the viewReferences |
||
| 47 | foreach ($viewReferences as $viewReference) { |
||
| 48 | $reference = $viewReference['view']->getReference(); |
||
| 49 | // save the viewReference |
||
| 50 | $id = $this->saveReference($reference, $parentId); |
||
| 51 | // if children save them |
||
| 52 | if (array_key_exists('children', $viewReference) && !empty($children = $viewReference['children'])) { |
||
| 53 | $this->saveReferences($children, $id, false); |
||
| 54 | } |
||
| 55 | } |
||
| 56 | } |
||
| 57 | |||
| 58 | /** |
||
| 59 | * This method save a Reference. |
||
| 60 | * |
||
| 61 | * @param ViewReference $viewReference |
||
| 62 | * @param null $parentId |
||
| 63 | * |
||
| 64 | * @return mixed |
||
| 65 | */ |
||
| 66 | public function saveReference(ViewReference $viewReference, $parentId = null) |
||
| 67 | { |
||
| 68 | // Transform the viewReference in array |
||
| 69 | $arrayTransformer = $this->transformer->getViewReferenceTransformer( |
||
| 70 | $viewReference->getViewNamespace(), 'array' |
||
| 71 | ); |
||
| 72 | $referenceArray = $arrayTransformer->reverseTransform($viewReference); |
||
| 73 | // Remove old url if exist |
||
| 74 | $this->removeUrlForViewReference($viewReference); |
||
| 75 | // Update/create the viewReference |
||
| 76 | $this->manager->update($referenceArray['id'], $referenceArray); |
||
| 77 | // Build the url for reference |
||
| 78 | $this->manager->buildUrl($viewReference->getId()); |
||
| 79 | // Set parent if exist |
||
| 80 | if ($parentId) { |
||
| 81 | $this->manager->addChild($parentId, $referenceArray['id']); |
||
| 82 | } |
||
| 83 | |||
| 84 | return $referenceArray['id']; |
||
| 85 | } |
||
| 86 | |||
| 87 | /** |
||
| 88 | * This method remove reference for a ViewReference. |
||
| 89 | * |
||
| 90 | * @param ViewReference $viewReference |
||
| 91 | */ |
||
| 92 | View Code Duplication | public function removeReference(ViewReference $viewReference) |
|
| 101 | |||
| 102 | /** |
||
| 103 | * Find the transformer for an element. |
||
| 104 | * |
||
| 105 | * @param $element |
||
| 106 | * |
||
| 107 | * @return ArrayToBusinessPageReferenceTransformer|ArrayToViewReferenceTransformer |
||
| 108 | */ |
||
| 109 | public static function findTransformerFromElement($element) |
||
| 110 | { |
||
| 111 | if (isset($element['entityId'])) { |
||
| 112 | $viewRefTransformer = new ArrayToBusinessPageReferenceTransformer(); |
||
| 113 | } else { |
||
| 114 | $viewRefTransformer = new ArrayToViewReferenceTransformer(); |
||
| 115 | } |
||
| 116 | |||
| 117 | return $viewRefTransformer; |
||
| 118 | } |
||
| 119 | |||
| 120 | /** |
||
| 121 | * Remove an url for a viewReference with his reference in redis. |
||
| 122 | * |
||
| 123 | * @param ViewReference $viewReference |
||
| 124 | */ |
||
| 125 | View Code Duplication | public function removeUrlForViewReference(ViewReference $viewReference) |
|
| 132 | } |
||
| 133 |
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.