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 Test_Admin_Menu extends WP_UnitTestCase { |
||
21 | |||
22 | /** |
||
23 | * Menu data fixture. |
||
24 | * |
||
25 | * @var array |
||
26 | */ |
||
27 | public static $menu_data; |
||
28 | |||
29 | /** |
||
30 | * Submenu data fixture. |
||
31 | * |
||
32 | * @var array |
||
33 | */ |
||
34 | public static $submenu_data; |
||
35 | |||
36 | /** |
||
37 | * Test domain. |
||
38 | * |
||
39 | * @var string |
||
40 | */ |
||
41 | public static $domain; |
||
42 | |||
43 | /** |
||
44 | * Admin menu instance. |
||
45 | * |
||
46 | * @var Admin_Menu |
||
47 | */ |
||
48 | public static $admin_menu; |
||
49 | |||
50 | /** |
||
51 | * Mock user ID. |
||
52 | * |
||
53 | * @var int |
||
54 | */ |
||
55 | private static $user_id = 0; |
||
56 | |||
57 | /** |
||
58 | * Create shared fixtures. |
||
59 | * |
||
60 | * @param WP_UnitTest_Factory $factory Fixture factory. |
||
61 | */ |
||
62 | View Code Duplication | public static function wpSetUpBeforeClass( $factory ) { |
|
63 | static::$domain = ( new Status() )->get_site_suffix(); |
||
64 | static::$user_id = $factory->user->create( array( 'role' => 'administrator' ) ); |
||
|
|||
65 | static::$menu_data = get_menu_fixture(); |
||
66 | static::$submenu_data = get_submenu_fixture(); |
||
67 | } |
||
68 | |||
69 | /** |
||
70 | * Set up data. |
||
71 | */ |
||
72 | View Code Duplication | public function setUp() { |
|
84 | |||
85 | /** |
||
86 | * Test_Admin_Menu. |
||
87 | * |
||
88 | * @covers ::reregister_menu_items |
||
89 | */ |
||
90 | public function test_admin_menu_output() { |
||
103 | |||
104 | /** |
||
105 | * Shim wpcomsh fallback site icon. |
||
106 | * |
||
107 | * @return string |
||
108 | */ |
||
109 | public function wpcomsh_site_icon_url() { |
||
112 | |||
113 | /** |
||
114 | * Custom site icon. |
||
115 | * |
||
116 | * @return string |
||
117 | */ |
||
118 | public function custom_site_icon_url() { |
||
121 | |||
122 | /** |
||
123 | * Tests add_my_home_menu |
||
124 | * |
||
125 | * @covers ::add_my_home_menu |
||
126 | */ |
||
127 | public function test_add_my_home_menu() { |
||
149 | |||
150 | /** |
||
151 | * Tests add_stats_menu |
||
152 | * |
||
153 | * @covers ::add_stats_menu |
||
154 | */ |
||
155 | public function test_add_stats_menu() { |
||
156 | global $menu; |
||
157 | |||
158 | static::$admin_menu->add_stats_menu(); |
||
159 | |||
160 | $this->assertSame( 'https://wordpress.com/stats/day/' . static::$domain, $menu['3.86682'][2] ); |
||
161 | } |
||
162 | |||
163 | /** |
||
164 | * Tests add_upgrades_menu |
||
165 | * |
||
166 | * @covers ::add_upgrades_menu |
||
167 | */ |
||
168 | View Code Duplication | public function test_add_upgrades_menu() { |
|
176 | |||
177 | /** |
||
178 | * Tests add_posts_menu |
||
179 | * |
||
180 | * @covers ::add_posts_menu |
||
181 | */ |
||
182 | View Code Duplication | public function test_add_posts_menu() { |
|
190 | |||
191 | /** |
||
192 | * Tests add_media_menu |
||
193 | * |
||
194 | * @covers ::add_media_menu |
||
195 | */ |
||
196 | View Code Duplication | public function test_add_media_menu() { |
|
204 | |||
205 | /** |
||
206 | * Tests add_page_menu |
||
207 | * |
||
208 | * @covers ::add_page_menu |
||
209 | */ |
||
210 | View Code Duplication | public function test_add_page_menu() { |
|
218 | |||
219 | /** |
||
220 | * Tests add_custom_post_type_menu |
||
221 | * |
||
222 | * @covers ::add_custom_post_type_menu |
||
223 | */ |
||
224 | public function test_add_custom_post_type_menu() { |
||
251 | |||
252 | /** |
||
253 | * Tests add_comments_menu |
||
254 | * |
||
255 | * @covers ::add_comments_menu |
||
256 | */ |
||
257 | View Code Duplication | public function test_add_comments_menu() { |
|
265 | |||
266 | /** |
||
267 | * Tests add_appearance_menu |
||
268 | * |
||
269 | * @covers ::add_appearance_menu |
||
270 | */ |
||
271 | public function test_add_appearance_menu() { |
||
281 | |||
282 | /** |
||
283 | * Tests add_plugins_menu |
||
284 | * |
||
285 | * @covers ::add_plugins_menu |
||
286 | */ |
||
287 | public function test_add_plugins_menu() { |
||
303 | |||
304 | /** |
||
305 | * Tests add_users_menu |
||
306 | * |
||
307 | * @covers ::add_users_menu |
||
308 | */ |
||
309 | public function test_add_users_menu() { |
||
350 | |||
351 | /** |
||
352 | * Tests add_tools_menu |
||
353 | * |
||
354 | * @covers ::add_tools_menu |
||
355 | */ |
||
356 | public function test_add_tools_menu() { |
||
366 | |||
367 | /** |
||
368 | * Tests add_options_menu |
||
369 | * |
||
370 | * @covers ::add_options_menu |
||
371 | */ |
||
372 | View Code Duplication | public function test_add_options_menu() { |
|
379 | |||
380 | /** |
||
381 | * Tests add_jetpack_menu |
||
382 | * |
||
383 | * @covers ::add_jetpack_menu |
||
384 | */ |
||
385 | public function test_add_jetpack_menu() { |
||
394 | |||
395 | /** |
||
396 | * Tests add_gutenberg_menus |
||
397 | * |
||
398 | * @covers ::add_gutenberg_menus |
||
399 | */ |
||
400 | public function test_add_gutenberg_menus() { |
||
420 | } |
||
421 |
Let’s assume you have a class which uses late-static binding:
The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the
getSomeVariable()
on that sub-class, you will receive a runtime error:In the case above, it makes sense to update
SomeClass
to useself
instead: