SlideShare uma empresa Scribd logo
Refactoring "Mudar o código sem mudar o comportamento”
- Martin Fowler
phpConferece 2015
Refactoring "Mudar o código sem mudar o
comportamento”
- Martin Fowler
phpConferece 2015
Negaçã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 possa
acontecer, Todas essas coisas não é refatoração
propriamente dita.
Refactoring
Motivação
phpConferece 2015
Código é difícil de
entender
Refactoring
Motivação
phpConferece 2015
Backlog de bugs crescente
e bugs que voltam
Refactoring
Motivação
phpConferece 2015
Precisa sempre de mais tempo
Sair tarde já virou rotina
Refactoring
Análise
phpConferece 2015
E agora ?
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.
Refactoring
DICA
phpConferece 2015
Refactoring
Ferramentas
phpConferece 2015
??????????????????????????????
Refactoring
Ferramentas
phpConferece 2015
● phpcpd - copy/paste detector
● phpmd - mess detector
● phpcs - code sniffer
● phpd - depend
● phpMetrics
● phploc
● phpunit
● behat Sebastian Bergmann
Ferramentas
Refactoring
Ferramentas
phpConferece 2015
● phpd - depend
● phpMetrics
● phploc
● phpunit
Métrica e evolução
Refactoring
Ferramentas
phpConferece 2015
Desenvolvimento continuo
● phpcpd - copy/paste detector
● phpmd - mess detector
● phpcs - code sniffer
● phpunit
● behat
Refactoring
Show me
the code
phpConferece 2015
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();
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($b
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);
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 }
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 }
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 }
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
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
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["idSubcateg
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));
FIM!
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:*"
Refactoring
PHPD
phpConferece 2015
PHPD - Depend
http://www.objectmentor.com/resources/articles/oodmetrc.pdf
Refactoring
PHPLOC
phpConferece 2015
PHPLOC
É um rápido
medidor
do tamanho e da
estrutura de um
projeto
$ composer require "phploc/phploc:*"
Refactoring
PHPMetrics
phpConferece 2015
PHPMetrics
Fornece diversas métricas sobre
projetos.
$ composer require "halleck45/phpmetrics:*"
http://www.phpmetrics.org/documentation/how-to-read-report.html#report-abstractness
Refactoring
PHPUnit
phpConferece 2015
PHPUnit
É um framework open source para testes automatizados
$ composer require "phpunit/phpunit:*"
$ ./vendor/bin/phpunit application/tests
PHPUnit 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)
Refactoring
PHPUnit
phpConferece 2015
PHPUnit
https://phpunit.de/manual/current/pt_br/code-coverage-analysis.html
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
Refactoring
DICA
phpConferece 2015
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:*"
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
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
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
----------------------------------------------------------------------
Refactoring
PHPCBF
phpConferece 2015
$ ./vendor/bin/phpcbf ./application/controllers/servicos.php
Changing into directory /var/www/phpconference/after/application/controllers
Processing 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 secs
Patched 1 file
Time: 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
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.php
phpcpd 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
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.php
phpcpd 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.
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:*"
Refactoring
PHPMD
phpConferece 2015
$ ./vendor/bin/phpmd ./application/controllers/servicos.php text codesize,unusedcod
.servicos.php:139
The method pesquisar() has a Cyclomatic Complexity of 48.
The configured cyclomatic complexity threshold is 10.
.servicos.php:139
The method pesquisar() has an NPath complexity of 29083180897.
The configured NPath complexity threshold is 200.
.servicos.php:139
The method pesquisar() has 199 lines of code. Current threshold is set to 100.
Avoid really long methods.
.servicos.php:267
The method pesquisar uses an else expression.
Else is never necessary and you can simplify the code to work without else.
.servicos.php:290
The method pesquisar uses an else expression.
Else is never necessary and you can simplify the code to work without else.
.servicos.php:333
The method pesquisar uses an else expression.
Else is never necessary and you can simplify the code to work without else
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 }
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 depois
345 }
Refactoring
phpConferece 2015
PHPMD
Cyclomatic Complexity NPath complexity of 29083180897
172 foreach($buscas as $id => $busca) {
44 linhas depois
216 }
219 foreach($locais[0] as $id => $local) {
220 array_push($resultadoLocal, $local[“id”])
221 }
6
253 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
Refactoring
phpConferece 2015
PHPMD
Cyclomatic Complexity NPath complexity of 29083180897
18
foreach($x as $i => $y) { … }
Refactoring
Ferramentas
phpConferece 2015
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->busqu
288 foreach ($servicoS as $id => $idS) {
289 array_push($idServico, $idS["id"]);
290 }
291 }
292 }
293
294
295 if (!empty($resultadoPalavras) && !empty($result
296 $idCurso = array_intersect($resultadoPalavras
297 $idCurso = array_intersect($idCurso, $resultad
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 }
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
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["idCatego
328 $subcategoria = $this->Subcategorias_model->busquePor("id", $servico["id
329 $local = $this->Localidades_model->busquePor("id", $servico["idLocal"]);
330 $instituicao = $this->Instituicao_model->busquePor("id", $servico["idInstituic
331
332 $resultado[$id]["idInstituicao"] = $instituicao[0];
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($b
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);
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($b
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);
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 a
refatoração fácil, segura e barata, aproveite e comece a melhorar
seu código já !!!
Refatoração é simples = )
Refactoring
Conclusão
phpConferece 2015
Perguntas ?
Thamara Hessel
Obrigada =)
thamara.hessel@gmail.com
fb/ThamaraHessel
tw/ThamaraHessel

Mais conteúdo relacionado

PDF
Object Calisthenics: relaxe e escreva códigos simples
PDF
PHP para Adultos: Clean Code e Object Calisthenics
PDF
modernizando a arquitertura de sua aplicação
PDF
LabMM4 (T11 - 12/13) - PHP - Tipos de dados e variáveis
PDF
PHP ao Extremo
PDF
Ethereal
PDF
LabMM4 (T14 - 12/13) - Arrays
KEY
PHPubSP Object Calisthenics aplicado ao PHP
Object Calisthenics: relaxe e escreva códigos simples
PHP para Adultos: Clean Code e Object Calisthenics
modernizando a arquitertura de sua aplicação
LabMM4 (T11 - 12/13) - PHP - Tipos de dados e variáveis
PHP ao Extremo
Ethereal
LabMM4 (T14 - 12/13) - Arrays
PHPubSP Object Calisthenics aplicado ao PHP

Mais procurados (17)

PDF
Temario coreldraw
PPT
Curso de Introdução - PHP
PDF
Minicurso de jQuery
PDF
Apostila transistor jfet
PDF
Ecommerce, mais simples do que parece
PDF
Cuso Ruby - Aula 05 - Testes com RSpec
PDF
Introdução ao Ruby
PPTX
PHP robusto com Zend Framework
PDF
PHP 5.3 - Arrays
PDF
Segurança e Performance WordPress
PDF
Tcc apresentacao1
PPT
ZF Básico - 6. Autenticação
PDF
SQL - Banco de Dados Biblioteca
PDF
Introdução ao Respect\Validation (1.0)
PDF
Fugindo das armadilhas do MVC
PDF
Criando APIs usando o micro-framework Respect
PDF
Código legado - PHP Conference Brasil - 2014
Temario coreldraw
Curso de Introdução - PHP
Minicurso de jQuery
Apostila transistor jfet
Ecommerce, mais simples do que parece
Cuso Ruby - Aula 05 - Testes com RSpec
Introdução ao Ruby
PHP robusto com Zend Framework
PHP 5.3 - Arrays
Segurança e Performance WordPress
Tcc apresentacao1
ZF Básico - 6. Autenticação
SQL - Banco de Dados Biblioteca
Introdução ao Respect\Validation (1.0)
Fugindo das armadilhas do MVC
Criando APIs usando o micro-framework Respect
Código legado - PHP Conference Brasil - 2014
Anúncio

Destaque (20)

DOCX
Petroretail activity
PDF
Refatorar é preciso! 2.0
PPTX
O seu código fede e você nem sabia. Ou sabia, mas não o quanto fede!
PPTX
Relatos de uma empresa ágil
PPTX
If bom é if morto
PDF
Cuidando a louis
DOC
Joseph DeLoach Resume
PPTX
2 - Proteins
PDF
Tata Motors Oct 2016 Sales Report - Official
PDF
Guia de estudio de biología
PPS
8 minutos
PPTX
Vá além com cortana e windows 10
PPTX
FeatherweightPresentationForDefense
PPTX
Laviolenciadegnero powerpoint-130325145602-phpapp01
PPT
лекція. тканини рослин й тварин.
PPTX
Best Browser
PDF
Dealing with Legacy PHP Applications
PDF
[Webinar] Refatoração em PHP
Petroretail activity
Refatorar é preciso! 2.0
O seu código fede e você nem sabia. Ou sabia, mas não o quanto fede!
Relatos de uma empresa ágil
If bom é if morto
Cuidando a louis
Joseph DeLoach Resume
2 - Proteins
Tata Motors Oct 2016 Sales Report - Official
Guia de estudio de biología
8 minutos
Vá além com cortana e windows 10
FeatherweightPresentationForDefense
Laviolenciadegnero powerpoint-130325145602-phpapp01
лекція. тканини рослин й тварин.
Best Browser
Dealing with Legacy PHP Applications
[Webinar] Refatoração em PHP
Anúncio

Semelhante a Refactoring sem complicação! (20)

PDF
PHP, Mercado e Certificações
PDF
Vamos falar de Clean Code, Refatoração e TDD
PDF
Programando Melhor - Flisol
PDF
Deixando aplicações Laravel mais rápidas
PDF
Serversidephp pptx2-120418140114-phpapp01
PDF
TDC2013 SP - Criando Webservices ultra rápidos com PHP Phalcon e MongoDB
PDF
Refatoração - aquela caprichada no código
PPSX
5 Maneiras de melhorar seu código PHP
PPTX
PHP Tools for Fast coding
PDF
PHP Jedi - Boas Práticas e Alta Performance
PDF
apostila.pdf
PDF
PHP: Linguagem + Mysql + MVC + AJAX
PDF
Desenvolvimento ágil com Kohana framework
PPTX
Programando php com excelência
PDF
Mapeamento Objeto Relacional com PHP - PHP Conference Brasil 2010
PPTX
Otimização e Escalabilidade
PDF
PHP Experience 2016 - [Palestra] Keynote: PHP-7
ODP
Introdução ao framework CodeIgniter
PDF
PHP like a super hero
PHP, Mercado e Certificações
Vamos falar de Clean Code, Refatoração e TDD
Programando Melhor - Flisol
Deixando aplicações Laravel mais rápidas
Serversidephp pptx2-120418140114-phpapp01
TDC2013 SP - Criando Webservices ultra rápidos com PHP Phalcon e MongoDB
Refatoração - aquela caprichada no código
5 Maneiras de melhorar seu código PHP
PHP Tools for Fast coding
PHP Jedi - Boas Práticas e Alta Performance
apostila.pdf
PHP: Linguagem + Mysql + MVC + AJAX
Desenvolvimento ágil com Kohana framework
Programando php com excelência
Mapeamento Objeto Relacional com PHP - PHP Conference Brasil 2010
Otimização e Escalabilidade
PHP Experience 2016 - [Palestra] Keynote: PHP-7
Introdução ao framework CodeIgniter
PHP like a super hero

Mais de Thamara Hessel (9)

PPTX
Liderar e ser liderado(a) - o que você precisa saber sobre liderança técnica
PDF
What do software engineers do
PDF
Arquitetura e qualidade de codigo
PDF
Composer - tricks and tips
PPTX
Git style best practices - OLX
PPTX
Code review Effective - kwan
PPTX
Object calisthenics
PDF
Git - Saia do Básico!
PPTX
Qualidade de código
Liderar e ser liderado(a) - o que você precisa saber sobre liderança técnica
What do software engineers do
Arquitetura e qualidade de codigo
Composer - tricks and tips
Git style best practices - OLX
Code review Effective - kwan
Object calisthenics
Git - Saia do Básico!
Qualidade de código

Último (19)

PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Processos na gestão de transportes, TM100 Col18
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
COBITxITIL-Entenda as diferença em uso governança TI
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Aula04-Academia Heri- Tecnologia Geral 2025
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Processos na gestão de transportes, TM100 Col18
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Apple Pippin Uma breve introdução. - David Glotz
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Aula 18 - Manipulacao De Arquivos python
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Custos e liquidação no SAP Transportation Management, TM130 Col18
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...

Refactoring sem complicação!

  • 1. Refactoring "Mudar o código sem mudar o comportamento” - Martin Fowler phpConferece 2015
  • 2. Refactoring "Mudar o código sem mudar o comportamento” - Martin Fowler phpConferece 2015 Negação
  • 3. 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 possa acontecer, Todas essas coisas não é refatoração propriamente dita.
  • 5. Refactoring Motivação phpConferece 2015 Backlog de bugs crescente e bugs que voltam
  • 6. Refactoring Motivação phpConferece 2015 Precisa sempre de mais tempo Sair tarde já virou rotina
  • 8. 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.
  • 11. Refactoring Ferramentas phpConferece 2015 ● phpcpd - copy/paste detector ● phpmd - mess detector ● phpcs - code sniffer ● phpd - depend ● phpMetrics ● phploc ● phpunit ● behat Sebastian Bergmann Ferramentas
  • 12. Refactoring Ferramentas phpConferece 2015 ● phpd - depend ● phpMetrics ● phploc ● phpunit Métrica e evolução
  • 13. Refactoring Ferramentas phpConferece 2015 Desenvolvimento continuo ● phpcpd - copy/paste detector ● phpmd - mess detector ● phpcs - code sniffer ● phpunit ● behat
  • 15. 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();
  • 16. 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($b 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);
  • 17. 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 }
  • 18. 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 }
  • 19. 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 }
  • 20. 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
  • 21. 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
  • 22. 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["idSubcateg 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)); FIM!
  • 23. 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:*"
  • 24. Refactoring PHPD phpConferece 2015 PHPD - Depend http://www.objectmentor.com/resources/articles/oodmetrc.pdf
  • 25. Refactoring PHPLOC phpConferece 2015 PHPLOC É um rápido medidor do tamanho e da estrutura de um projeto $ composer require "phploc/phploc:*"
  • 26. Refactoring PHPMetrics phpConferece 2015 PHPMetrics Fornece diversas métricas sobre projetos. $ composer require "halleck45/phpmetrics:*" http://www.phpmetrics.org/documentation/how-to-read-report.html#report-abstractness
  • 27. Refactoring PHPUnit phpConferece 2015 PHPUnit É um framework open source para testes automatizados $ composer require "phpunit/phpunit:*" $ ./vendor/bin/phpunit application/tests PHPUnit 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)
  • 29. 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
  • 31. 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:*"
  • 32. 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
  • 33. 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
  • 34. 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 ----------------------------------------------------------------------
  • 35. Refactoring PHPCBF phpConferece 2015 $ ./vendor/bin/phpcbf ./application/controllers/servicos.php Changing into directory /var/www/phpconference/after/application/controllers Processing 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 secs Patched 1 file Time: 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
  • 36. 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.php phpcpd 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
  • 37. 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.php phpcpd 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.
  • 38. 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:*"
  • 39. Refactoring PHPMD phpConferece 2015 $ ./vendor/bin/phpmd ./application/controllers/servicos.php text codesize,unusedcod .servicos.php:139 The method pesquisar() has a Cyclomatic Complexity of 48. The configured cyclomatic complexity threshold is 10. .servicos.php:139 The method pesquisar() has an NPath complexity of 29083180897. The configured NPath complexity threshold is 200. .servicos.php:139 The method pesquisar() has 199 lines of code. Current threshold is set to 100. Avoid really long methods. .servicos.php:267 The method pesquisar uses an else expression. Else is never necessary and you can simplify the code to work without else. .servicos.php:290 The method pesquisar uses an else expression. Else is never necessary and you can simplify the code to work without else. .servicos.php:333 The method pesquisar uses an else expression. Else is never necessary and you can simplify the code to work without else
  • 40. 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 }
  • 41. 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 depois 345 }
  • 42. Refactoring phpConferece 2015 PHPMD Cyclomatic Complexity NPath complexity of 29083180897 172 foreach($buscas as $id => $busca) { 44 linhas depois 216 } 219 foreach($locais[0] as $id => $local) { 220 array_push($resultadoLocal, $local[“id”]) 221 } 6 253 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
  • 43. Refactoring phpConferece 2015 PHPMD Cyclomatic Complexity NPath complexity of 29083180897 18 foreach($x as $i => $y) { … }
  • 45. 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->busqu 288 foreach ($servicoS as $id => $idS) { 289 array_push($idServico, $idS["id"]); 290 } 291 } 292 } 293 294 295 if (!empty($resultadoPalavras) && !empty($result 296 $idCurso = array_intersect($resultadoPalavras 297 $idCurso = array_intersect($idCurso, $resultad 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 } 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 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["idCatego 328 $subcategoria = $this->Subcategorias_model->busquePor("id", $servico["id 329 $local = $this->Localidades_model->busquePor("id", $servico["idLocal"]); 330 $instituicao = $this->Instituicao_model->busquePor("id", $servico["idInstituic 331 332 $resultado[$id]["idInstituicao"] = $instituicao[0];
  • 46. 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($b 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);
  • 47. 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($b 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);
  • 48. 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 a refatoração fácil, segura e barata, aproveite e comece a melhorar seu código já !!! Refatoração é simples = )