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 |
||
24 | class ConfigFactory |
||
25 | { |
||
26 | |||
27 | /** |
||
28 | * Cached contents of the config files. |
||
29 | * |
||
30 | * @since 0.4.3 |
||
31 | * |
||
32 | * @var array |
||
33 | */ |
||
34 | protected static $configFilesCache = []; |
||
35 | |||
36 | /** |
||
37 | * Create a new ConfigInterface object from a file. |
||
38 | * |
||
39 | * If a comma-separated list of files is provided, they are checked in sequence until the first one could be loaded |
||
40 | * successfully. |
||
41 | * |
||
42 | * @since 0.3.0 |
||
43 | * |
||
44 | * @param string|array $_ List of files. |
||
45 | * |
||
46 | * @return ConfigInterface Instance of a ConfigInterface implementation. |
||
|
|||
47 | */ |
||
48 | 2 | public static function createFromFile($_) |
|
82 | |||
83 | /** |
||
84 | * Create a new ConfigInterface object from an array. |
||
85 | * |
||
86 | * @since 0.3.0 |
||
87 | * |
||
88 | * @param array $array Array with configuration values. |
||
89 | * |
||
90 | * @return ConfigInterface Instance of a ConfigInterface implementation. |
||
91 | */ |
||
92 | 2 | public static function createFromArray(array $array) |
|
102 | |||
103 | /** |
||
104 | * Create a new ConfigInterface object. |
||
105 | * |
||
106 | * Tries to deduce the correct creation method by inspecting the provided arguments. |
||
107 | * |
||
108 | * @since 0.3.0 |
||
109 | * |
||
110 | * @param mixed $_ Array with configuration values. |
||
111 | * |
||
112 | * @return ConfigInterface Instance of a ConfigInterface implementation. |
||
113 | */ |
||
114 | 4 | View Code Duplication | public static function create($_) |
128 | |||
129 | /** |
||
130 | * Create a new ConfigInterface object, by merging several files together. |
||
131 | * |
||
132 | * Duplicate keys in later files will override those in earlier files. |
||
133 | * |
||
134 | * @since 0.4.6 |
||
135 | * |
||
136 | * @param mixed $_ Array with configuration values. |
||
137 | * |
||
138 | * @return ConfigInterface Instance of a ConfigInterface implementation. |
||
139 | */ |
||
140 | 3 | View Code Duplication | public static function merge($_) |
154 | |||
155 | /** |
||
156 | * Create a new ConfigInterface object by merging data from several files. |
||
157 | * |
||
158 | * If a comma-separated list of files is provided, they are loaded in sequence and later files override settings in |
||
159 | * earlier files. |
||
160 | * |
||
161 | * @since 0.4.6 |
||
162 | * |
||
163 | * @param string|array $_ List of files. |
||
164 | * |
||
165 | * @return ConfigInterface Instance of a ConfigInterface implementation. |
||
166 | */ |
||
167 | public static function mergeFromFiles($_) |
||
168 | { |
||
169 | $files = array_reverse(func_get_args()); |
||
170 | $data = []; |
||
171 | |||
172 | if (is_array($files[0])) { |
||
173 | $files = array_reverse($files[0]); |
||
174 | } |
||
175 | |||
176 | View Code Duplication | while (count($files) > 0) { |
|
177 | try { |
||
178 | $file = array_pop($files); |
||
179 | |||
180 | if (! is_readable($file)) { |
||
181 | continue; |
||
182 | } |
||
183 | |||
184 | $new_data = static::getFromCache($file, function ($file) { |
||
185 | return Loader::load($file); |
||
186 | }); |
||
187 | |||
188 | if (null === $data) { |
||
189 | continue; |
||
190 | } |
||
191 | |||
192 | $data = array_replace_recursive($data, $new_data); |
||
193 | } catch (Exception $exception) { |
||
194 | // Fail silently and try next file. |
||
195 | } |
||
196 | } |
||
197 | |||
198 | return static::createFromArray($data); |
||
199 | } |
||
200 | |||
201 | /** |
||
202 | * Create a new ConfigInterface object from a file and return a sub-portion of it. |
||
203 | * |
||
204 | * The first argument needs to be the file name to load, and the subsequent arguments will be passed on to |
||
205 | * `Config::getSubConfig()`. |
||
206 | * |
||
207 | * @since 0.4.5 |
||
208 | * |
||
209 | * @param mixed $_ File name of the config to load as a string, followed by an array of keys to pass to |
||
210 | * `Config::getSubConfig()`. |
||
211 | * |
||
212 | * @return ConfigInterface Instance of a ConfigInterface implementation. |
||
213 | */ |
||
214 | 1 | public static function createSubConfig($_) |
|
227 | |||
228 | /** |
||
229 | * Get a config file from the config file cache. |
||
230 | * |
||
231 | * @since 0.4.4 |
||
232 | * |
||
233 | * @param string $identifier Identifier to look for in the cache. |
||
234 | * @param mixed $fallback Fallback to use to fill the cache. If $fallback is a callable, it will be executed |
||
235 | * with $identifier as an argument. |
||
236 | * |
||
237 | * @return mixed The latest content of the cache for the given identifier. |
||
238 | */ |
||
239 | 1 | protected static function getFromCache($identifier, $fallback) |
|
249 | } |
||
250 |
This check compares the return type specified in the
@return
annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.