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 |
||
14 | class FilesystemLoader |
||
15 | { |
||
16 | /** Identifier of the main namespace. */ |
||
17 | const MAIN_NAMESPACE = '__main__'; |
||
18 | |||
19 | protected $locator; |
||
20 | protected $parser; |
||
21 | |||
22 | protected $paths = []; |
||
23 | protected $cache = []; |
||
24 | protected $errorCache = []; |
||
25 | |||
26 | /** |
||
27 | * FilesystemLoader constructor. |
||
28 | * @param FileLocatorInterface $locator |
||
29 | * @param TemplateNameParserInterface $parser |
||
30 | */ |
||
31 | 23 | public function __construct(FileLocatorInterface $locator, TemplateNameParserInterface $parser) |
|
37 | |||
38 | /** |
||
39 | * Returns the paths to the templates. |
||
40 | * |
||
41 | * @param string $namespace A path namespace |
||
42 | * |
||
43 | * @return array The array of paths where to look for templates |
||
44 | */ |
||
45 | 7 | public function getPaths($namespace = self::MAIN_NAMESPACE) |
|
49 | |||
50 | /** |
||
51 | * Returns the path namespaces. |
||
52 | * |
||
53 | * The main namespace is always defined. |
||
54 | * |
||
55 | * @return array The array of defined namespaces |
||
56 | */ |
||
57 | 1 | public function getNamespaces() |
|
61 | |||
62 | /** |
||
63 | * Sets the paths where templates are stored. |
||
64 | * |
||
65 | * @param string|array $paths A path or an array of paths where to look for templates |
||
66 | * @param string $namespace A path namespace |
||
67 | */ |
||
68 | 23 | public function setPaths($paths, $namespace = self::MAIN_NAMESPACE) |
|
79 | |||
80 | /** |
||
81 | * Adds a path where templates are stored. |
||
82 | * |
||
83 | * @param string $path A path where to look for templates |
||
84 | * @param string $namespace A path name |
||
85 | * |
||
86 | * @throws LoaderException |
||
87 | */ |
||
88 | 18 | public function addPath($path, $namespace = self::MAIN_NAMESPACE) |
|
99 | |||
100 | /** |
||
101 | * Prepends a path where templates are stored. |
||
102 | * |
||
103 | * @param string $path A path where to look for templates |
||
104 | * @param string $namespace A path name |
||
105 | * |
||
106 | * @throws LoaderException |
||
107 | */ |
||
108 | 3 | public function prependPath($path, $namespace = self::MAIN_NAMESPACE) |
|
109 | { |
||
110 | // invalidate the cache |
||
111 | 3 | $this->cache = $this->errorCache = []; |
|
112 | |||
113 | 3 | if (!is_dir($path)) { |
|
114 | 1 | throw new LoaderException(sprintf('The "%s" directory does not exist.', $path)); |
|
115 | } |
||
116 | |||
117 | 2 | $path = rtrim($path, '/\\'); |
|
118 | |||
119 | 2 | View Code Duplication | if (!isset($this->paths[$namespace])) { |
|
|||
120 | 1 | $this->paths[$namespace][] = $path; |
|
121 | } else { |
||
122 | 1 | array_unshift($this->paths[$namespace], $path); |
|
123 | } |
||
124 | 2 | } |
|
125 | |||
126 | /** |
||
127 | * {@inheritdoc} |
||
128 | */ |
||
129 | 5 | public function getSource($name) |
|
133 | |||
134 | /** |
||
135 | * {@inheritdoc} |
||
136 | */ |
||
137 | 2 | public function getCacheKey($name) |
|
141 | |||
142 | /** |
||
143 | * {@inheritdoc} |
||
144 | */ |
||
145 | 6 | public function exists($template) |
|
159 | |||
160 | 12 | protected function parseName($name, $default = self::MAIN_NAMESPACE) |
|
175 | |||
176 | 12 | protected function normalizeName($name) |
|
180 | |||
181 | 12 | protected function findTemplate($template, $throw = true) |
|
219 | |||
220 | 10 | private function validateTemplate($name, $namespace) |
|
234 | |||
235 | 8 | private function locateTemplate($template, $name, $namespace) |
|
251 | } |
||
252 |
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.