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 |
||
20 | class Datetime_Format extends Field { |
||
21 | |||
22 | /** |
||
23 | * Datetime controls. |
||
24 | * |
||
25 | * @access public |
||
26 | * @var string 'date' or 'time' |
||
27 | */ |
||
28 | public $subtype = ''; |
||
29 | |||
30 | /** |
||
31 | * Timestamp. |
||
32 | * |
||
33 | * @access private |
||
34 | * @var int |
||
35 | */ |
||
36 | private $timestamp = 0; |
||
37 | |||
38 | /** |
||
39 | * Constructor. |
||
40 | * |
||
41 | * @since 3.0.0 |
||
42 | * |
||
43 | * @param array $field |
||
44 | */ |
||
45 | public function __construct( $field ) { |
||
62 | |||
63 | /** |
||
64 | * Output field markup. |
||
65 | * |
||
66 | * @since 3.0.0 |
||
67 | */ |
||
68 | public function html() { |
||
105 | |||
106 | /** |
||
107 | * Print date input. |
||
108 | * |
||
109 | * @since 3.0.0 |
||
110 | * @access private |
||
111 | * |
||
112 | * @param array $matches |
||
113 | */ |
||
114 | private function print_date( $matches ) { |
||
115 | |||
116 | $date = array( 'weekday' => '', 'divider' => '', 'day' => '', 'month' => '', 'year' => '' ); |
||
117 | |||
118 | foreach ( $matches as $match ) { |
||
119 | if ( in_array( $match, array( 'D', 'l' ) ) ) { |
||
120 | $this->weekday(); |
||
121 | unset( $date['weekday'] ); |
||
122 | } elseif ( in_array( $match, array( 'd', 'j' ) ) ) { |
||
123 | $this->day(); |
||
124 | unset( $date['day'] ); |
||
125 | } elseif ( in_array( $match, array( 'F', 'M', 'm', 'n' ) ) ) { |
||
126 | $this->month(); |
||
127 | unset( $date['month'] ); |
||
128 | } elseif ( in_array( $match, array( 'y', 'Y' ) ) ) { |
||
129 | $this->year(); |
||
130 | unset( $date['year'] ); |
||
131 | View Code Duplication | } elseif ( in_array( $match, array( '.', ',', ':', '/', '-' ) ) ) { |
|
|
|||
132 | $this->divider(); |
||
133 | unset( $date['divider'] ); |
||
134 | } |
||
135 | } |
||
136 | |||
137 | $this->print_fields( $date ); |
||
138 | } |
||
139 | |||
140 | /** |
||
141 | * Print time input. |
||
142 | * |
||
143 | * @since 3.0.0 |
||
144 | * @access private |
||
145 | * |
||
146 | * @param array $matches |
||
147 | */ |
||
148 | private function print_time( $matches ) { |
||
149 | |||
150 | $time = array( 'hours' => '', 'divider' => '', 'minutes' => '', 'meridiem' => '' ); |
||
151 | |||
152 | foreach ( $matches as $match ) { |
||
153 | if ( in_array( $match, array( 'h', 'H', 'g', 'G' ) ) ) { |
||
154 | $this->hours(); |
||
155 | unset( $time['hours'] ); |
||
156 | } elseif ( in_array( $match, array( 'i' ) ) ) { |
||
157 | $this->minutes(); |
||
158 | unset( $time['minutes'] ); |
||
159 | } elseif ( in_array( $match, array( 'A', 'a' ) ) ) { |
||
160 | $this->meridiem(); |
||
161 | unset( $time['meridiem'] ); |
||
162 | View Code Duplication | } elseif ( in_array( $match, array( '.', ',', ':', '/', '-' ) ) ) { |
|
163 | $this->divider(); |
||
164 | unset( $time['divider'] ); |
||
165 | } |
||
166 | } |
||
167 | |||
168 | $this->print_fields( $time ); |
||
169 | } |
||
170 | |||
171 | /** |
||
172 | * Print input fields. |
||
173 | * |
||
174 | * @since 3.0.0 |
||
175 | * @access private |
||
176 | * |
||
177 | * @param $fields |
||
178 | */ |
||
179 | private function print_fields( $fields ) { |
||
188 | |||
189 | /** |
||
190 | * Print weekday input. |
||
191 | * |
||
192 | * @since 3.0.0 |
||
193 | * @access private |
||
194 | */ |
||
195 | View Code Duplication | private function weekday() { |
|
196 | |||
197 | ?> |
||
198 | <div> |
||
199 | <label for="<?php echo $this->id; ?>-weekday"> |
||
200 | <?php _e( 'Weekday', 'google-calendar-events' ); ?> |
||
201 | <select name="" id="<?php echo $this->id; ?>-weekday"> |
||
202 | <option value="" data-preview=""></option> |
||
203 | <option value="D" <?php selected( 'D', strpbrk( 'D', $this->value ) ) ?> data-preview="<?php echo date_i18n( 'D', $this->timestamp ); ?>"><?php echo date_i18n( 'D', $this->timestamp ); ?></option> |
||
204 | <option value="l" <?php selected( 'l', strpbrk( 'l', $this->value ) ) ?> data-preview="<?php echo date_i18n( 'l', $this->timestamp ); ?>"><?php echo date_i18n( 'l', $this->timestamp ); ?></option> |
||
205 | </select> |
||
206 | </label> |
||
207 | </div> |
||
208 | <?php |
||
209 | |||
210 | } |
||
211 | |||
212 | /** |
||
213 | * Print day input. |
||
214 | * |
||
215 | * @since 3.0.0 |
||
216 | * @access private |
||
217 | */ |
||
218 | View Code Duplication | private function day() { |
|
219 | |||
220 | ?> |
||
221 | <div> |
||
222 | <label for="<?php echo $this->id; ?>-day"> |
||
223 | <?php _e( 'Day', 'google-calendar-events' ); ?> |
||
224 | <select name="" id="<?php echo $this->id; ?>-day"> |
||
225 | <option value="" data-preview=""></option> |
||
226 | <option value="j" <?php selected( 'j', strpbrk( 'j', $this->value ) ) ?> data-preview="<?php echo date( 'j', $this->timestamp ); ?>"><?php echo date( 'j', $this->timestamp ); ?></option> |
||
227 | <option value="d" <?php selected( 'd', strpbrk( 'd', $this->value ) ) ?> data-preview="<?php echo date( 'd', $this->timestamp ); ?>"><?php echo date( 'd', $this->timestamp ); ?></option> |
||
228 | </select> |
||
229 | </label> |
||
230 | </div> |
||
231 | <?php |
||
232 | |||
233 | } |
||
234 | |||
235 | /** |
||
236 | * Print month input. |
||
237 | * |
||
238 | * @since 3.0.0 |
||
239 | * @access private |
||
240 | */ |
||
241 | private function month() { |
||
259 | |||
260 | /** |
||
261 | * Print year input. |
||
262 | * |
||
263 | * @since 3.0.0 |
||
264 | * @access private |
||
265 | */ |
||
266 | View Code Duplication | private function year() { |
|
267 | |||
268 | ?> |
||
269 | <div> |
||
270 | <label for="<?php echo $this->id; ?>-year"> |
||
271 | <?php _e( 'Year', 'google-calendar-events' ); ?> |
||
272 | <select name="" id="<?php echo $this->id; ?>-year"> |
||
273 | <option value="" data-preview=""></option> |
||
274 | <option value="Y" <?php selected( 'Y', strpbrk( 'Y', $this->value ) ) ?> data-preview="<?php echo date( 'Y', $this->timestamp ); ?>"><?php echo date( 'Y', $this->timestamp ); ?></option> |
||
275 | <option value="y" <?php selected( 'y', strpbrk( 'y', $this->value ) ) ?> data-preview="<?php echo date( 'y', $this->timestamp ); ?>"><?php echo date( 'y', $this->timestamp ); ?></option> |
||
276 | </select> |
||
277 | </label> |
||
278 | </div> |
||
279 | <?php |
||
280 | |||
281 | } |
||
282 | |||
283 | /** |
||
284 | * Print hours input. |
||
285 | * |
||
286 | * @since 3.0.0 |
||
287 | * @access private |
||
288 | */ |
||
289 | private function hours() { |
||
307 | |||
308 | /** |
||
309 | * Print minutes input. |
||
310 | * |
||
311 | * @since 3.0.0 |
||
312 | * @access private |
||
313 | */ |
||
314 | private function minutes() { |
||
329 | |||
330 | /** |
||
331 | * Print meridiem input. |
||
332 | * |
||
333 | * @since 3.0.0 |
||
334 | * @access private |
||
335 | */ |
||
336 | View Code Duplication | private function meridiem() { |
|
337 | |||
338 | ?> |
||
339 | <div> |
||
340 | <label for="<?php echo $this->id; ?>-meridiem"> |
||
341 | <?php _e( 'Meridiem', 'google-calendar-events' ); ?> |
||
342 | <select name="" id="<?php echo $this->id; ?>-meridiem"> |
||
343 | <option value="" data-preview=""></option> |
||
344 | <option value="a" <?php selected( 'a', strpbrk( 'a', $this->value ) ); ?> data-preview="<?php echo date( 'a', $this->timestamp ); ?>"><?php echo date( 'a', $this->timestamp ); ?></option> |
||
345 | <option value="A" <?php selected( 'A', strpbrk( 'A', $this->value ) ); ?> data-preview="<?php echo date( 'A', $this->timestamp ); ?>"><?php echo date( 'A', $this->timestamp ); ?></option> |
||
346 | </select> |
||
347 | </label> |
||
348 | </div> |
||
349 | <?php |
||
350 | |||
351 | } |
||
352 | |||
353 | /** |
||
354 | * Print divider input. |
||
355 | * |
||
356 | * @since 3.0.0 |
||
357 | * @access private |
||
358 | */ |
||
359 | private function divider() { |
||
378 | |||
379 | } |
||
380 |
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.