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 |
||
34 | class LifecycleEventManager |
||
35 | { |
||
36 | /** |
||
37 | * @var DocumentManager |
||
38 | */ |
||
39 | private $dm; |
||
40 | |||
41 | /** |
||
42 | * @var EventManager |
||
43 | */ |
||
44 | private $evm; |
||
45 | |||
46 | /** |
||
47 | * @var UnitOfWork |
||
48 | */ |
||
49 | private $uow; |
||
50 | |||
51 | /** |
||
52 | * @param DocumentManager $dm |
||
53 | * @param UnitOfWork $uow |
||
54 | * @param EventManager $evm |
||
55 | */ |
||
56 | 932 | public function __construct(DocumentManager $dm, UnitOfWork $uow, EventManager $evm) |
|
62 | |||
63 | /** |
||
64 | * Invokes postPersist callbacks and events for given document cascading them to embedded documents as well. |
||
65 | * |
||
66 | * @param ClassMetadata $class |
||
67 | * @param object $document |
||
68 | */ |
||
69 | 553 | public function postPersist(ClassMetadata $class, $document) |
|
75 | |||
76 | /** |
||
77 | * Invokes postRemove callbacks and events for given document. |
||
78 | * |
||
79 | * @param ClassMetadata $class |
||
80 | * @param object $document |
||
81 | */ |
||
82 | 61 | public function postRemove(ClassMetadata $class, $document) |
|
87 | |||
88 | /** |
||
89 | * Invokes postUpdate callbacks and events for given document. The same will be done for embedded documents owned |
||
90 | * by given document unless they were new in which case postPersist callbacks and events will be dispatched. |
||
91 | * |
||
92 | * @param ClassMetadata $class |
||
93 | * @param object $document |
||
94 | */ |
||
95 | 215 | public function postUpdate(ClassMetadata $class, $document) |
|
96 | { |
||
97 | 215 | $class->invokeLifecycleCallbacks(Events::postUpdate, $document, array(new LifecycleEventArgs($document, $this->dm))); |
|
98 | 215 | $this->evm->dispatchEvent(Events::postUpdate, new LifecycleEventArgs($document, $this->dm)); |
|
99 | 215 | $this->cascadePostUpdate($class, $document); |
|
100 | 215 | } |
|
101 | |||
102 | /** |
||
103 | * Invokes prePersist callbacks and events for given document. |
||
104 | * |
||
105 | * @param ClassMetadata $class |
||
106 | * @param object $document |
||
107 | */ |
||
108 | 577 | public function prePersist(ClassMetadata $class, $document) |
|
113 | |||
114 | /** |
||
115 | * Invokes prePersist callbacks and events for given document. |
||
116 | * |
||
117 | * @param ClassMetadata $class |
||
118 | * @param object $document |
||
119 | */ |
||
120 | 67 | public function preRemove(ClassMetadata $class, $document) |
|
125 | |||
126 | /** |
||
127 | * Invokes preUpdate callbacks and events for given document cascading them to embedded documents as well. |
||
128 | * |
||
129 | * @param ClassMetadata $class |
||
130 | * @param object $document |
||
131 | */ |
||
132 | 219 | public function preUpdate(ClassMetadata $class, $document) |
|
144 | |||
145 | /** |
||
146 | * Cascades the preUpdate event to embedded documents. |
||
147 | * |
||
148 | * @param ClassMetadata $class |
||
149 | * @param object $document |
||
150 | */ |
||
151 | 219 | private function cascadePreUpdate(ClassMetadata $class, $document) |
|
168 | |||
169 | /** |
||
170 | * Cascades the postUpdate and postPersist events to embedded documents. |
||
171 | * |
||
172 | * @param ClassMetadata $class |
||
173 | * @param object $document |
||
174 | */ |
||
175 | 215 | private function cascadePostUpdate(ClassMetadata $class, $document) |
|
197 | |||
198 | /** |
||
199 | * Cascades the postPersist events to embedded documents. |
||
200 | * |
||
201 | * @param ClassMetadata $class |
||
202 | * @param object $document |
||
203 | */ |
||
204 | 553 | private function cascadePostPersist(ClassMetadata $class, $document) |
|
217 | } |
||
218 |
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.