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 |
||
13 | class News extends UrlModel implements NamedModel |
||
14 | { |
||
15 | /** |
||
16 | * The category of the article |
||
17 | * @var int |
||
18 | */ |
||
19 | protected $category; |
||
20 | |||
21 | /** |
||
22 | * The subject of the news article |
||
23 | * @var string |
||
24 | */ |
||
25 | protected $subject; |
||
26 | |||
27 | /** |
||
28 | * The content of the news article |
||
29 | * @var string |
||
30 | */ |
||
31 | protected $content; |
||
32 | |||
33 | /** |
||
34 | * The creation date of the news article |
||
35 | * @var TimeDate |
||
36 | */ |
||
37 | protected $created; |
||
38 | |||
39 | /** |
||
40 | * The date the news article was last updated |
||
41 | * @var TimeDate |
||
42 | */ |
||
43 | protected $updated; |
||
44 | |||
45 | /** |
||
46 | * The ID of the author of the news article |
||
47 | * @var int |
||
48 | */ |
||
49 | protected $author; |
||
50 | |||
51 | /** |
||
52 | * The ID of the last person to edit the news article |
||
53 | * @var int |
||
54 | */ |
||
55 | protected $editor; |
||
56 | |||
57 | /** @var bool Whether or not the News item is a draft */ |
||
58 | protected $is_draft; |
||
59 | |||
60 | const DELETED_COLUMN = 'is_deleted'; |
||
61 | const TABLE = "news"; |
||
62 | |||
63 | const CREATE_PERMISSION = Permission::CREATE_NEWS; |
||
64 | const EDIT_PERMISSION = Permission::EDIT_NEWS; |
||
65 | const SOFT_DELETE_PERMISSION = Permission::SOFT_DELETE_NEWS; |
||
66 | const HARD_DELETE_PERMISSION = Permission::HARD_DELETE_NEWS; |
||
67 | |||
68 | /** |
||
69 | * {@inheritdoc} |
||
70 | */ |
||
71 | protected function assignResult($news) |
||
72 | { |
||
73 | $this->category = $news['category']; |
||
74 | $this->subject = $news['subject']; |
||
75 | $this->content = $news['content']; |
||
76 | 2 | $this->created = TimeDate::fromMysql($news['created']); |
|
77 | $this->updated = TimeDate::fromMysql($news['updated']); |
||
78 | 2 | $this->author = $news['author']; |
|
79 | 2 | $this->editor = $news['editor']; |
|
80 | 2 | $this->is_draft = $news['is_draft']; |
|
81 | 2 | $this->is_deleted = $news['is_deleted']; |
|
82 | 2 | } |
|
83 | 2 | ||
84 | 2 | /** |
|
85 | 2 | * Get the author of the news article |
|
86 | 2 | * @return Player The author of the post |
|
87 | */ |
||
88 | public function getAuthor() |
||
92 | 1 | ||
93 | /** |
||
94 | 1 | * Get the user ID of the author who wrote this article |
|
95 | * @return int The author ID |
||
96 | */ |
||
97 | public function getAuthorID() |
||
101 | |||
102 | /** |
||
103 | * Get the category of the news article |
||
104 | * @return NewsCategory The category of the post |
||
105 | */ |
||
106 | public function getCategory() |
||
110 | |||
111 | /** |
||
112 | * Get the database ID from the category the article belongs into |
||
113 | * @return int The category ID |
||
114 | */ |
||
115 | public function getCategoryID() |
||
119 | |||
120 | /** |
||
121 | * Get the content of the article |
||
122 | * @return string The raw content of the article |
||
123 | */ |
||
124 | public function getContent() |
||
128 | |||
129 | /** |
||
130 | * Get the time when the article was submitted |
||
131 | * |
||
132 | * @return TimeDate The article's creation time |
||
133 | */ |
||
134 | public function getCreated() |
||
138 | 1 | ||
139 | /** |
||
140 | 1 | * Get the time when the article was last updated |
|
141 | * |
||
142 | * @return TimeDate The article's last update time |
||
143 | */ |
||
144 | public function getLastEdit() |
||
148 | |||
149 | /** |
||
150 | * Get the last editor of the post |
||
151 | * @return Player A Player object of the last editor |
||
152 | */ |
||
153 | public function getLastEditor() |
||
157 | |||
158 | /** |
||
159 | * Get the ID of the person who last edited the article |
||
160 | * @return int The ID of the last editor |
||
161 | */ |
||
162 | public function getLastEditorID() |
||
166 | |||
167 | /** |
||
168 | * Get the subject of the news article |
||
169 | * @return string |
||
170 | */ |
||
171 | public function getSubject() |
||
175 | 1 | ||
176 | /** |
||
177 | 1 | * {@inheritdoc} |
|
178 | */ |
||
179 | public function getName() |
||
183 | 1 | ||
184 | /** |
||
185 | 1 | * Get whether or not this news article is |
|
186 | * |
||
187 | * @return bool |
||
188 | */ |
||
189 | public function isDraft() |
||
193 | 1 | ||
194 | /** |
||
195 | * {@inheritdoc} |
||
196 | */ |
||
197 | public static function getParamName() |
||
201 | 1 | ||
202 | /** |
||
203 | * {@inheritdoc} |
||
204 | */ |
||
205 | public static function getRouteName($action = 'show') |
||
209 | |||
210 | /** |
||
211 | * Update the "draft" status of a post |
||
212 | * |
||
213 | * @param bool $draft |
||
214 | * |
||
215 | * @return static |
||
216 | */ |
||
217 | public function setDraft($draft) |
||
221 | |||
222 | /** |
||
223 | * Update the content of a post |
||
224 | * |
||
225 | * @param string $content The new content of the post |
||
226 | * |
||
227 | * @return self |
||
228 | */ |
||
229 | public function updateContent($content) |
||
233 | |||
234 | /** |
||
235 | * Update the last edit timestamp |
||
236 | * @return self |
||
237 | */ |
||
238 | public function updateEditTimestamp() |
||
242 | |||
243 | /** |
||
244 | * Update the editor of the post |
||
245 | * |
||
246 | * @param int $editorID The ID of the editor |
||
247 | * @return self |
||
248 | */ |
||
249 | public function updateLastEditor($editorID) |
||
253 | |||
254 | /** |
||
255 | * Update the category of the post |
||
256 | * |
||
257 | * @param int $categoryID The ID of the category |
||
258 | * @return self |
||
259 | */ |
||
260 | public function updateCategory($categoryID) |
||
264 | |||
265 | /** |
||
266 | * Update the status of a post |
||
267 | * |
||
268 | * @param string $status The new status of a post |
||
269 | * @return self |
||
270 | */ |
||
271 | public function updateStatus($status = 'published') |
||
277 | |||
278 | /** |
||
279 | * Update the subject of a post |
||
280 | * |
||
281 | * @param string $subject The new subject of a post |
||
282 | * @return self |
||
283 | */ |
||
284 | public function updateSubject($subject) |
||
288 | 2 | ||
289 | /** |
||
290 | 2 | * Add a new news article |
|
291 | 2 | * |
|
292 | 2 | * @param string $subject The subject of the article |
|
293 | 2 | * @param string $content The content of the article |
|
294 | 2 | * @param int $authorID The ID of the author |
|
295 | 2 | * @param int $categoryId The ID of the category this article will be published under |
|
296 | 2 | * @param bool $is_draft Whether or not the added news item should be stored as a draft |
|
297 | 2 | * |
|
298 | * @return News An object representing the article that was just created or false if the article was not created |
||
299 | */ |
||
300 | public static function addNews($subject, $content, $authorID, $categoryId = 1, $is_draft = false) |
||
311 | 1 | ||
312 | /** |
||
313 | 1 | * Get all the news entries in the database that aren't disabled or deleted |
|
314 | 1 | * |
|
315 | * @param int $start The offset used when fetching matches, i.e. the starting point |
||
316 | * @param int $limit The amount of matches to be retrieved |
||
317 | 1 | * @param bool $getDrafts Whether or not to fetch drafts |
|
318 | 1 | * |
|
319 | 1 | * @throws Exception When a database is not configured in BZiON |
|
320 | 1 | * |
|
321 | * @return News[] An array of news objects |
||
322 | */ |
||
323 | View Code Duplication | public static function getNews($start = 0, $limit = 5, $getDrafts = false) |
|
324 | { |
||
325 | $qb = self::getQueryBuilder() |
||
326 | ->limit($limit) |
||
327 | ->offset($start) |
||
328 | ->orderBy('created', 'DESC') |
||
329 | ->active() |
||
330 | ; |
||
331 | |||
332 | if ($getDrafts) { |
||
333 | $qb->orWhere('is_draft', '=', true); |
||
334 | } |
||
335 | |||
336 | return $qb->getModels(true); |
||
337 | } |
||
338 | |||
339 | /** |
||
340 | * Get a query builder for news |
||
341 | * |
||
342 | * @throws Exception |
||
343 | * |
||
344 | * @return QueryBuilderFlex |
||
345 | */ |
||
346 | public static function getQueryBuilder() |
||
352 | } |
||
353 |
If you suppress an error, we recommend checking for the error condition explicitly: