refactoring sem complicação!

50
Refactorin g "Mudar o código sem mudar o comportamento” - Martin Fowler phpConferece 2015

Upload: thamara-hessel

Post on 09-Jan-2017

588 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Refactoring sem complicação!

Refactoring "Mudar o código sem mudar o comportamento”

- Martin Fowler

phpConferece 2015

Page 2: Refactoring sem complicação!

Refactoring "Mudar o código sem mudar

o comportamento”- Martin Fowler

phpConferece 2015

Negação

Page 3: Refactoring sem complicação!

Refactoring

Negação

phpConferece 2015

O que não é refactoring

● Otimização e performance, não é refatoração.

● Intensificar o tratamento de erros e adicionar um defensive code, não é refatoração.

● Corrigir bugs encontrados pelo caminho,não é refatoração.

● Tornar o código mais testavel, não é refatoração.

Embora que em uma refatoração tudo isso possaacontecer, Todas essas coisas não é refatoração

propriamente dita.

Page 4: Refactoring sem complicação!

Refactoring

Motivação

phpConferece 2015

Código é difícil de entender

Page 5: Refactoring sem complicação!

Refactoring

Motivação

phpConferece 2015

Backlog de bugs crescente

e bugs que voltam

Page 6: Refactoring sem complicação!

Refactoring

Motivação

phpConferece 2015

Precisa sempre de mais tempo

Sair tarde já virou rotina

Page 7: Refactoring sem complicação!

Refactoring

Análise

phpConferece 2015

E agora ?

Page 8: Refactoring sem complicação!

Refactoring

Análise

phpConferece 2015

Identifique os problemas

Você não decide refatorar, você refatora porque é uma forma de tornar o seu código fácil de conviver.

Page 9: Refactoring sem complicação!

Refactoring

DICA

phpConferece 2015

Page 10: Refactoring sem complicação!

Refactoring

Ferramentas

phpConferece 2015

??????????????????????????????

Page 11: Refactoring sem complicação!

Refactoring

Ferramentas

phpConferece 2015

● phpcpd - copy/paste detector● phpmd - mess detector● phpcs - code sniffer● phpd - depend● phpMetrics● phploc ● phpunit ● behat Sebastian Bergmann

Ferramentas

Page 12: Refactoring sem complicação!

Refactoring

Ferramentas

phpConferece 2015

● phpd - depend● phpMetrics● phploc ● phpunit

Métrica e evolução

Page 13: Refactoring sem complicação!

Refactoring

Ferramentas

phpConferece 2015

Desenvolvimento continuo

● phpcpd - copy/paste detector● phpmd - mess detector● phpcs - code sniffer● phpunit ● behat

Page 14: Refactoring sem complicação!

Refactoring

Show me the code

phpConferece 2015

Page 15: Refactoring sem complicação!

Refactoring

Show me the code

phpConferece 2015

147 public function pesquisar() { 148 if ($this->input->post("servico")) { 149 $pesquisado = $this->input->post("servico"); 150 $buscas = str_getcsv($pesquisado, ","); 151 $servicos = array(); 152 $palavras = array(); 153 $tipos = array(); 154 $titulos = array(); 155 $categorias = array(); 156 $subcategorias = array(); 157 $locais = array(); 158 $areas= array(); 159 $resultadoTitulos = array(); 160 $resultadoTipos = array(); 161 $resultadoPalavras = array(); 162 $resultadoLocal = array(); 163 $resultadoArea = array(); 164 $idCategoria = array(); 165 $idSubcategoria = array(); 166 $idServico = array(); 167 $idCurso = ""; 168 $idLocal = array(); 169 $resultado = Array();

Page 16: Refactoring sem complicação!

Refactoring

Show me the code

phpConferece 2015

171 foreach ($buscas as $id => $busca) { 172 $local = $this->Localidades_model->busquePorAlgoComo("local", trim($busca)); 173 $area = $this->Localidades_model->busquePorAlgoComo("area", trim($busca)); 174 175 $tipo = $this->Servicos_model->busquePorAlgoComo("tipo", trim($busca)); 176 $titulo = $this->Servicos_model->busquePorAlgoComo("titulo", trim($busca)); 177 $palavra = $this->Servicos_model->busquePorAlgoComo("palavras", trim($busca)); 178 179 $categoria = $this->Categorias_model->busquePorAlgoComo("nome", trim($busca)); 180 $subcategoria = $this->Subcategorias_model->busquePorAlgoComo("nome", trim($busca)); 181 182 $servico = $this->Servicos_model->busquePorAlgoComo("descricao", trim($busca)); 183 184 if ($categoria) 185 array_push($categorias, $categoria); 186 187 if ($subcategoria) 188 array_push($subcategorias, $subcategoria); 189 190 if ($local) 191 array_push($locais, $local); 192 193 if ($area) 194 array_push($areas, $area);

Page 17: Refactoring sem complicação!

Refactoring

Show me the code

phpConferece 2015

195 196 if ($servico) 197 array_push($servicos, $servico); 198 199 if ($tipo) 200 array_push($tipos, $tipo); 201 202 if ($titulo) 203 array_push($titulos, $titulo); 204 205 if ($palavra) 206 array_push($palavras, $palavra); 207 } 208 209 if ($locais) { 210 foreach ($locais[0] as $id => $local) { 211 array_push($resultadoLocal, $local["id"]); 212 } 213 } 214 215 if ($areas) { 216 foreach ($areas[0] as $id => $area) { 217 array_push($resultadoArea, $area["id"]); 218 } 219 }

Page 18: Refactoring sem complicação!

Refactoring

Show me the code

phpConferece 2015

220 221 if ($tipos) { 222 foreach ($tipos[0] as $id => $tipo) { 223 array_push($resultadoTipos, $tipo["id"]); 224 } 225 } 226 227 if ($palavras) { 228 foreach ($palavras[0] as $id => $palavra) { 229 array_push($resultadoPalavras, $palavra["id"]); 230 } 231 } 232 233 if ($titulos) { 234 foreach ($titulos[0] as $id => $titulo) { 235 array_push($resultadoTitulos, $titulo["id"]); 236 } 237 } 238 239 240 if ($categorias) { 241 foreach ($categorias[0] as $id => $categoria) { 242 array_push($idCategoria, $categoria["id"]); 243 }

Page 19: Refactoring sem complicação!

Refactoring

Show me the code

phpConferece 2015

244 foreach ($idCategoria as $id => $idC) { 245 $servicoC = $this->Servicos_model->busquePor("idCategoria", $idC); 246 foreach ($servicoC as $id => $idS) { 247 array_push($idServico, $idS["id"]); 248 } 249 } 250 } 251 252 253 if ($subcategorias) { 254 foreach ($subcategorias[0] as $id => $subcategoria) { 255 array_push($idSubcategoria, $subcategoria["id"]); 256 } 257 foreach ($idSubcategoria as $id => $idS) { 258 $servicoS = $this->Servicos_model->busquePor("idSubcategoria", $idS); 259 260 foreach ($servicoS as $id => $idS) { 261 array_push($idServico, $idS["id"]); 262 } 263 } 264 } 265 266 if ($servicos) { 267 foreach ($servicos[0] as $id => $servico) { 268 array_push($idServico, $servico["id"]); 269 } 270 }

Page 20: Refactoring sem complicação!

Refactoring

Show me the code

phpConferece 2015

271 272 273 if (!empty($resultadoArea) && !empty($resultadoLocal)) { 274 $idLocal = array_intersect($resultadoLocal, $resultadoArea); 275 } else { 276 277 if ($resultadoLocal) 278 $idLocal = $resultadoLocal; 279 280 if ($resultadoArea) 281 $idLocal = $resultadoArea; 282 } 283 284 285 if ($idLocal) { 286 foreach ($idLocal as $id => $idS) { 287 $servicoS = $this->Servicos_model->busquePor("idLocal", $idS); 288 foreach ($servicoS as $id => $idS) { 289 array_push($idServico, $idS["id"]); 290 } 291 } 292 } 293

Page 21: Refactoring sem complicação!

Refactoring

Show me the code

phpConferece 2015

294 295 if (!empty($resultadoPalavras) && !empty($resultadoTitulos) && !empty($resultadoTipos)) { 296 $idCurso = array_intersect($resultadoPalavras, $resultadoTitulos); 297 $idCurso = array_intersect($idCurso, $resultadoTipos); 298 } else { 299 300 if ($resultadoPalavras) 301 $idCurso = $resultadoPalavras; 302 303 if ($resultadoTitulos) 304 $idCurso = $resultadoTitulos; 305 306 if ($resultadoTipos) 307 $idCurso = $resultadoTipos; 308 } 309 310 311 if ($idCurso) { 312 foreach ($idCurso as $idC) { 313 array_push($idServico, $idC); 314 } 315 } 316 317

Page 22: Refactoring sem complicação!

Refactoring

Show me the code

phpConferece 2015

318 $idServico = array_unique($idServico); 319 320 foreach ($idServico as $id => $idS) { 321 $servicoS = $this->Servicos_model->busquePor("id", $idS); 322 array_push($resultado, $servicoS[0]); 323 } 324 325 foreach ($resultado as $id => $servico) { 326 327 $categoria = $this->Categorias_model->busquePor("id", $servico["idCategoria"]); 328 $subcategoria = $this->Subcategorias_model->busquePor("id", $servico["idSubcategoria"]); 329 $local = $this->Localidades_model->busquePor("id", $servico["idLocal"]); 330 $instituicao = $this->Instituicao_model->busquePor("id", $servico["idInstituicao"]); 331 332 $resultado[$id]["idInstituicao"] = $instituicao[0]; 333 $resultado[$id]["idCategoria"] = $categoria[0]; 334 $resultado[$id]["idSubcategoria"] = $subcategoria[0]; 335 $resultado[$id]["idLocal"] = $local[0]; 336 } 337 $data["pesquisado"] = $pesquisado; 338 $data["total"] = count($resultado); 339 $data["servicos"] = $resultado; 340 $this->load->view('servicos/resultado', $data); 341 } else { 342 $this->load->view('servicos/pesquisar'); 343 } 344 // die(var_dump($data)); 345 }

FIM!

Page 23: Refactoring sem complicação!

Refactoring

PHPD

phpConferece 2015

PHPD - Depend

É um analisador de código que gera um grande conjunto de métricas, estas ajudam a identificar as partes de uma aplicação onde uma refatoração de código deve ser aplicada.

$ composer require "pdepend/pdepend:*"

Page 24: Refactoring sem complicação!

Refactoring

PHPD

phpConferece 2015

PHPD - Depend

http://www.objectmentor.com/resources/articles/oodmetrc.pdf

Page 25: Refactoring sem complicação!

Refactoring

PHPLOC

phpConferece 2015

PHPLOC

É um rápido medidor do tamanho e da estrutura de um projeto

$ composer require "phploc/phploc:*"

Page 26: Refactoring sem complicação!

Refactoring

PHPMetrics

phpConferece 2015

PHPMetricsFornece diversas métricas sobre projetos.

$ composer require "halleck45/phpmetrics:*"

http://www.phpmetrics.org/documentation/how-to-read-report.html#report-abstractness

Page 27: Refactoring sem complicação!

Refactoring

PHPUnit

phpConferece 2015

PHPUnitÉ um framework open source para testes automatizados

$ composer require "phpunit/phpunit:*"

$ ./vendor/bin/phpunit application/testsPHPUnit 4.8.18 by Sebastian Bergmann and contributors.

........................................................................................ (90 / 471)

........................................................................................ (180 / 471)

........................................................................................ (270 / 471)

........................................................................................ (360 / 471)

........................................................................................ (450 / 471)

................... (471 / 471)

Time: 433 ms, Memory: 5.25Mb

OK (471 tests, 692 assertions)

Page 28: Refactoring sem complicação!

Refactoring

PHPUnit

phpConferece 2015

PHPUnit

https://phpunit.de/manual/current/pt_br/code-coverage-analysis.html

Page 29: Refactoring sem complicação!

Refactoring

PHPUnit

phpConferece 2015

PHPUnit

Usado a qualquer parte da vida de um projeto

● Testes para projeto existente sem testes● Testes para projeto novo Uhuuu \o/● Testes para projeto existente com testes

Page 30: Refactoring sem complicação!

Refactoring

DICA

phpConferece 2015

Page 31: Refactoring sem complicação!

Refactoring

PHPCS

phpConferece 2015

PHPCS - Code Sniffer

Detecta violações de padrão. é uma ferramenta essencial de desenvolvimento que garante que o seu código permanece limpo e consistente

$ composer require "squizlabs/php_codesniffer:*"

Page 32: Refactoring sem complicação!

Refactoring

PHPCS

phpConferece 2015

PSR-2: Guia de Estilo de Codificação

http://www.php-fig.org/psr/psr-2/pt-br/

PHPCS - Code Sniffer

Page 33: Refactoring sem complicação!

Refactoring

PHPCS

phpConferece 2015

$ ./vendor/bin/phpcs ./application/controllers/servicos.php

FILE: ...ar/www/phpconference/before/application/controllers/servicos.php----------------------------------------------------------------------FOUND 29 ERRORS AND 50 WARNINGS AFFECTING 65 LINES——————————————————————————————————— 139 | ERROR | [x] Opening brace should be on a new line 164 | WARNING | [ ] Line exceeds 85 characters; contains 92 characters 165 | WARNING | [ ] Line exceeds 85 characters; contains 90 characters 167 | WARNING | [ ] Line exceeds 85 characters; contains 87 characters 168 | WARNING | [ ] Line exceeds 85 characters; contains 91 characters 169 | WARNING | [ ] Line exceeds 85 characters; contains 94 characters 171 | WARNING | [ ] Line exceeds 85 characters; contains 94 characters 172 | WARNING | [ ] Line exceeds 85 characters; contains 100 characters 174 | WARNING | [ ] Line exceeds 85 characters; contains 95 characters 176 | WARNING | [x] Inline control structures are discouraged 179 | WARNING | [x] Inline control structures are discouraged 182 | WARNING | [x] Inline control structures are discouraged 185 | WARNING | [x] Inline control structures are discouraged 188 | WARNING | [x] Inline control structures are discouraged

Page 34: Refactoring sem complicação!

Refactoring

PHPCS

phpConferece 2015

191 | WARNING | [x] Inline control structures are discouraged 194 | WARNING | [x] Inline control structures are discouraged 197 | WARNING | [x] Inline control structures are discouraged 237 | WARNING | [ ] Line exceeds 85 characters; contains 86 characters 250 | WARNING | [ ] Line exceeds 85 characters; contains 89 characters 269 | WARNING | [x] Inline control structures are discouraged 272 | WARNING | [x] Inline control structures are discouraged 287 | WARNING | [ ] Line exceeds 85 characters; contains 101 characters 292 | WARNING | [x] Inline control structures are discouraged 295 | WARNING | [x] Inline control structures are discouraged 298 | WARNING | [x] Inline control structures are discouraged 319 | WARNING | [ ] Line exceeds 85 characters; contains 95 characters 320 | WARNING | [ ] Line exceeds 85 characters; contains 104 characters 321 | WARNING | [ ] Line exceeds 85 characters; contains 88 characters 322 | WARNING | [ ] Line exceeds 85 characters; contains 100 characters 336 | ERROR | [x] Line indented incorrectly; expected at least 8 spaces, found 0----------------------------------------------------------------------PHPCBF CAN FIX THE 28 MARKED SNIFF VIOLATIONS AUTOMATICALLY----------------------------------------------------------------------

Page 35: Refactoring sem complicação!

Refactoring

PHPCBF

phpConferece 2015

$ ./vendor/bin/phpcbf ./application/controllers/servicos.php

Changing into directory /var/www/phpconference/after/application/controllersProcessing servicos.php [PHP => 4070 tokens in 401 lines]... DONE in 248ms (28 fixable violations) => Fixing file: 0/28 violations remaining [made 4 passes]... DONE in 1.04 secsPatched 1 fileTime: 1.39 secs; Memory: 15.75Mb

173 | WARNING | Line exceeds 85 characters; contains 88 characters 174 | WARNING | Line exceeds 85 characters; contains 86 characters 177 | WARNING | Line exceeds 85 characters; contains 87 characters 178 | WARNING | Line exceeds 85 characters; contains 90 characters 180 | WARNING | Line exceeds 85 characters; contains 90 characters 181 | WARNING | Line exceeds 85 characters; contains 96 characters 183 | WARNING | Line exceeds 85 characters; contains 91 characters 306 | WARNING | Line exceeds 85 characters; contains 97 characters 340 | WARNING | Line exceeds 85 characters; contains 91 characters 341 | WARNING | Line exceeds 85 characters; contains 100 characters 343 | WARNING | Line exceeds 85 characters; contains 96 characters

Page 36: Refactoring sem complicação!

Refactoring

PHPCPD

phpConferece 2015

PHPCPD - Copy/Paste Detector

É um Copy / Paste Detector (CPD) para código PHP. Faz uma varredura em busca de código duplicado.

$ composer require "sebastian/phpcpd:*"

$ ./vendor/bin/phpcpd --min-lines=3 ./application/controllers/servicos.phpphpcpd 2.0.2 by Sebastian Bergmann.

Found 1 exact clones with 15 duplicated lines in 1 files:

- /var/www/phpconference/before/application/controllers/servicos.php:22-36 /var/www/phpconference/before/application/controllers/servicos.php:101-116

3.67% duplicated lines out of 409 total lines of code.

Time: 135 ms, Memory: 6.50Mb

Page 37: Refactoring sem complicação!

Refactoring

PHPCPD

phpConferece 2015

22 foreach ($servicos as $id => $servico) { 23 24 $categoria = $this->Categorias_model->busquePor("id", $servico["idCategoria"]); 25 $subcategoria = $this->Subcategorias_model->busquePor("id", $servico["idSubcategoria"]); 26 $local = $this->Localidades_model->busquePor("id", $servico["idLocal"]); 27 $instituicao = $this->Instituicao_model->busquePor("id", $servico["idInstituicao"]); 28 29 $servicos[$id]["idInstituicao"] = $instituicao[0]; 30 $servicos[$id]["idCategoria"] = $categoria[0]; 31 $servicos[$id]["idSubcategoria"] = $subcategoria[0]; 32 $servicos[$id]["idLocal"] = $local[0]; 33 } 34 35 $data["servicos"] = $servicos; 36 $this->template->load('template', "servicos/{$usuario->perfil}/listar", $data);

$ ./vendor/bin/phpcpd --min-lines=3 ./application/controllers/servicos.phpphpcpd 2.0.2 by Sebastian Bergmann.

0.00% duplicated lines out of 407 total lines of code.

Time: 111 ms, Memory: 6.25Mb

PHPCPD - Copy/Paste Detector

Encapsule o código duplicado em método com nome apropriado.

Page 38: Refactoring sem complicação!

Refactoring

PHPMD

phpConferece 2015

PHPMD - Mess Detector

Busca por problemas em potencial, podem ser coisas como : ● Possíveis erros;● Código suboptimal;● Expressões complicadas;● Parâmetros , métodos ou propriedades

não utilizados;

$ composer require "phpmd/phpmd:*"

Page 39: Refactoring sem complicação!

Refactoring

PHPMD

phpConferece 2015

$ ./vendor/bin/phpmd ./application/controllers/servicos.php text codesize,unusedcode,naming,cleancode,design,controversial

.servicos.php:139The method pesquisar() has a Cyclomatic Complexity of 48.The configured cyclomatic complexity threshold is 10..servicos.php:139The method pesquisar() has an NPath complexity of 29083180897. The configured NPath complexity threshold is 200..servicos.php:139The method pesquisar() has 199 lines of code. Current threshold is set to 100. Avoid really long methods..servicos.php:267The method pesquisar uses an else expression. Else is never necessary and you can simplify the code to work without else..servicos.php:290The method pesquisar uses an else expression. Else is never necessary and you can simplify the code to work without else..servicos.php:333The method pesquisar uses an else expression. Else is never necessary and you can simplify the code to work without else

Page 40: Refactoring sem complicação!

Refactoring

phpConferece 2015

PHPMD

Else is never necessary

147 public function pesquisar() { 148 if ($this->input->post("servico")) { …

193 linhas depois

341 } else { 342 $this->load->view('servicos/resultado', $data);343 }

344 //die(var_dump($data); 345 }

Page 41: Refactoring sem complicação!

Refactoring

phpConferece 2015

PHPMD

Else is never necessary

147 public function pesquisar() { 148 if ( ! $this->input->post("servico")) {149 $this->load->view('servicos/resultado', $data);150 } 193 linhas depois345 }

Page 42: Refactoring sem complicação!

Refactoring

phpConferece 2015

PHPMD

Cyclomatic Complexity NPath complexity of 29083180897

172 foreach($buscas as $id => $busca) { 44 linhas depois216 }

219 foreach($locais[0] as $id => $local) {220 array_push($resultadoLocal, $local[“id”])221 }

6253 foreach($idCategoria as $id => $idC) {254 $servicoC = $this->Servicos_modell->busquePor("idCategoria", $idC); 255 foreach ($servicoC as $id => $idS) { 256 array_push($idServico, $idS["id"]); 257 } 258 }256 }

2

Page 43: Refactoring sem complicação!

Refactoring

phpConferece 2015

PHPMD

Cyclomatic Complexity NPath complexity of 29083180897

18

foreach($x as $i => $y) { … }

Page 44: Refactoring sem complicação!

Refactoring

Ferramentas

phpConferece 2015

Page 45: Refactoring sem complicação!

Refactoring

Antes

phpConferece 2015

147 public function pesquisar() { 148 if ($this->input->post("servico")) { 149 $pesquisado = $this->input->post("servico"); 150 $buscas = str_getcsv($pesquisado, ","); 151 $servicos = array(); 152 $palavras = array(); 153 $tipos = array(); 154 $titulos = array(); 155 $categorias = array(); 156 $subcategorias = array(); 157 $locais = array(); 158 $areas= array(); 159 $resultadoTitulos = array(); 160 $resultadoTipos = array(); 161 $resultadoPalavras = array(); 162 $resultadoLocal = array(); 163 $resultadoArea = array(); 164 $idCategoria = array(); 165 $idSubcategoria = array(); 166 $idServico = array(); 167 $idCurso = ""; 168 $idLocal = array(); 169 $resultado = Array(); 170 171 foreach ($buscas as $id => $busca) { 172 $local = $this->Localidades_model->busquePorAlgoComo("local", trim($busca)); 173 $area = $this->Localidades_model->busquePorAlgoComo("area", trim($busca)); 174 175 $tipo = $this->Servicos_model->busquePorAlgoComo("tipo", trim($busca)); 176 $titulo = $this->Servicos_model->busquePorAlgoComo("titulo", trim($busca)); 177 $palavra = $this->Servicos_model->busquePorAlgoComo("palavras", trim($busca)); 178 179 $categoria = $this->Categorias_model->busquePorAlgoComo("nome", trim($busca)); 180 $subcategoria = $this->Subcategorias_model->busquePorAlgoComo("nome", trim($busca)); 181 182 $servico = $this->Servicos_model->busquePorAlgoComo("descricao", trim($busca)); 183 184 if ($categoria) 185 array_push($categorias, $categoria); 186 187 if ($subcategoria) 188 array_push($subcategorias, $subcategoria); 189 190 if ($local) 191

280 if ($resultadoArea) 281 $idLocal = $resultadoArea; 282 } 283 284 285 if ($idLocal) { 286 foreach ($idLocal as $id => $idS) { 287 $servicoS = $this->Servicos_model->busquePor("idLocal", $idS); 288 foreach ($servicoS as $id => $idS) { 289 array_push($idServico, $idS["id"]); 290 } 291 } 292 } 293 294 295 if (!empty($resultadoPalavras) && !empty($resultadoTitulos) && !empty($resultadoTipos)) { 296 $idCurso = array_intersect($resultadoPalavras, $resultadoTitulos); 297 $idCurso = array_intersect($idCurso, $resultadoTipos); 298 } else { 299 300 if ($resultadoPalavras) 301 $idCurso = $resultadoPalavras; 302 303 if ($resultadoTitulos) 304 $idCurso = $resultadoTitulos; 305 306 if ($resultadoTipos) 307 $idCurso = $resultadoTipos; 308 } 309 310 311 if ($idCurso) { 312 foreach ($idCurso as $idC) { 313 array_push($idServico, $idC); 314 } 315 } 316 317 }

318 $idServico = array_unique($idServico); 319 320 foreach ($idServico as $id => $idS) { 321 $servicoS = $this->Servicos_model->busquePor("id", $idS); 322 array_push($resultado, $servicoS[0]); 323 } 324 325 foreach ($resultado as $id => $servico) { 326 327 $categoria = $this->Categorias_model->busquePor("id", $servico["idCategoria"]); 328 $subcategoria = $this->Subcategorias_model->busquePor("id", $servico["idSubcategoria"]); 329 $local = $this->Localidades_model->busquePor("id", $servico["idLocal"]); 330 $instituicao = $this->Instituicao_model->busquePor("id", $servico["idInstituicao"]); 331 332 $resultado[$id]["idInstituicao"] = $instituicao[0]; 333 $resultado[$id]["idCategoria"] = $categoria[0]; 334 $resultado[$id]["idSubcategoria"] = $subcategoria[0]; 335 $resultado[$id]["idLocal"] = $local[0]; 336 } 337 $data["pesquisado"] = $pesquisado; 338 $data["total"] = count($resultado); 339 $data["servicos"] = $resultado; 340 $this->load->view('servicos/resultado', $data); 341 } else { 342 $this->load->view('servicos/pesquisar'); 343 } 344 // die(); 345

318 $idServico = array_unique($idServico); 319 320 foreach ($idServico as $id => $idS) { 321 $servicoS = $this->Servicos_model->busquePor("id", $idS); 322 array_push($resultado, $servicoS[0]); 323 } 324 325 foreach ($resultado as $id => $servico) { 326 327 $categoria = $this->Categorias_model->busquePor("id", $servico["idCategoria"]); 328 $subcategoria = $this->Subcategorias_model->busquePor("id", $servico["idSubcategoria"]);

318 $idServico = array_unique($idServico); 319 320 foreach ($idServico as $id => $idS) { 321 $servicoS = $this->Servicos_model->busquePor("id", $idS); 322 array_push($resultado, $servicoS[0]); 323 } 324 325 foreach ($resultado as $id => $servico) { 326 327 $categoria = $this->Categorias_model->busquePor("id", $servico["idCategoria"]); 328 $subcategoria = $this->Subcategorias_model->busquePor("id", $servico["idSubcategoria"]); 329 $local = $this->Localidades_model->busquePor("id", $servico["idLocal"]); 330 $instituicao = $this->Instituicao_model->busquePor("id", $servico["idInstituicao"]); 331 332 $resultado[$id]["idInstituicao"] = $instituicao[0]; 333 $resultado[$id]["idCategoria"] = $categoria[0]; 334 $resultado[$id]["idSubcategoria"] = $subcategoria[0]; 335 $resultado[$id]["idLocal"] = $local[0];

Page 46: Refactoring sem complicação!

Refactoring

Depois

phpConferece 2015

144 public function pesquisar() 145 { 146 if (!$this->input->post("servico")) { 147 $this->load->view('servicos/pesquisar'); 148 } 149 150 $pesquisado = $this->input->post("servico"); 151 $buscas = str_getcsv($pesquisado, ","); 152 153 $locais = $this->Localidades_model->busqueLocaisPorPalavraChave($buscas); 154 $servicos = $this->Servicos_model->busqueServicosPorPalavraChave($buscas); 155 $categorias = $this->Categorias_model->busqueCategoriasPorPalavraChave($buscas); 156 $subcategorias = $this->Subcategorias_model->busqueSubategoriasPorPalavraChave($buscas); 157 158 $servicosEncontrados = $this->Servicos_model->arranjeServicosEncontrados( 159 $locais, 160 $servicos, 161 $categorias, 162 $subcategorias 163 ); 164 165 $servicos = $this->Instituicao_model->asssocieInstituicoesServicos($servicosEncontrados); 166 167 $resultado["pesquisado"] = $pesquisado; 168 $resultado["total"] = count($servicos); 169 $resultado["servicos"] = $servicos; 170 $this->load->view('servicos/resultado', $resultado); 171 }

Page 47: Refactoring sem complicação!

Refactoring

Depois

phpConferece 2015

144 public function pesquisar() 145 { 146 if (!$this->input->post("servico")) { 147 $this->load->view('servicos/pesquisar'); 148 } 149 150 $pesquisado = $this->input->post("servico"); 151 $buscas = str_getcsv($pesquisado, ","); 152 153 $locais = $this->Localidades_model->busqueLocaisPorPalavraChave($buscas); 154 $servicos = $this->Servicos_model->busqueServicosPorPalavraChave($buscas); 155 $categorias = $this->Categorias_model->busqueCategoriasPorPalavraChave($buscas); 156 $subcategorias = $this->Subcategorias_model->busqueSubategoriasPorPalavraChave($buscas); 157 158 $servicosEncontrados = $this->Servicos_model->arranjeServicosEncontrados( 159 $locais, 160 $servicos, 161 $categorias, 162 $subcategorias 163 ); 164 165 $servicos = $this->Instituicao_model->asssocieInstituicoesServicos($servicosEncontrados); 166 167 $resultado["pesquisado"] = $pesquisado; 168 $resultado["total"] = count($servicos); 169 $resultado["servicos"] = $servicos; 170 $this->load->view('servicos/resultado', $resultado); 171 }

Page 48: Refactoring sem complicação!

Refactoring

Conclusão

phpConferece 2015

● Use e abuse das ferramentas disponíveis.● Proteja-se de cometer erros ao fazer testes.● Faça mudanças estruturais em pequenos passos.● Faça em etapas independentes e seguras.

Os padrões e as ferramentas de refatoração modernas tornam arefatoração fácil, segura e barata, aproveite e comece a melhorar seu código já !!!

Refatoração é simples = )

Page 49: Refactoring sem complicação!

Refactoring

Conclusão

phpConferece 2015

Perguntas ?

Page 50: Refactoring sem complicação!

Thamara Hessel

Obrigada =)

[email protected]/ThamaraHesseltw/ThamaraHessel