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 |
||
| 25 | class HttpLoader implements LoaderInterface |
||
| 26 | { |
||
| 27 | /** |
||
| 28 | * @var ValidatorInterface |
||
| 29 | */ |
||
| 30 | private $validator; |
||
| 31 | |||
| 32 | /** |
||
| 33 | * @var Client |
||
| 34 | */ |
||
| 35 | private $client; |
||
| 36 | |||
| 37 | /** |
||
| 38 | * @var LoggerInterface |
||
| 39 | */ |
||
| 40 | private $logger; |
||
| 41 | |||
| 42 | /** |
||
| 43 | * @var DispersalStrategyInterface |
||
| 44 | */ |
||
| 45 | private $strategy; |
||
| 46 | |||
| 47 | /** |
||
| 48 | * doctrine cache |
||
| 49 | * |
||
| 50 | * @var CacheProvider |
||
| 51 | */ |
||
| 52 | private $cache; |
||
| 53 | |||
| 54 | /** |
||
| 55 | * doctrine cache lifetime |
||
| 56 | * |
||
| 57 | * @var int |
||
| 58 | */ |
||
| 59 | private $cacheLifetime; |
||
| 60 | |||
| 61 | /** |
||
| 62 | * @var array curl options to apply on each request |
||
| 63 | */ |
||
| 64 | private $curlOptions = []; |
||
| 65 | |||
| 66 | /** |
||
| 67 | * @var array |
||
| 68 | */ |
||
| 69 | private $options = [ |
||
| 70 | 'storeKey' => 'httpLoader', |
||
| 71 | ]; |
||
| 72 | |||
| 73 | /** |
||
| 74 | * constructor |
||
| 75 | * |
||
| 76 | * @param ValidatorInterface $validator validator |
||
| 77 | * @param Client $client http client |
||
| 78 | * @param LoggerInterface $logger Logger |
||
| 79 | */ |
||
| 80 | 8 | public function __construct(ValidatorInterface $validator, Client $client, LoggerInterface $logger) |
|
| 81 | { |
||
| 82 | 8 | $this->validator = $validator; |
|
| 83 | 8 | $this->client = $client; |
|
| 84 | 8 | $this->logger = $logger; |
|
| 85 | 8 | } |
|
| 86 | |||
| 87 | /** |
||
| 88 | * @inheritDoc |
||
| 89 | * |
||
| 90 | * @param DispersalStrategyInterface $strategy dispersal strategy |
||
| 91 | * |
||
| 92 | * @return void |
||
| 93 | */ |
||
| 94 | 6 | public function setDispersalStrategy(DispersalStrategyInterface $strategy) |
|
| 98 | |||
| 99 | /** |
||
| 100 | * @inheritDoc |
||
| 101 | * |
||
| 102 | * @param CacheProvider $cache doctrine cache provider |
||
| 103 | * @param string $cacheNamespace cache namespace |
||
| 104 | * @param int $cacheLifetime cache lifetime |
||
| 105 | * |
||
| 106 | * @return void |
||
| 107 | */ |
||
| 108 | 2 | public function setCache(CacheProvider $cache, $cacheNamespace, $cacheLifetime) |
|
| 114 | |||
| 115 | /** |
||
| 116 | * set curl options |
||
| 117 | * |
||
| 118 | * @param array $curlOptions the curl options |
||
| 119 | * |
||
| 120 | * @return void |
||
| 121 | */ |
||
| 122 | public function setCurlOptions(array $curlOptions) |
||
| 126 | |||
| 127 | /** |
||
| 128 | * @inheritDoc |
||
| 129 | * |
||
| 130 | * @param array $options cache strategy |
||
| 131 | * |
||
| 132 | * @return void |
||
| 133 | */ |
||
| 134 | 2 | public function setOptions($options) |
|
| 143 | |||
| 144 | /** |
||
| 145 | * check if the url is valid |
||
| 146 | * |
||
| 147 | * @param string $url url |
||
| 148 | * |
||
| 149 | * @return boolean |
||
| 150 | */ |
||
| 151 | 2 | public function supports($url) |
|
| 157 | |||
| 158 | /** |
||
| 159 | * Applies the specified curl option on a request |
||
| 160 | * |
||
| 161 | * @param RequestInterface $request request |
||
| 162 | * |
||
| 163 | * @return void |
||
| 164 | */ |
||
| 165 | 6 | protected function applyCurlOptions($request) |
|
| 174 | |||
| 175 | /** |
||
| 176 | * @inheritDoc |
||
| 177 | * |
||
| 178 | * @param string $input url |
||
| 179 | * |
||
| 180 | * @return ApiDefinition |
||
| 181 | */ |
||
| 182 | 6 | public function load($input) |
|
| 216 | |||
| 217 | /** |
||
| 218 | * fetch file from remote destination |
||
| 219 | * |
||
| 220 | * @param RequestInterface $request request |
||
| 221 | * |
||
| 222 | * @return string |
||
| 223 | */ |
||
| 224 | private function fetchFile(RequestInterface $request) |
||
| 246 | } |
||
| 247 |
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.