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 |
||
| 26 | trait IssueScopes |
||
| 27 | { |
||
| 28 | /** |
||
| 29 | * Filter status by open status. |
||
| 30 | * |
||
| 31 | * @param Builder $query |
||
| 32 | * |
||
| 33 | * @return Builder |
||
| 34 | */ |
||
| 35 | public function scopeOpen(Builder $query) |
||
| 39 | |||
| 40 | /** |
||
| 41 | * Filter status by closed status. |
||
| 42 | * |
||
| 43 | * @param Builder $query |
||
| 44 | * |
||
| 45 | * @return Builder |
||
| 46 | */ |
||
| 47 | public function scopeClosed(Builder $query) |
||
| 51 | |||
| 52 | /** |
||
| 53 | * Filter status by a status. |
||
| 54 | * |
||
| 55 | * @param Builder $query |
||
| 56 | * @param int $status |
||
| 57 | * |
||
| 58 | * @return Builder |
||
| 59 | */ |
||
| 60 | public function scopeStatus(Builder $query, $status = Issue::STATUS_OPEN) |
||
| 64 | |||
| 65 | /** |
||
| 66 | * Filter issue by created by or assigned to field based on user role. |
||
| 67 | * |
||
| 68 | * @param Builder $query |
||
| 69 | * @param UserInterface|null $user |
||
| 70 | * |
||
| 71 | * @return Builder |
||
| 72 | */ |
||
| 73 | View Code Duplication | public function scopeAssignedOrCreated(Builder $query, UserInterface $user = null) |
|
| 81 | |||
| 82 | /** |
||
| 83 | * Filter issue by assigned to. |
||
| 84 | * |
||
| 85 | * @param Builder $query |
||
| 86 | * @param null $user |
||
| 87 | * |
||
| 88 | * @return Builder |
||
| 89 | */ |
||
| 90 | public function scopeAssignedTo(Builder $query, $user = null) |
||
| 94 | |||
| 95 | /** |
||
| 96 | * Filter issue by created by. |
||
| 97 | * |
||
| 98 | * @param Builder $query |
||
| 99 | * @param UserInterface|null $user |
||
| 100 | * |
||
| 101 | * @return Builder |
||
| 102 | */ |
||
| 103 | public function scopeCreatedBy(Builder $query, UserInterface $user = null) |
||
| 107 | |||
| 108 | /** |
||
| 109 | * Filter issue by created by if user logged in as User role adn current project is private internal. |
||
| 110 | * |
||
| 111 | * @param Builder $query |
||
| 112 | * @param Model\Project $project |
||
| 113 | * @param UserInterface|null $user |
||
| 114 | * |
||
| 115 | * @return Builder |
||
| 116 | */ |
||
| 117 | View Code Duplication | public function scopeLimitByCreatedForInternalProject(Builder $query, Model\Project $project, UserInterface $user = null) |
|
| 125 | |||
| 126 | /** |
||
| 127 | * Filter issue by project id. |
||
| 128 | * |
||
| 129 | * @param Builder $query |
||
| 130 | * @param int $projectId |
||
| 131 | * |
||
| 132 | * @return Builder |
||
| 133 | */ |
||
| 134 | public function scopeForProject(Builder $query, $projectId) |
||
| 138 | |||
| 139 | /** |
||
| 140 | * Helper method to filter by a field and a value. |
||
| 141 | * |
||
| 142 | * @param Builder $query |
||
| 143 | * @param string $field |
||
| 144 | * @param int|Eloquent\Model $idOrObject |
||
| 145 | * |
||
| 146 | * @return $this|Builder |
||
| 147 | */ |
||
| 148 | protected function whereIdEqual(Builder $query, $field, $idOrObject) |
||
| 157 | |||
| 158 | /** |
||
| 159 | * Filter with like %% on issue string fields title/body. |
||
| 160 | * |
||
| 161 | * @param Builder $query |
||
| 162 | * @param string $keyword |
||
| 163 | * |
||
| 164 | * @return Builder |
||
| 165 | */ |
||
| 166 | public function scopeSearchContent(Builder $query, $keyword) |
||
| 177 | |||
| 178 | /** |
||
| 179 | * Filter issues by an array of tag ids. |
||
| 180 | * |
||
| 181 | * @param Builder $query |
||
| 182 | * @param array ...$tags |
||
| 183 | * |
||
| 184 | * @return Builder |
||
| 185 | */ |
||
| 186 | public function scopeWhereTags(Builder $query, ...$tags) |
||
| 198 | } |
||
| 199 |
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.