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 namespace Propaganistas\LaravelPhone; |
||
19 | class PhoneNumber implements Jsonable, JsonSerializable, Serializable |
||
20 | { |
||
21 | use ParsesCountries, |
||
22 | ParsesFormats, |
||
23 | ParsesTypes; |
||
24 | |||
25 | /** |
||
26 | * The provided phone number. |
||
27 | * |
||
28 | * @var string |
||
29 | */ |
||
30 | protected $number; |
||
31 | |||
32 | /** |
||
33 | * The provided phone country. |
||
34 | * |
||
35 | * @var array |
||
36 | */ |
||
37 | protected $countries = []; |
||
38 | |||
39 | /** |
||
40 | * The detected phone country. |
||
41 | * |
||
42 | * @var string |
||
43 | */ |
||
44 | protected $country; |
||
45 | |||
46 | /** |
||
47 | * Whether to allow lenient checks (i.e. landline numbers without area codes). |
||
48 | * |
||
49 | * @var bool |
||
50 | */ |
||
51 | protected $lenient = false; |
||
52 | |||
53 | /** |
||
54 | * @var \libphonenumber\PhoneNumberUtil |
||
55 | */ |
||
56 | protected $lib; |
||
57 | |||
58 | /** |
||
59 | * Phone constructor. |
||
60 | * |
||
61 | * @param string $number |
||
62 | */ |
||
63 | 108 | public function __construct($number) |
|
68 | |||
69 | /** |
||
70 | * Create a phone instance. |
||
71 | * |
||
72 | * @param string $number |
||
73 | * @param string|array $country |
||
74 | * @return static |
||
75 | */ |
||
76 | 30 | public static function make($number, $country = []) |
|
82 | |||
83 | /** |
||
84 | * Set the country to which the phone number belongs to. |
||
85 | * |
||
86 | * @param string|array $country |
||
87 | * @return static |
||
88 | */ |
||
89 | 93 | public function ofCountry($country) |
|
90 | { |
||
91 | 93 | $countries = is_array($country) ? $country : func_get_args(); |
|
92 | |||
93 | 93 | $instance = clone $this; |
|
94 | 93 | $instance->countries = array_unique( |
|
95 | 93 | array_merge($instance->countries, static::parseCountries($countries)) |
|
96 | 31 | ); |
|
97 | |||
98 | 93 | return $instance; |
|
99 | } |
||
100 | |||
101 | /** |
||
102 | * Format the phone number in international format. |
||
103 | * |
||
104 | * @return string |
||
105 | */ |
||
106 | 3 | public function formatInternational() |
|
110 | |||
111 | /** |
||
112 | * Format the phone number in national format. |
||
113 | * |
||
114 | * @return string |
||
115 | */ |
||
116 | 3 | public function formatNational() |
|
120 | |||
121 | /** |
||
122 | * Format the phone number in E164 format. |
||
123 | * |
||
124 | * @return string |
||
125 | */ |
||
126 | 18 | public function formatE164() |
|
130 | |||
131 | /** |
||
132 | * Format the phone number in RFC3966 format. |
||
133 | * |
||
134 | * @return string |
||
135 | */ |
||
136 | 6 | public function formatRFC3966() |
|
140 | |||
141 | /** |
||
142 | * Format the phone number in a given format. |
||
143 | * |
||
144 | * @param string $format |
||
145 | * @return string |
||
146 | * @throws \Propaganistas\LaravelPhone\Exceptions\NumberFormatException |
||
147 | */ |
||
148 | 45 | public function format($format) |
|
161 | |||
162 | /** |
||
163 | * Format the phone number in a way that it can be dialled from the provided country. |
||
164 | * |
||
165 | * @param string $country |
||
166 | * @return string |
||
167 | * @throws \Propaganistas\LaravelPhone\Exceptions\CountryCodeException |
||
168 | */ |
||
169 | 6 | View Code Duplication | public function formatForCountry($country) |
180 | |||
181 | /** |
||
182 | * Format the phone number in a way that it can be dialled from the provided country using a cellphone. |
||
183 | * |
||
184 | * @param string $country |
||
185 | * @param bool $removeFormatting |
||
186 | * @return string |
||
187 | * @throws \Propaganistas\LaravelPhone\Exceptions\CountryCodeException |
||
188 | */ |
||
189 | 6 | View Code Duplication | public function formatForMobileDialingInCountry($country, $removeFormatting = false) |
201 | |||
202 | /** |
||
203 | * Get the phone number's country. |
||
204 | * |
||
205 | * @return string |
||
206 | */ |
||
207 | 87 | public function getCountry() |
|
215 | |||
216 | /** |
||
217 | * Check if the phone number is of (a) given country(ies). |
||
218 | * |
||
219 | * @param string|array $country |
||
220 | * @return bool |
||
221 | */ |
||
222 | 3 | public function isOfCountry($country) |
|
228 | |||
229 | /** |
||
230 | * Filter the provided countries to the one that is valid for the number. |
||
231 | * |
||
232 | * @param string|array $countries |
||
233 | * @return string |
||
234 | * @throws \Propaganistas\LaravelPhone\Exceptions\NumberParseException |
||
235 | */ |
||
236 | 87 | protected function filterValidCountry($countries) |
|
267 | |||
268 | /** |
||
269 | * Get the phone number's type. |
||
270 | * |
||
271 | * @param bool $asConstant |
||
272 | * @return string|int|null |
||
273 | */ |
||
274 | 15 | public function getType($asConstant = false) |
|
286 | |||
287 | /** |
||
288 | * Check if the phone number is of (a) given type(s). |
||
289 | * |
||
290 | * @param string $type |
||
291 | * @return bool |
||
292 | */ |
||
293 | 12 | public function isOfType($type) |
|
299 | |||
300 | /** |
||
301 | * Get the PhoneNumber instance of the current number. |
||
302 | * |
||
303 | * @return \libphonenumber\PhoneNumber |
||
304 | */ |
||
305 | 78 | public function getPhoneNumberInstance() |
|
309 | |||
310 | /** |
||
311 | * Determine whether the phone number seems to be in international format. |
||
312 | * |
||
313 | * @return bool |
||
314 | */ |
||
315 | 45 | protected function numberLooksInternational() |
|
319 | |||
320 | /** |
||
321 | * Enable lenient number parsing. |
||
322 | * |
||
323 | * @return $this |
||
324 | */ |
||
325 | 24 | public function lenient() |
|
331 | |||
332 | /** |
||
333 | * Convert the phone instance to JSON. |
||
334 | * |
||
335 | * @param int $options |
||
336 | * @return string |
||
337 | */ |
||
338 | 3 | public function toJson($options = 0) |
|
342 | |||
343 | /** |
||
344 | * Convert the phone instance into something JSON serializable. |
||
345 | * |
||
346 | * @return string |
||
347 | */ |
||
348 | 3 | public function jsonSerialize() |
|
352 | |||
353 | /** |
||
354 | * Convert the phone instance into a string representation. |
||
355 | * |
||
356 | * @return string |
||
357 | */ |
||
358 | 3 | public function serialize() |
|
362 | |||
363 | /** |
||
364 | * Reconstructs the phone instance from a string representation. |
||
365 | * |
||
366 | * @param string $serialized |
||
367 | */ |
||
368 | 3 | public function unserialize($serialized) |
|
374 | |||
375 | /** |
||
376 | * Convert the phone instance to a formatted number. |
||
377 | * |
||
378 | * @return string |
||
379 | */ |
||
380 | 9 | public function __toString() |
|
390 | } |
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.