| Total Complexity | 43 |
| Total Lines | 219 |
| Duplicated Lines | 0 % |
| Changes | 0 | ||
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.
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 |
||
| 5 | class Video |
||
| 6 | { |
||
| 7 | use VideoTrait; |
||
| 8 | |||
| 9 | const RESTRICTION_DENY = 'deny'; |
||
| 10 | const RESTRICTION_ALLOW = 'allow'; |
||
| 11 | |||
| 12 | const PLATFORM_TV = 'tv'; |
||
| 13 | const PLATFORM_MOBILE = 'mobile'; |
||
| 14 | const PLATFORM_WEB = 'web'; |
||
| 15 | |||
| 16 | public function setTitle($title) |
||
| 17 | { |
||
| 18 | if (\strlen($title) > 100) { |
||
| 19 | throw new \DomainException('The title value must be less than 100 characters'); |
||
| 20 | } |
||
| 21 | |||
| 22 | $this->title = $title; |
||
| 23 | |||
| 24 | return $this; |
||
| 25 | } |
||
| 26 | |||
| 27 | public function setDescription($description) |
||
| 28 | { |
||
| 29 | if (\strlen($description) > 2048) { |
||
| 30 | throw new \DomainException('The description value must be less than 2,048 characters'); |
||
| 31 | } |
||
| 32 | |||
| 33 | $this->description = $description; |
||
| 34 | |||
| 35 | return $this; |
||
| 36 | } |
||
| 37 | |||
| 38 | public function setPlayerLoc($loc, $allowEmbed = true, $autoplay = null) |
||
| 39 | { |
||
| 40 | $this->playerLoc = null; |
||
| 41 | if ($loc !== null) { |
||
| 42 | $this->playerLoc = [ |
||
| 43 | 'loc' => $loc, |
||
| 44 | 'allow_embed' => $allowEmbed, |
||
| 45 | 'autoplay' => $autoplay, |
||
| 46 | ]; |
||
| 47 | } |
||
| 48 | |||
| 49 | return $this; |
||
| 50 | } |
||
| 51 | |||
| 52 | public function setDuration($duration) |
||
| 53 | { |
||
| 54 | $duration = (int)$duration; |
||
| 55 | |||
| 56 | if ($duration < 0 || $duration > 28800) { |
||
| 57 | throw new \DomainException('The duration must be between 0 and 28800 seconds'); |
||
| 58 | } |
||
| 59 | |||
| 60 | $this->duration = $duration; |
||
| 61 | |||
| 62 | return $this; |
||
| 63 | } |
||
| 64 | |||
| 65 | public function setExpirationDate($date) |
||
| 66 | { |
||
| 67 | if ($date !== null && !$date instanceof \DateTime) { |
||
| 68 | $date = new \DateTime($date); |
||
| 69 | } |
||
| 70 | |||
| 71 | $this->expirationDate = $date; |
||
| 72 | |||
| 73 | return $this; |
||
| 74 | } |
||
| 75 | |||
| 76 | public function getExpirationDate() |
||
| 77 | { |
||
| 78 | if ($this->expirationDate === null) { |
||
| 79 | return null; |
||
| 80 | } |
||
| 81 | |||
| 82 | return $this->expirationDate->format(\DateTime::W3C); |
||
| 83 | } |
||
| 84 | |||
| 85 | public function setRating($rating) |
||
| 86 | { |
||
| 87 | $rating = (float)$rating; |
||
| 88 | |||
| 89 | if ($rating < 0 || $rating > 5) { |
||
| 90 | throw new \DomainException('The rating must be between 0 and 5'); |
||
| 91 | } |
||
| 92 | |||
| 93 | $this->rating = $rating; |
||
| 94 | |||
| 95 | return $this; |
||
| 96 | } |
||
| 97 | |||
| 98 | public function setViewCount($count) |
||
| 99 | { |
||
| 100 | if ((int)$count < 0) { |
||
| 101 | throw new \DomainException('The view count must be positive'); |
||
| 102 | } |
||
| 103 | |||
| 104 | $this->viewCount = $count; |
||
| 105 | |||
| 106 | return $this; |
||
| 107 | } |
||
| 108 | |||
| 109 | public function setPublicationDate($date) |
||
| 110 | { |
||
| 111 | if ($date !== null && !$date instanceof \DateTime) { |
||
| 112 | $date = new \DateTime($date); |
||
| 113 | } |
||
| 114 | |||
| 115 | $this->publicationDate = $date; |
||
| 116 | |||
| 117 | return $this; |
||
| 118 | } |
||
| 119 | |||
| 120 | public function getPublicationDate() |
||
| 127 | } |
||
| 128 | |||
| 129 | public function setTags($tags) |
||
| 130 | { |
||
| 131 | if ($tags === null) { |
||
| 132 | $this->tags = null; |
||
| 133 | } else { |
||
| 134 | if (\count($tags) > 32) { |
||
| 135 | throw new \DomainException('A maximum of 32 tags is allowed.'); |
||
| 136 | } |
||
| 137 | |||
| 138 | $this->tags = $tags; |
||
| 139 | } |
||
| 140 | |||
| 141 | return $this; |
||
| 142 | } |
||
| 143 | |||
| 144 | public function setCategory($category) |
||
| 145 | { |
||
| 146 | if (\strlen($category) > 256) { |
||
| 147 | throw new \DomainException('The category value must be less than 256 characters'); |
||
| 148 | } |
||
| 149 | |||
| 150 | $this->category = $category; |
||
| 151 | |||
| 152 | return $this; |
||
| 153 | } |
||
| 154 | |||
| 155 | public function setRestrictions($restrictions, $relationship = self::RESTRICTION_DENY) |
||
| 156 | { |
||
| 157 | if ($restrictions === null) { |
||
| 158 | $this->restrictions = null; |
||
| 159 | } else { |
||
| 160 | if ($relationship !== self::RESTRICTION_ALLOW && $relationship !== self::RESTRICTION_DENY) { |
||
| 161 | throw new \InvalidArgumentException('The relationship must be deny or allow'); |
||
| 162 | } |
||
| 163 | |||
| 164 | $this->restrictions = [ |
||
| 165 | 'countries' => $restrictions, |
||
| 166 | 'relationship' => $relationship, |
||
| 167 | ]; |
||
| 168 | } |
||
| 169 | |||
| 170 | return $this; |
||
| 171 | } |
||
| 172 | |||
| 173 | public function setGalleryLoc($loc, $title = null) |
||
| 184 | } |
||
| 185 | |||
| 186 | public function setUploader($uploader, $info = null) |
||
| 187 | { |
||
| 188 | $this->uploader = null; |
||
| 189 | if ($uploader !== null) { |
||
| 190 | $this->uploader = [ |
||
| 191 | 'name' => $uploader, |
||
| 192 | 'info' => $info, |
||
| 193 | ]; |
||
| 194 | } |
||
| 195 | |||
| 196 | return $this; |
||
| 197 | } |
||
| 198 | |||
| 199 | public function setPlatforms($platforms) |
||
| 224 | } |
||
| 225 | } |
||
| 226 |