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 |
||
| 27 | class absences_ManagerMenu |
||
| 28 | { |
||
| 29 | protected function category($name) |
||
| 40 | |||
| 41 | protected function category_settings() |
||
| 132 | |||
| 133 | |||
| 134 | View Code Duplication | protected function category_rights() |
|
| 178 | |||
| 179 | View Code Duplication | protected function category_requests() |
|
| 180 | { |
||
| 181 | $W = bab_Widgets(); |
||
| 182 | $cat = $this->category(absences_translate('Users requests')); |
||
| 183 | |||
| 184 | $cat->addItem( |
||
| 185 | $W->Link( |
||
| 186 | $W->Icon(absences_translate("Vacations requests"), Func_Icons::ACTIONS_VIEW_LIST_DETAILS), |
||
| 187 | absences_addon()->getUrl()."vacadmb&idx=lreq" |
||
| 188 | ) |
||
| 189 | ); |
||
| 190 | |||
| 191 | $cat->addItem( |
||
| 192 | $W->Link( |
||
| 193 | $W->Icon(absences_translate("Waiting requests"), Func_Icons::APPS_APPROBATIONS), |
||
| 194 | absences_addon()->getUrl()."waiting" |
||
| 195 | ) |
||
| 196 | ); |
||
| 197 | |||
| 198 | $cat->addItem( |
||
| 199 | $W->Link( |
||
| 200 | $W->Icon(absences_translate("Working days entitling recovery"), Func_Icons::ACTIONS_VIEW_CALENDAR_WORKWEEK), |
||
| 201 | absences_addon()->getUrl()."vacadmwd" |
||
| 202 | ) |
||
| 203 | ); |
||
| 204 | |||
| 205 | $cat->addItem( |
||
| 206 | $W->Link( |
||
| 207 | $W->Icon(absences_translate("Time saving accounts deposits"), Func_Icons::ACTIONS_VIEW_HISTORY), |
||
| 208 | absences_addon()->getUrl()."vacadmcet" |
||
| 209 | ) |
||
| 210 | ); |
||
| 211 | |||
| 212 | $cat->addItem( |
||
| 213 | $W->Link( |
||
| 214 | $W->Icon(absences_translate("Archive requests"), Func_Icons::ACTIONS_ARCHIVE_CREATE), |
||
| 215 | absences_addon()->getUrl()."archive&idx=request" |
||
| 216 | ) |
||
| 217 | ); |
||
| 218 | |||
| 219 | |||
| 220 | |||
| 221 | return $cat; |
||
| 222 | } |
||
| 223 | |||
| 224 | |||
| 225 | |||
| 226 | |||
| 227 | |||
| 228 | View Code Duplication | protected function category_export() |
|
| 229 | { |
||
| 230 | $W = bab_Widgets(); |
||
| 231 | $cat = $this->category(absences_translate('Exports')); |
||
| 232 | |||
| 233 | |||
| 234 | $cat->addItem( |
||
| 235 | $W->Link( |
||
| 236 | $W->Icon(absences_translate("Rights export"), Func_Icons::MIMETYPES_OFFICE_SPREADSHEET), |
||
| 237 | absences_addon()->getUrl()."vacadm&idx=rightsexport" |
||
| 238 | ) |
||
| 239 | ); |
||
| 240 | |||
| 241 | $cat->addItem( |
||
| 242 | $W->Link( |
||
| 243 | $W->Icon(absences_translate("Vacation requests exports"), Func_Icons::MIMETYPES_OFFICE_SPREADSHEET), |
||
| 244 | absences_addon()->getUrl()."exportvac&idx=reqx" |
||
| 245 | ) |
||
| 246 | ); |
||
| 247 | |||
| 248 | |||
| 249 | $cat->addItem( |
||
| 250 | $W->Link( |
||
| 251 | $W->Icon(absences_translate("Vacation requests Sage exports"), Func_Icons::MIMETYPES_OFFICE_SPREADSHEET), |
||
| 252 | absences_addon()->getUrl()."exportvac&idx=sage" |
||
| 253 | ) |
||
| 254 | ); |
||
| 255 | |||
| 256 | |||
| 257 | $cat->addItem( |
||
| 258 | $W->Link( |
||
| 259 | $W->Icon(absences_translate("Available balances export"), Func_Icons::MIMETYPES_OFFICE_SPREADSHEET), |
||
| 260 | absences_addon()->getUrl()."vacadm&idx=abexport" |
||
| 261 | ) |
||
| 262 | ); |
||
| 263 | |||
| 264 | |||
| 265 | $cat->addItem( |
||
| 266 | $W->Link( |
||
| 267 | $W->Icon(absences_translate("Download statistics"), Func_Icons::MIMETYPES_OFFICE_SPREADSHEET), |
||
| 268 | absences_addon()->getUrl()."statistics&idx=filter" |
||
| 269 | ) |
||
| 270 | ); |
||
| 271 | |||
| 272 | |||
| 273 | return $cat; |
||
| 274 | } |
||
| 275 | |||
| 276 | |||
| 277 | public function getFrame() |
||
| 294 | } |
Let’s take a look at an example:
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.
Available Fixes
Change the type-hint for the parameter:
Add an additional type-check:
Add the method to the parent class: