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.