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 |
||
21 | View Code Duplication | class SampleController implements ContainerInjectableInterface |
|
|
|||
22 | { |
||
23 | use ContainerInjectableTrait; |
||
24 | |||
25 | |||
26 | |||
27 | /** |
||
28 | * @var string $db a sample member variable that gets initialised |
||
29 | */ |
||
30 | private $db = "not active"; |
||
31 | |||
32 | |||
33 | |||
34 | /** |
||
35 | * The initialize method is optional and will always be called before the |
||
36 | * target method/action. This is a convienient method where you could |
||
37 | * setup internal properties that are commonly used by several methods. |
||
38 | * |
||
39 | * @return void |
||
40 | */ |
||
41 | public function initialize() : void |
||
46 | |||
47 | |||
48 | |||
49 | /** |
||
50 | * This is the index method action, it handles: |
||
51 | * ANY METHOD mountpoint |
||
52 | * ANY METHOD mountpoint/ |
||
53 | * ANY METHOD mountpoint/index |
||
54 | * |
||
55 | * @return string |
||
56 | */ |
||
57 | public function indexAction() : string |
||
62 | |||
63 | |||
64 | |||
65 | /** |
||
66 | * This sample method dumps the content of $di. |
||
67 | * GET mountpoint/dump-app |
||
68 | * |
||
69 | * @return string |
||
70 | */ |
||
71 | public function dumpDiActionGet() : string |
||
77 | |||
78 | |||
79 | |||
80 | /** |
||
81 | * Add the request method to the method name to limit what request methods |
||
82 | * the handler supports. |
||
83 | * GET mountpoint/info |
||
84 | * |
||
85 | * @return string |
||
86 | */ |
||
87 | public function infoActionGet() : string |
||
92 | |||
93 | |||
94 | |||
95 | /** |
||
96 | * This sample method action it the handler for route: |
||
97 | * GET mountpoint/create |
||
98 | * |
||
99 | * @return string |
||
100 | */ |
||
101 | public function createActionGet() : string |
||
106 | |||
107 | |||
108 | |||
109 | /** |
||
110 | * This sample method action it the handler for route: |
||
111 | * POST mountpoint/create |
||
112 | * |
||
113 | * @return string |
||
114 | */ |
||
115 | public function createActionPost() : string |
||
120 | |||
121 | |||
122 | |||
123 | /** |
||
124 | * This sample method action takes one argument: |
||
125 | * GET mountpoint/argument/<value> |
||
126 | * |
||
127 | * @param mixed $value |
||
128 | * |
||
129 | * @return string |
||
130 | */ |
||
131 | public function argumentActionGet($value) : string |
||
136 | |||
137 | |||
138 | |||
139 | /** |
||
140 | * This sample method action takes zero or one argument and you can use - as a separator which will then be removed: |
||
141 | * GET mountpoint/defaultargument/ |
||
142 | * GET mountpoint/defaultargument/<value> |
||
143 | * GET mountpoint/default-argument/ |
||
144 | * GET mountpoint/default-argument/<value> |
||
145 | * |
||
146 | * @param mixed $value with a default string. |
||
147 | * |
||
148 | * @return string |
||
149 | */ |
||
150 | public function defaultArgumentActionGet($value = "default") : string |
||
155 | |||
156 | |||
157 | |||
158 | /** |
||
159 | * This sample method action takes two typed arguments: |
||
160 | * GET mountpoint/typed-argument/<string>/<int> |
||
161 | * |
||
162 | * NOTE. Its recommended to not use int as type since it will still |
||
163 | * accept numbers such as 2hundred givving a PHP NOTICE. So, its better to |
||
164 | * deal with type check within the action method and throuw exceptions |
||
165 | * when the expected type is not met. |
||
166 | * |
||
167 | * @param mixed $value with a default string. |
||
168 | * |
||
169 | * @return string |
||
170 | */ |
||
171 | public function typedArgumentActionGet(string $str, int $int) : string |
||
176 | |||
177 | |||
178 | |||
179 | /** |
||
180 | * This sample method action takes a variadic list of arguments: |
||
181 | * GET mountpoint/variadic/ |
||
182 | * GET mountpoint/variadic/<value> |
||
183 | * GET mountpoint/variadic/<value>/<value> |
||
184 | * GET mountpoint/variadic/<value>/<value>/<value> |
||
185 | * etc. |
||
186 | * |
||
187 | * @param array $value as a variadic parameter. |
||
188 | * |
||
189 | * @return string |
||
190 | */ |
||
191 | public function variadicActionGet(...$value) : string |
||
196 | |||
197 | |||
198 | |||
199 | /** |
||
200 | * Adding an optional catchAll() method will catch all actions sent to the |
||
201 | * router. You can then reply with an actual response or return void to |
||
202 | * allow for the router to move on to next handler. |
||
203 | * A catchAll() handles the following, if a specific action method is not |
||
204 | * created: |
||
205 | * ANY METHOD mountpoint/** |
||
206 | * |
||
207 | * @param array $args as a variadic parameter. |
||
208 | * |
||
209 | * @return mixed |
||
210 | * |
||
211 | * @SuppressWarnings(PHPMD.UnusedFormalParameter) |
||
212 | */ |
||
213 | public function catchAll(...$args) |
||
219 | } |
||
220 |
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.