es – 2º apresentação teórica. rename method o nome de um método não revela o seu...

21
TÉCNICAS DE REFACTORING Making Method Calls Simpler ES – 2º Apresentação Teórica

Upload: internet

Post on 21-Apr-2015

103 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

TÉCNICAS DE REFACTORINGMaking Method Calls SimplerES – 2º Apresentação Teórica

Page 2: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Rename Method

O nome de um método não revela o seu propósito.

MotivaçãoMétodos devem ser chamados de uma forma que comuniquem a sua intenção.

O comentário para o método seria um bom nome para o método.

MecânicaDeclare um novo método com o novo nome.

Alterar o corpo do método antigo para que ele chama o novo.

Encontrar todas as referências ao método antigo e alterá-las para se referir ao novo.

Remova o método antigo.

Exemplo

Page 3: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Add Parameter

Um método necessita de mais informação de quem o chama.

MotivaçãoVocê tem que mudar o método, e a mudança exige informações que não foi aprovada antes.

MecânicaDeclare um novo método com o parâmetro acrescentado.

Copie o antigo corpo de código para o novo método.

Alterar o corpo do método para se ajustar ao novo requesito.

Encontrar todas as referências ao método antigo e alterá-las para se referir ao novo.

Remova o método antigo.

Exemplo

Page 4: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Remove Parameter

Um parâmetro não é usado pelo corpo do método.

MotivaçãoAo não remover o parâmetro está a dar trabalho a quem usa o método

MecânicaDeclare um novo método sem o parâmetro.

Copie antigo corpo de código para o novo método.

Encontrar todas as referências ao método antigo e alterá-las para se referir ao novo.

Remova o método antigo.

Exemplo

Page 5: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Separate Query from ModifierEvitar a criação de métodos, que consultem e modifiquem um objecto em simultâneo.

MotivaçãoEvitar efeitos colaterais.

Possibilidade de modificar o objecto quando se consulta ou obter valores diferentes dos esperados quando se modifica.

MecânicaCriar Getter’s and Setter’s

Separar o método em 2 métodos diferentes.

Exemplo

Page 6: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Parametrize Method

Quando existem vários métodos que fazem operações semelhantes, devem ser substituídos por um único método com parâmetros de entrada.

MotivaçãoEvitar duplicações de código.

Ao centralizar uma operação num método com parâmetros de entrada, reduz-se a entropia causada por eventuais mudanças.

MecânicaCriar um método único.

Com parâmetros de entrada.

Exemplo

Page 7: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Replace Parameter with Explicit MethodsQuando existe um método que corre código diferente em função do parâmetro de entrada, então deve ser substituído por diversos métodos, um para cada troço de código.

MotivaçãoCriar operações isoladas.

Ao criar operações isoladas evita-se o aumento do acoplamento e eventuais ambiguidades no parâmetro de entrada.

MecânicaCriar vários métodos.

Um para cada parâmetro de entrada.

Exemplo

Page 8: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Preserve Whole Object

Quando são obtidos valores de um objecto, para serem passados a um método.

MotivaçãoEvitar alterações a chamadas ao método, caso o método necessite de mais informações do objecto futuramente.

MecânicaCriar um novo parâmetro, para o objecto, de onde o valor dos parâmetros foi obtido.

Substituir a referencia a um parâmetro, pela referencia ao método adequado do objecto recebido.

Para cada parâmetro, remover o parâmetro, compilar e testar.

Remover o código usado para obter os parâmetros que estavam a ser usados na chamada ao método.

Exemplo

Page 9: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Replace Parameter with Method

Quando um parâmetro de um método pode ser obtido através da chamada a um método.

MotivaçãoEvitar lista extensa de parâmetros.

Maior legibilidade do código.

MecânicaSe necessário criar um método para obter o parâmetro.

Substituir as referências ao parâmetro, por referências ao método.

Para cada substituição, compilar e testar.

Remover o parâmetro da lista de parâmetros do método.

Exemplo

Page 10: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Introduce Parameter Object

Quando um método recebe vários parâmetros.

MotivaçãoEvitar lista extensa de parâmetros.

Maior legibilidade do código.

MecânicaCriar uma nova classe (imutável) que representa o grupo de parâmetros.

Adicionar a nova classe aos parâmetros do método.

Para cada parâmetro do conjunto inicial, remover um a um e modificar o código do método e chamadas ao mesmo.

Analisar a colocação de comportamento na classe criada.

Exemplo

Page 11: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Remove Setting Method

