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 a sua intenção.
O comentário para o método seria um bom nome
para o método.
Mecânica
Declare 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.
Add Parameter
Um método necessita de mais
informação de quem o chama.
Motivação
Você tem que mudar o método, e a mudança exige
informações que não foi aprovada antes.
Mecânica
Declare 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.
Remove Parameter
Um parâmetro não é usado pelo
corpo do método.
Motivação
Ao não remover o parâmetro está a dar
trabalho a quem usa o método
Mecânica
Declare 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.
SeparateQuery from Modifier
Evitar a criação de métodos, que
consultem e modifiquem um
objecto em simultâneo.
Motivação
Evitar efeitos colaterais.
Possibilidade de modificar o objecto quando se
consulta ou obter valores diferentes dos esperados
quando se modifica.
Mecânica
Criar Getter’s and Setter’s
Separar o método em 2 métodos diferentes.
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ção
Evitar 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ânica
Criar um método único.
Com parâmetros de entrada.
Replace Parameter with Explicit Methods
Quando 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ção
Criar operações isoladas.
Ao criar operações isoladas evita-se o aumento do
acoplamento e eventuais ambiguidades no
parâmetro de entrada.
Mecânica
Criar vários métodos.
Um para cada parâmetro de entrada.
Preserve WholeObject
Quando são obtidos valores de um
objecto, para serem passados a um
método.
Motivação
Evitar alterações a chamadas ao método, caso o
método necessite de mais informações do objecto
futuramente.
Mecânica
Criar 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.
Replace Parameter with Method
Quando um parâmetro de um
método pode ser obtido através da
chamada a um método.
Motivação
Evitar lista extensa de parâmetros.
Maior legibilidade do código.
Mecânica
Se necessário criar um método para obter o
parâmetro.
Substituir as referências
referências ao método.
ao
parâmetro,
por
Para cada substituição, compilar e testar.
Remover o parâmetro da lista de parâmetros do
método.
Introduce ParameterObject
Quando um método recebe vários
parâmetros.
Motivação
Evitar lista extensa de parâmetros.
Maior legibilidade do código.
Mecânica
Criar 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.
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ção
Tornar clara a intenção de que o campo da classe
apenas pode ser atribuído na construção.
Mecânica
Garantir que o setter apenas é chamado no
constructor.
Modificar o constructor para aceder directamente
ao campo.
Hide Method
Um método não é utilizado por
nenhuma outra classe. Torne-se
privado.
Motivação
Evitar 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ânica
Procurar em todos os momentos identificar manual
ou automaticamente métodos aos quais possam ser
dados uma visibilidade inferior.
Replace Constructor with Factory Method
Um objecto necessita de uma
construção avançada.
Motivação
Por 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ânica
Criar um método fábrica, chamando o constructor
actual.
Substituir todas as chamadas ao constructor pelo
método.
Tornar o constructor privado.
Encapsulate Downcast
Passar 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ção
Evitar 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ânica
Identificar 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 subclasse esperada.
Replace ErrorCode with Exception
Devido à possibilidade de ocorrência
de erros inesperados, deverão ser
utilizadas excepções no sentido de
levar o erro até ao chamador.
Motivação
Fazer 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ânica
Substituir 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.
Replace Exception withTest
Situações em que se pode evitar o
lançamento de excepções.
Motivação
Evitar 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ânica
Testar 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.
ES – 2º Apresentação Teórica
Poltergeists
“Não sei o que é que esta classe
faz.... Mas deve ser importante.
Sintoma
Criar 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ção
Refactorizar e atribuir as funcionalidades a objectos
com papeis e ciclos de vida maior.
Utilizar o método de refactorização Ghostbusters.
ES – 2º Apresentação Teórica
Vendor Lock-In
Desenho da arquitectura do sistema
especificando partes que dependem
directamente com um produto de
terceiros.
Sintoma
Sistema
Produto Adoptado
Updates ao produto adoptado implicam
manutenção do sistema.
Funcionamento correcto apenas com versões
específicas do produto.
Solução
Sistema
Especificar uma interface com as funcionalidades
exigidas pelo sistema.
Camada de Isolamento
Implementar camada intermédia que comunique
com o produto adoptado.
Produto Adoptado
ES – 2º Apresentação Teórica
Download

Motivação