Descrição das técnicas de refatoração de código. Material de apoio à disciplina SI405, Análise de Sistemas de Informação 2, da Faculdade de Tecnologia da UNICAMP.
143. Ao extrair código condicional para métodos claramente
nomeados, você facilita a vida da pessoa que manterá o
código mais tarde (como você, daqui a dois meses!).
Essa técnica de refatoração também é aplicável para
expressões curtas em condições. A string isSalaryDay() é
muito mais bonita e mais descritiva do que o código para
comparar datas.
147. Elimina o código de fluxo de controle duplicado. Combinar
vários condicionais que têm o mesmo "destino" ajuda a
mostrar que você está fazendo apenas uma verificação
complicada que leva a uma ação.
Ao consolidar todos os operadores, agora você pode isolar
essa expressão complexa em um novo método com um
nome que explica a finalidade da condicional.
159. .
É difícil descobrir o que cada condicional faz e como, já que
o fluxo "normal" de execução de código não é
imediatamente óbvio.
Para simplificar a situação, isole os casos especiais em
condições separadas que terminam imediatamente a
execução e retornam um valor nulo se as cláusulas de
guarda forem verdadeiras. Com efeito, sua missão aqui é
tornar a estrutura plana.
164. 1. Se a condicional estiver em um método que executa outras
ações também, aplique Extract Method.
2. Para cada subclasse de hierarquia, redefina o método que
contém o condicional e copie o código do ramo condicional
correspondente para esse local.
3. Exclua este ramo da condicional.
4. Repita a substituição até que a condicional esteja vazia. Em
seguida, exclua a condicional e declare o método abstrato.
181. A escolha aqui é entre adicionar um novo parâmetro e
adicionar um novo campo privado que contém os dados
necessários pelo método. Um parâmetro é preferível
quando você precisa de alguns dados ocasionais ou que
mudam frequentemente para os quais não há sentido em
mantê-los em um objeto o tempo todo. Caso contrário,
adicione um campo privado e preencha-o com os dados
necessários antes de chamar o método.
201. • Em vez de uma miscelânea de parâmetros, você vê um
único objeto com um nome compreensível.
• Se o método precisar de mais dados de um objeto, você
não precisará reescrever todos os locais em que o
método é usado - apenas dentro do próprio método.
209. • Código mais legível. Em vez de uma miscelânea de
parâmetros, você vê um único objeto com um nome
compreensível.
• Grupos idênticos de parâmetros espalhados aqui e ali criam
seu próprio tipo de duplicação de código: enquanto o código
idêntico não está sendo chamado, grupos idênticos de
parâmetros e argumentos são constantemente encontrados.
225. • Libera o código de um grande número de condicionais para verificar
vários códigos de erro. Manipuladores de exceções são uma maneira
muito mais sucinta de diferenciar caminhos de execução normais dos
caminhos anormais.
• As classes de exceção podem implementar seus próprios métodos,
contendo, portanto, parte da funcionalidade de tratamento de erros
(por exemplo, para enviar mensagens de erro).
• Ao contrário das exceções, os códigos de erro não podem ser usados
em um construtor, pois um construtor deve retornar apenas um novo
objeto.
235. • Elimina a duplicação de campos em subclasses.
• Facilita a realocação subsequente de métodos
duplicados, se existirem, de subclasses para uma
superclasse.
267. No entanto, se a hierarquia de classes tem mais de uma
subclasse, é preciso verificar se ao recolher a hierarquia não
se violará o Princípio da Substituição de Liskov.
271. A duplicação de código nem sempre se refere a casos de copiar /
colar simples. Frequentemente, a duplicação ocorre em um nível
mais alto, como quando você tem um método para classificar
números e um método para classificar coleções de objetos que
são diferenciadas apenas pela comparação de elementos. A
criação de um método gabarito elimina essa duplicação
mesclando as etapas do algoritmo compartilhado em uma
superclasse e deixando apenas as diferenças nas subclasses.
279. Não use essa técnica se a classe contiver delegação para apenas
uma parte dos métodos públicos da classe delegada. Ao fazer
isso, você violaria o princípio da substituição de Liskov.