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 |
||
18 | abstract class AbstractMenu extends AbstractUiItem implements |
||
19 | MenuInterface |
||
20 | { |
||
21 | /** |
||
22 | * A collection menu items. |
||
23 | * |
||
24 | * @var MenuItemInterface[] |
||
25 | */ |
||
26 | private $items = []; |
||
27 | |||
28 | /** |
||
29 | * A callback applied to each menu item output by {@see self::items()}. |
||
30 | * |
||
31 | * @var callable |
||
32 | */ |
||
33 | private $itemCallback; |
||
34 | |||
35 | /** |
||
36 | * Store a menu builder instance. |
||
37 | * |
||
38 | * @var MenuItemBuilder $menuItemBuilder |
||
39 | */ |
||
40 | private $menuItemBuilder; |
||
41 | |||
42 | /** |
||
43 | * Return a new menu. |
||
44 | * |
||
45 | * @param array|\ArrayAccess $data Class dependencies. |
||
46 | */ |
||
47 | public function __construct($data) |
||
51 | |||
52 | /** |
||
53 | * @param MenuItemBuilder $menuItemBuilder The Menu Item Builder that will be used to create new items. |
||
54 | * @return AsbtractMenu Chainable |
||
55 | */ |
||
56 | public function setMenuItemBuilder(MenuItemBuilder $menuItemBuilder) |
||
61 | |||
62 | /** |
||
63 | * @param callable $cb The item callback. |
||
64 | * @return AbstractMenu Chainable |
||
65 | */ |
||
66 | public function setItemCallback(callable $cb) |
||
71 | |||
72 | /** |
||
73 | * @param array $items The menu items. |
||
74 | * @return AbstractMenu Chainable |
||
75 | */ |
||
76 | public function setItems(array $items) |
||
84 | |||
85 | /** |
||
86 | * @param array|MenuItemInterface $item A menu item structure or object. |
||
87 | * @param string $ident The menu item identifier, if any. |
||
88 | * @throws InvalidArgumentException If the item argument is not a structure or object. |
||
89 | * @return MenuItem Chainable |
||
90 | */ |
||
91 | public function addItem($item, $ident = null) |
||
117 | |||
118 | /** |
||
119 | * Menu Item generator. |
||
120 | * |
||
121 | * @param callable $itemCallback Optional. Item callback. |
||
122 | * @return MenuItemInterface[] |
||
123 | */ |
||
124 | View Code Duplication | public function items(callable $itemCallback = null) |
|
139 | |||
140 | /** |
||
141 | * @return boolean |
||
142 | */ |
||
143 | public function hasItems() |
||
147 | |||
148 | /** |
||
149 | * @return integer |
||
150 | */ |
||
151 | public function numItems() |
||
155 | } |
||
156 |
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.