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 |
||
| 39 | View Code Duplication | abstract class AbstractFileResolver implements FileResolverInterface |
|
|
|
|||
| 40 | { |
||
| 41 | |||
| 42 | /** |
||
| 43 | * The registry processor instance. |
||
| 44 | * |
||
| 45 | * @var \TechDivision\Import\Services\RegistryProcessorInterface |
||
| 46 | */ |
||
| 47 | private $registryProcessor; |
||
| 48 | |||
| 49 | /** |
||
| 50 | * The actual source directory to load the files from. |
||
| 51 | * |
||
| 52 | * @var string |
||
| 53 | */ |
||
| 54 | private $sourceDir; |
||
| 55 | |||
| 56 | /** |
||
| 57 | * The subject configuraiton instance. |
||
| 58 | * |
||
| 59 | * @var \TechDivision\Import\Configuration\SubjectConfigurationInterface |
||
| 60 | */ |
||
| 61 | private $subjectConfiguration; |
||
| 62 | |||
| 63 | /** |
||
| 64 | * The filesystem adapter instance. |
||
| 65 | * |
||
| 66 | * @var \TechDivision\Import\Adapter\PhpFilesystemAdapterInterface |
||
| 67 | */ |
||
| 68 | private $filesystemAdapter; |
||
| 69 | |||
| 70 | /** |
||
| 71 | * The filesystem loader instance. |
||
| 72 | * |
||
| 73 | * @var \TechDivision\Import\Loaders\LoaderInterface |
||
| 74 | */ |
||
| 75 | private $filesystemLoader; |
||
| 76 | |||
| 77 | /** |
||
| 78 | * Initializes the file resolver with the application and the registry instance. |
||
| 79 | * |
||
| 80 | * @param \TechDivision\Import\Services\RegistryProcessorInterface $registryProcessor The registry instance |
||
| 81 | 3 | * @param \TechDivision\Import\Loaders\FilteredLoaderInterface $filesystemLoader The filesystem loader instance |
|
| 82 | */ |
||
| 83 | 3 | public function __construct(RegistryProcessorInterface $registryProcessor, FilteredLoaderInterface $filesystemLoader) |
|
| 88 | |||
| 89 | /** |
||
| 90 | * Return's the registry processor instance. |
||
| 91 | * |
||
| 92 | * @return \TechDivision\Import\Services\RegistryProcessorInterface The processor instance |
||
| 93 | */ |
||
| 94 | protected function getRegistryProcessor() : RegistryProcessorInterface |
||
| 98 | |||
| 99 | /** |
||
| 100 | * Return's the filesystem loader instance. |
||
| 101 | * |
||
| 102 | * @return \TechDivision\Import\Loaders\FilteredLoaderInterface The loader instance |
||
| 103 | */ |
||
| 104 | protected function getFilesystemLoader() : FilteredLoaderInterface |
||
| 108 | |||
| 109 | /** |
||
| 110 | * Sets the actual source directory to load the files from. |
||
| 111 | * |
||
| 112 | * @param string $sourceDir The actual source directory |
||
| 113 | * |
||
| 114 | * @return void |
||
| 115 | */ |
||
| 116 | protected function setSourceDir(string $sourceDir) : void |
||
| 120 | |||
| 121 | /** |
||
| 122 | * Returns the actual source directory to load the files from. |
||
| 123 | * |
||
| 124 | * @return string The actual source directory |
||
| 125 | */ |
||
| 126 | protected function getSourceDir() : string |
||
| 130 | |||
| 131 | /** |
||
| 132 | * Returns the file resolver configuration instance. |
||
| 133 | * |
||
| 134 | 3 | * @return \TechDivision\Import\Configuration\Subject\FileResolverConfigurationInterface The configuration instance |
|
| 135 | */ |
||
| 136 | 3 | protected function getFileResolverConfiguration() : FileResolverConfigurationInterface |
|
| 140 | |||
| 141 | /** |
||
| 142 | * Returns the suffix for the import files. |
||
| 143 | * |
||
| 144 | 3 | * @return string The suffix |
|
| 145 | */ |
||
| 146 | 3 | protected function getSuffix() : string |
|
| 150 | |||
| 151 | /** |
||
| 152 | * Initializes the file resolver for the import process with the passed serial. |
||
| 153 | * |
||
| 154 | 3 | * @param string $serial The unique identifier of the actual import process |
|
| 155 | * |
||
| 156 | 3 | * @return void |
|
| 157 | * @throws \Exception Is thrown if the configured source directory is not available |
||
| 158 | */ |
||
| 159 | protected function initialize(string $serial) : void |
||
| 176 | 1 | ||
| 177 | /** |
||
| 178 | * Sets the subject configuration instance. |
||
| 179 | * |
||
| 180 | * @param \TechDivision\Import\Configuration\SubjectConfigurationInterface $subjectConfiguration The subject configuration |
||
| 181 | * |
||
| 182 | * @return void |
||
| 183 | */ |
||
| 184 | public function setSubjectConfiguration(SubjectConfigurationInterface $subjectConfiguration) : void |
||
| 188 | |||
| 189 | /** |
||
| 190 | * Returns the subject configuration instance. |
||
| 191 | * |
||
| 192 | * @return \TechDivision\Import\Configuration\SubjectConfigurationInterface The subject configuration |
||
| 193 | */ |
||
| 194 | public function getSubjectConfiguration() : SubjectConfigurationInterface |
||
| 198 | |||
| 199 | /** |
||
| 200 | * Set's the filesystem adapter instance. |
||
| 201 | * |
||
| 202 | * @param \TechDivision\Import\Adapter\FilesystemAdapterInterface $filesystemAdapter |
||
| 203 | * |
||
| 204 | * @return void |
||
| 205 | */ |
||
| 206 | public function setFilesystemAdapter(FilesystemAdapterInterface $filesystemAdapter) : void |
||
| 210 | |||
| 211 | 3 | /** |
|
| 212 | 3 | * Return's the filesystem adapter instance. |
|
| 213 | * |
||
| 214 | * @return \TechDivision\Import\Adapter\FilesystemAdapterInterface The filesystem adapter instance |
||
| 215 | */ |
||
| 216 | public function getFilesystemAdapter() : FilesystemAdapterInterface |
||
| 220 | |||
| 221 | 3 | /** |
|
| 222 | * Loads the files from the source directory and return's them sorted. |
||
| 223 | * |
||
| 224 | * @param string $serial The unique identifier of the actual import process |
||
| 225 | * |
||
| 226 | * @return array The array with the files matching the subjects suffix |
||
| 227 | * @throws \Exception Is thrown, when the source directory is NOT available |
||
| 228 | */ |
||
| 229 | public function loadFiles(string $serial) : array |
||
| 239 | } |
||
| 240 |
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.