Um campo de uma classe deve ser inicializado na criação e nunca mais ser alterado. Remover qualquer Setter que exista para aquele campo.

MotivaçãoTornar clara a intenção de que o campo da classe apenas pode ser atribuído na construção.

MecânicaGarantir que o setter apenas é chamado no constructor.

Modificar o constructor para aceder directamente ao campo.

Exemplo

Page 12: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Hide Method

Um método não é utilizado por nenhuma outra classe. Torne-se privado.

MotivaçãoEvitar a “poluição” da interface pública.

Por vezes no início de vida de uma classe são disponibilizados métodos que durante a sua evolução passam a ser desnecessários.

MecânicaProcurar em todos os momentos identificar manual ou automaticamente métodos aos quais possam ser dados uma visibilidade inferior.

Exemplo

Page 13: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Replace Constructor with Factory MethodUm objecto necessita de uma construção avançada.

MotivaçãoPor vezes a criação de um objecto depende de um tipo passado na construção, e durante a evolução passou a existir uma sub-classe para cada tipo.

MecânicaCriar um método fábrica, chamando o constructor actual.

Substituir todas as chamadas ao constructor pelo método.

Tornar o constructor privado.

Exemplo

Page 14: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Encapsulate DowncastPassar para o corpo do método a responsabilidade de fazer o downcast do tipo de retorno, quando se sabe que o mesmo é um tipo derivado do especificado na assinatura.

MotivaçãoEvitar utilização desnecessária de downcasts.

Fazer com que após a utilização de um método não seja necessário fazer a conversão do seu retorno para um tipo mais específico do que o anunciado na assinatura.

MecânicaIdentificar casos em que é feito downcast ao retorno de um método e fazer o downcast no seu interior.

Esta alteração não deverá trazer complicações com código já existente uma vez que se trata da sub-classe esperada.

Exemplo

Page 15: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Replace Error Code with ExceptionDevido à possibilidade de ocorrência de erros inesperados, deverão ser utilizadas excepções no sentido de levar o erro até ao chamador.

MotivaçãoFazer com que os erros gritem.

Impedir que a ocorrência de um erro numa chamada a um método se traduza no retorno de um código de erro.

MecânicaSubstituir retorno de códigos de erros pela utilização de mecanismo de excepções das linguagens, optando por excepções checked ou unchecked, procedendo à alteração da assinatura do método.

Alterar o código nas chamadas ao método capturando a excepção ou passando-a para cima.

Exemplo

Page 16: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Replace Exception with Test

Situações em que se pode evitar o lançamento de excepções.

MotivaçãoEvitar uso de excepções por falta de testes de condições.

O tratamento de erros esperados deverá ser feito pelo teste das condições que os podem originar, passando assim para o chamador esta responsabilidade.

MecânicaTestar condição causadora de erro a ser capturado por bloco try-catch no chamador e incluir uma asserção no catch.

Remover o bloco try-catch do chamador e o lançamento da excepção na assinatura do método, caso se aplique.

Exemplo

Page 17: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

ANTI PADRÕES (DESENVOLVIMENTO)

POLTERGEISTSES – 2º Apresentação Teórica

Page 18: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Poltergeists

“Não sei o que é que esta classe faz.... Mas deve ser importante.

SintomaCriar operações isoladas.

Classes com papeis e ciclos de vida muito limitados.

Tipicamente são usadas para iniciar outros processos.

Criadas por programadores desconhecedores da programação orientada a objectos.

SoluçãoRefactorizar e atribuir as funcionalidades a objectos com papeis e ciclos de vida maior.

Utilizar o método de refactorização Ghostbusters.

Page 19: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

ANTI PADRÕES (ARQUITECTURA)

VENDOR LOCK-INES – 2º Apresentação Teórica

Page 20: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

Vendor Lock-In

Desenho da arquitectura do sistema especificando partes que dependem directamente com um produto de terceiros.

SintomaUpdates ao produto adoptado implicam manutenção do sistema.

Funcionamento correcto apenas com versões específicas do produto.

SoluçãoEspecificar uma interface com as funcionalidades exigidas pelo sistema.

Implementar camada intermédia que comunique com o produto adoptado.

Sistema

Produto Adoptado

Sistema

Camada de Isolamento

Produto Adoptado

Page 21: ES – 2º Apresentação Teórica. Rename Method O nome de um método não revela o seu propósito.Motivação Métodos devem ser chamados de uma forma que comuniquem

GRUPO 611726 Carlos Nobre12544 João Dias26657 Ricardo Neto29318 João Cabral31768 Ricardo RomãoES – 2º Apresentação Teórica