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