Completed
Pull Request — master (#74)
by Omid
24:47
created

Video   B

Complexity

Total Complexity 44

Size/Duplication

Total Lines 366
Duplicated Lines 0 %

Coupling/Cohesion

Components 5
Dependencies 0

Importance

Changes 0
Metric Value
wmc 44
lcom 5
cbo 0
dl 0
loc 366
rs 8.8798
c 0
b 0
f 0

39 Methods

Rating   Name   Duplication   Size   Complexity  
A setId() 0 6 1
A getId() 0 4 1
A getTitle() 0 4 1
A setTitle() 0 6 1
A getDescription() 0 4 1
A setDescription() 0 6 1
A getThumbnail() 0 4 1
A setThumbnail() 0 6 1
A getLength() 0 4 1
A setLength() 0 6 1
A getCreatedDate() 0 7 1
A setCreatedDate() 0 6 1
A getModifiedDate() 0 7 1
A setModifiedDate() 0 6 1
A getUploadDate() 0 7 1
A setUploadDate() 0 6 1
A getGeneration() 0 4 1
A setGeneration() 0 6 1
A getPlays() 0 4 1
A setPlays() 0 6 1
A getViews() 0 4 1
A setViews() 0 6 1
A areAllFormatsAvailable() 0 4 1
A setAllFormatsAvailable() 0 6 1
A getCustomMetadata() 0 4 1
A setCustomMetadata() 0 6 1
A getKeywords() 0 4 1
A setKeywords() 0 6 1
A getStills() 0 17 5
A setStills() 0 6 1
A setPublished() 0 6 1
A isPublished() 0 4 1
A setDownloadable() 0 6 1
A isDownloadable() 0 4 1
A getStatus() 0 6 2
A getChannels() 0 4 1
A setChannels() 0 6 1
A getUploadFileName() 0 4 1
A setUploadFileName() 0 6 1

How to fix   Complexity   

Complex Class

Complex classes like Video often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Video, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
declare(strict_types=1);
4
5
namespace MovingImage\Client\VMPro\Entity;
6
7
use DateTime;
8
use JMS\Serializer\Annotation\Type;
9
use JMS\Serializer\Annotation\SerializedName;
10
use MovingImage\Meta\Interfaces\VideoInterface;
11
12
class Video implements VideoInterface
13
{
14
    /**
15
     * @Type("string")
16
     */
17
    private $id;
18
19
    /**
20
     * @Type("string")
21
     */
22
    private $title;
23
24
    /**
25
     * @Type("string")
26
     */
27
    private $description;
28
29
    /**
30
     * @Type("string")
31
     */
32
    private $thumbnail;
33
34
    /**
35
     * @Type("integer")
36
     */
37
    private $length;
38
39
    /**
40
     * @Type("integer")
41
     * @SerializedName("createdDate")
42
     */
43
    private $createdDate;
44
45
    /**
46
     * @Type("integer")
47
     * @SerializedName("modifiedDate")
48
     */
49
    private $modifiedDate;
50
51
    /**
52
     * @Type("integer")
53
     * @SerializedName("uploadDate")
54
     */
55
    private $uploadDate;
56
57
    /**
58
     * @Type("integer")
59
     */
60
    private $generation;
61
62
    /**
63
     * @Type("integer")
64
     */
65
    private $plays;
66
67
    /**
68
     * @Type("integer")
69
     */
70
    private $views;
71
72
    /**
73
     * @Type("boolean")
74
     * @SerializedName("allFormatsAvailable")
75
     */
76
    private $allFormatsAvailable;
77
78
    /**
79
     * @TODO replace it with array collection
80
     *
81
     * @Type("array")
82
     * @SerializedName("customMetadata")
83
     */
84
    private $customMetadata;
85
86
    /**
87
     * @TODO replace it with array collection
88
     *
89
     * @Type("array")
90
     */
91
    private $keywords;
92
93
    /**
94
     * @TODO replace it with array collection
95
     *
96
     * @Type("array")
97
     */
98
    private $stills;
99
100
    /**
101
     * @Type("boolean")
102
     */
103
    private $published;
104
105
    /**
106
     * @Type("array")
107
     */
108
    private $channels;
109
110
    /**
111
     * @Type("string")
112
     * @SerializedName("uploadFileName")
113
     */
114
    private $uploadFileName;
115
116
    /**
117
     * @Type("boolean")
118
     */
119
    private $downloadable;
120
121
    public function setId(string $id): self
122
    {
123
        $this->id = $id;
124
125
        return $this;
126
    }
127
128
    public function getId(): string
129
    {
130
        return $this->id;
131
    }
132
133
    public function getTitle(): ?string
134
    {
135
        return $this->title;
136
    }
137
138
    public function setTitle(string $title): self
139
    {
140
        $this->title = $title;
141
142
        return $this;
143
    }
144
145
    public function getDescription(): ?string
146
    {
147
        return $this->description;
148
    }
149
150
    public function setDescription(string $description): self
151
    {
152
        $this->description = $description;
153
154
        return $this;
155
    }
156
157
    public function getThumbnail(): ?string
158
    {
159
        return $this->thumbnail;
160
    }
161
162
    public function setThumbnail(string $thumbnail): self
163
    {
164
        $this->thumbnail = $thumbnail;
165
166
        return $this;
167
    }
168
169
    public function getLength(): ?int
170
    {
171
        return $this->length;
172
    }
173
174
    public function setLength(int $length): self
175
    {
176
        $this->length = $length;
177
178
        return $this;
179
    }
180
181
    public function getCreatedDate(): DateTime
182
    {
183
        $date = new DateTime();
184
        $date->setTimestamp(intval($this->createdDate / 1000));
185
186
        return $date;
187
    }
188
189
    public function setCreatedDate(DateTime $createdDate): Video
190
    {
191
        $this->createdDate = $createdDate->getTimestamp() * 1000;
192
193
        return $this;
194
    }
195
196
    public function getModifiedDate(): ?DateTime
197
    {
198
        $date = new DateTime();
199
        $date->setTimestamp(intval($this->modifiedDate / 1000));
200
201
        return $date;
202
    }
203
204
    public function setModifiedDate(DateTime $modifiedDate): self
205
    {
206
        $this->modifiedDate = $modifiedDate->getTimestamp() * 1000;
207
208
        return $this;
209
    }
210
211
    public function getUploadDate(): ?DateTime
212
    {
213
        $date = new DateTime();
214
        $date->setTimestamp(intval($this->uploadDate / 1000));
215
216
        return $date;
217
    }
218
219
    public function setUploadDate(DateTime $uploadDate): self
220
    {
221
        $this->uploadDate = $uploadDate->getTimestamp() * 1000;
222
223
        return $this;
224
    }
225
226
    public function getGeneration(): ?int
227
    {
228
        return $this->generation;
229
    }
230
231
    public function setGeneration(int $generation): self
232
    {
233
        $this->generation = $generation;
234
235
        return $this;
236
    }
237
238
    public function getPlays(): ?int
239
    {
240
        return $this->plays;
241
    }
242
243
    public function setPlays(int $plays): self
244
    {
245
        $this->plays = $plays;
246
247
        return $this;
248
    }
249
250
    public function getViews(): ?int
251
    {
252
        return $this->views;
253
    }
254
255
    public function setViews(int $views): self
256
    {
257
        $this->views = $views;
258
259
        return $this;
260
    }
261
262
    public function areAllFormatsAvailable(): bool
263
    {
264
        return $this->allFormatsAvailable;
265
    }
266
267
    public function setAllFormatsAvailable(bool $allFormatsAvailable): self
268
    {
269
        $this->allFormatsAvailable = $allFormatsAvailable;
270
271
        return $this;
272
    }
273
274
    public function getCustomMetadata(): ?array
275
    {
276
        return $this->customMetadata;
277
    }
278
279
    public function setCustomMetadata(array $customMetadata): self
280
    {
281
        $this->customMetadata = $customMetadata;
282
283
        return $this;
284
    }
285
286
    public function getKeywords(): array
287
    {
288
        return $this->keywords;
289
    }
290
291
    public function setKeywords(array $keywords): self
292
    {
293
        $this->keywords = $keywords;
294
295
        return $this;
296
    }
297
298
    public function getStills(): array
299
    {
300
        if (!$this->stills) {
301
            return [];
302
        }
303
304
        //sorting preview's images from smallest to biggest
305
        usort($this->stills, function (array $item1, array $item2) {
306
            if (isset($item1['dimension']['height'], $item2['dimension']['height']) && $item1['dimension']['height'] != $item2['dimension']['height']) {
307
                return ($item1['dimension']['height'] > $item2['dimension']['height']) ? 1 : -1;
308
            }
309
310
            return 0;
311
        });
312
313
        return $this->stills;
314
    }
315
316
    public function setStills(array $stills): self
317
    {
318
        $this->stills = $stills;
319
320
        return $this;
321
    }
322
323
    public function setPublished(bool $published): self
324
    {
325
        $this->published = $published;
326
327
        return $this;
328
    }
329
330
    public function isPublished(): ?bool
331
    {
332
        return $this->published;
333
    }
334
335
    public function setDownloadable(bool $downloadable): self
336
    {
337
        $this->downloadable = $downloadable;
338
339
        return $this;
340
    }
341
342
    public function isDownloadable(): ?bool
343
    {
344
        return $this->downloadable;
345
    }
346
347
    public function getStatus(): int
348
    {
349
        return $this->isPublished()
350
            ? VideoInterface::STATUS_PUBLISHED
351
            : VideoInterface::STATUS_NOT_PUBLISHED;
352
    }
353
354
    public function getChannels(): array
355
    {
356
        return $this->channels;
357
    }
358
359
    public function setChannels(array $channels): self
360
    {
361
        $this->channels = $channels;
362
363
        return $this;
364
    }
365
366
    public function getUploadFileName(): string
367
    {
368
        return $this->uploadFileName;
369
    }
370
371
    public function setUploadFileName(string $uploadFileName): self
372
    {
373
        $this->uploadFileName = $uploadFileName;
374
375
        return $this;
376
    }
377
}
378