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 |
||
29 | class ServerCommandHandler |
||
30 | { |
||
31 | /** |
||
32 | * @var ServerManager |
||
33 | */ |
||
34 | private $serverManager; |
||
35 | |||
36 | 12 | public function __construct(ServerManager $serverManager) |
|
40 | |||
41 | 2 | public function handleList(Args $args, IO $io) |
|
|
|||
42 | { |
||
43 | 2 | $table = new Table(PuliTableStyle::borderless()); |
|
44 | 2 | $servers = $this->serverManager->getServers(); |
|
45 | |||
46 | 2 | if ($servers->isEmpty()) { |
|
47 | 1 | $io->writeLine('No servers. Use "puli server --add <name> <document-root>" to add a server.'); |
|
48 | |||
49 | 1 | return 0; |
|
50 | } |
||
51 | |||
52 | 1 | $table->setHeaderRow(array( |
|
53 | 1 | 'Server Name', |
|
54 | 'Installer', |
||
55 | 'Location', |
||
56 | 'URL Format', |
||
57 | )); |
||
58 | |||
59 | 1 | foreach ($servers as $server) { |
|
60 | 1 | $table->addRow(array( |
|
61 | 1 | '<u>'.$server->getName().'</u>', |
|
62 | 1 | $server->getInstallerName(), |
|
63 | 1 | '<c2>'.$server->getDocumentRoot().'</c2>', |
|
64 | 1 | '<c1>'.$server->getUrlFormat().'</c1>', |
|
65 | )); |
||
66 | } |
||
67 | |||
68 | 1 | $table->render($io); |
|
69 | |||
70 | 1 | return 0; |
|
71 | } |
||
72 | |||
73 | 5 | public function handleAdd(Args $args) |
|
74 | { |
||
75 | 5 | $parameters = array(); |
|
76 | |||
77 | 5 | $this->parseParams($args, $parameters); |
|
78 | |||
79 | 4 | $this->serverManager->addServer(new Server( |
|
80 | 4 | $args->getArgument('name'), |
|
81 | 4 | $args->getOption('installer'), |
|
82 | 4 | $args->getArgument('document-root'), |
|
83 | 4 | $args->getOption('url-format'), |
|
84 | $parameters |
||
85 | )); |
||
86 | |||
87 | 4 | return 0; |
|
88 | } |
||
89 | |||
90 | 3 | public function handleUpdate(Args $args) |
|
91 | { |
||
92 | 3 | $serverName = $args->getArgument('name'); |
|
93 | |||
94 | 3 | if (!$this->serverManager->hasServer($serverName)) { |
|
95 | throw NoSuchServerException::forServerName($serverName); |
||
96 | } |
||
97 | |||
98 | 3 | $serverToUpdate = $this->serverManager->getServer($serverName); |
|
99 | |||
100 | 3 | $installerName = $serverToUpdate->getInstallerName(); |
|
101 | 3 | $documentRoot = $serverToUpdate->getDocumentRoot(); |
|
102 | 3 | $urlFormat = $serverToUpdate->getUrlFormat(); |
|
103 | 3 | $parameters = $serverToUpdate->getParameterValues(); |
|
104 | |||
105 | 3 | if ($args->isOptionSet('installer')) { |
|
106 | 1 | $installerName = $args->getOption('installer'); |
|
107 | } |
||
108 | |||
109 | 3 | if ($args->isOptionSet('document-root')) { |
|
110 | 1 | $documentRoot = $args->getOption('document-root'); |
|
111 | } |
||
112 | |||
113 | 3 | if ($args->isOptionSet('url-format')) { |
|
114 | 1 | $urlFormat = $args->getOption('url-format'); |
|
115 | } |
||
116 | |||
117 | 3 | $this->parseParams($args, $parameters); |
|
118 | 3 | $this->unsetParams($args, $parameters); |
|
119 | |||
120 | 3 | $updatedServer = new Server($serverName, $installerName, $documentRoot, $urlFormat, $parameters); |
|
121 | |||
122 | 3 | if ($this->serversEqual($serverToUpdate, $updatedServer)) { |
|
123 | 1 | throw new RuntimeException('Nothing to update.'); |
|
124 | } |
||
125 | |||
126 | 2 | $this->serverManager->addServer($updatedServer); |
|
127 | |||
128 | 2 | return 0; |
|
129 | } |
||
130 | |||
131 | 2 | public function handleDelete(Args $args) |
|
143 | |||
144 | 8 | View Code Duplication | private function parseParams(Args $args, array &$parameters) |
145 | { |
||
146 | 8 | foreach ($args->getOption('param') as $parameter) { |
|
147 | 3 | $pos = strpos($parameter, '='); |
|
148 | |||
149 | 3 | if (false === $pos) { |
|
150 | 1 | throw new RuntimeException(sprintf( |
|
151 | 1 | 'Invalid parameter "%s". Expected "<name>=<value>".', |
|
152 | $parameter |
||
153 | )); |
||
154 | } |
||
155 | |||
156 | 2 | $parameters[substr($parameter, 0, $pos)] = StringUtil::parseValue(substr($parameter, $pos + 1)); |
|
157 | } |
||
158 | 7 | } |
|
159 | |||
160 | 3 | private function unsetParams(Args $args, array &$parameters) |
|
161 | { |
||
162 | 3 | foreach ($args->getOption('unset-param') as $parameter) { |
|
163 | 1 | unset($parameters[$parameter]); |
|
164 | } |
||
165 | 3 | } |
|
166 | |||
167 | 3 | private function serversEqual(Server $server1, Server $server2) |
|
193 | } |
||
194 |
This check looks from parameters that have been defined for a function or method, but which are not used in the method body.