Refactoring Visão Geral do Catálogo de Martin Fowler



Documentos relacionados
J820. Refactoring. Design no Código. argonavis.com.br. Helder da Rocha

Engenharia de Software Experimental

DataBase Refactoring em FireBird

Aula 01 - Formatações prontas e condicionais. Aula 01 - Formatações prontas e condicionais. Sumário. Formatar como Tabela

Programação Estruturada e Orientada a Objetos. Fundamentos Orientação a Objetos

Evolução de Software e Refatoração

JAVA. Tópicos Especiais de Programação Orientada a Objetos. sexta-feira, 26 de outubro de 12

Programação por Objectos. Java

Conceitos de Banco de Dados

Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo;

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Java 2 Standard Edition Como criar classes e objetos

Pragmática das Linguagens de Programação 2004/2005

Engenharia de Software III

APOSTILA BANCO DE DADOS INTRODUÇÃO A LINGUAGEM SQL

Lidar com números e estatísticas não é fácil. Reunir esses números numa apresentação pode ser ainda mais complicado.

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

Framework.NET, Microsoft Visual C# 2010 Express e Elementos da Linguagem C#

SISTEMAS OPERACIONAIS LIVRES. Professor Carlos Muniz

CONVENÇÃO DE CÓDIGO JAVA

Prof. Dr. Fabio Kon Prof. Dr. Alfredo Goldman. Departamento de Ciência da Computação IME / USP. 3 de Abril de 2003 VI Semana da Computação

Modelagemde Software Orientadaa Objetos com UML

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Reuso com Herança a e Composiçã

Bases de Dados. Lab 1: Introdução ao ambiente

Polimorfismo. Prof. Leonardo Barreto Campos 1

Manual do PolicyKit-kde. Daniel Nicoletti Tradução: Luiz Fernando Ranghetti

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada

4.1. UML Diagramas de casos de uso

3 Classes e instanciação de objectos (em Java)

Linguagem de Programação III

Lajedo Site Guia de operações comuns

POO Programação Orientada a Objetos. Classes em Java

Capítulo 4. Packages e interfaces

PHP Programando com Orientação a Objetos

Figura 1. A Classe Java

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

FBV - Linguagem de Programação II. Um pouco sobre Java

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

Construção Páginas de Internet

2 echo "PHP e outros.";

Guia de Fatores de Qualidade de OO e Java

NOVIDADES DO JAVA PARA PROGRAMADORES C

Padrão Básico de Projeto: Herança versus Composição

Modulo II Técnicas para desenvolvimento de Software Ágil

Programação Básica em STEP 7 Símbolos. SITRAIN Training for Automation and Drives Página 4-1

Padrões de Projeto. Singleton

UNIVERSIDADE FEDERAL DO PARANÁ UFPR Bacharelado em Ciência da Computação

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Dúvidas Freqüentes sobre o OpenOffice Apresentação

3 Um Modelo de Operações para a web semântica 3.1. Modelo de Operações

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Tabela de roteamento

Os objetivos indicados aplicam-se a duas linguagens de programação: C e PHP

TÉCNICAS DE PROGRAMAÇÃO

28/9/2010. Paralelismo no nível de instruções Processadores superescalares

Análise e Projeto de Sistemas

Orientação a Objetos

Programação Orientada a Objetos C++

Microsoft Access Para conhecermos o Access, vamos construir uma BD e apresentar os conceitos necessários a cada momento

Linguagem SQL Sub-linguagem DDL

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

Banco de Dados Objeto Relacional

Noções de. Microsoft SQL Server. Microsoft SQL Server

Rational Requirements Composer Treinamento aos Analistas de Qualidade e Gestor das Áreas de Projeto

Bases de Dados. O ficheiro create-bank.sql contém um conjunto de instruções SQL para criar a base de dados de exemplo ilustrada na figura 1.

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis.

EXEMPLO DE COMO FAZER UMA MALA DIRETA

UNIDADE 6 - PROGRAMAÇÃO MODULAR

Módulo 07 Características Avançadas de Classes

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

Guia de Início Rápido

Fixture-Factory. Criando objetos para seus testes. Como criar objetos através de templates para serem utilizados como massa de dados em seus testes.

Oracle PL/SQL Overview

NetBeans. Conhecendo um pouco da IDE

Programação Orientada a Objetos. Padrões de Criação

ADMINISTRAÇÃO DE SISTEMA OPERACIONAL DE REDE (AULA 4)

PHP Profissional. Alexandre Altair de Melo Mauricio G. F. Nascimento

Universidade Federal do Espírito Santo

SQL - Criação de Tabelas

App Inventor 2 - programação divertida para Android

Fase III Iteração II

Técnicas de Programação II

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

PYTHON LISTAS. Introdução à Programação SI2

Conectar diferentes pesquisas na internet por um menu


Coleções. Page 1. Coleções. Prof. Anderson Augustinho Uniandrade

Fluxo de trabalho do Capture Pro Software: Indexação de código de barras e separação de documentos

2.3. PHP Tipos de dados e operadores

Decorator Pattern. SISMO - Sistemas e Mobilidade Junho de Departamento de Informática / UFMA

Sumário. Computação Gráfica Illustrator

Classes, Superclasses e Subclasses

cio Roteamento Linux

Transcrição:

Refactoring Visão Geral do Catálogo de Martin Fowler Jorge Fernandes Janeiro de 2001

Catálogo de Refactorings Composição de Métodos Movendo Características entre Objetos Organizando Dados Simplificando Expressões Condicionais Simplificando Invocação de Métodos Tratando com Generalização Grandes Refactorings

Composição de Métodos (Fowler, 1999) O principal refactoring é Extract Method, que transforma um pedaço de código em um novo método. Inline Method é a operação oposta, usada quando a existência do método não faz mais sentido. Quando surgem problemas com variáveis locais é interessante tentar aplicar Replace Temp with Query. Eventualmente as variáveis apresentam interdependência e a solução pode ser Replace Method with Method Object que implica na criação de uma nova classe. Outros problemas na extração de método podem ser resolvidos com Remove Assignments to Parameters. Uma vez que o método esteja fatorado, a clareza do algoritmo pode ser melhorada com Substitute Algorithm.

Extract Method Transformar este código... void printowing(double amount) { printbanner(); // print details System.out.println( name: + _name); System.out.println( amount + amount); } neste! void printowing(double amount) { printbanner(); printdetails(amount); } void printdetails(double amount) { System.out.println( name: + _name); System.out.println( amount + amount); }

Extract Method Mecânica (Algoritmo) Crie um novo método e o nomeie-o adequadamente (pelo que ele faz, e não como ele o faz) Copie o código extraído da fonte no (método) destino Dê uma varrida no código extraído para referências a quaisquer variáveis temporárias (locais e parâmetros) que estão no escopo do método fonte. Veja as variáveis temporárias usadas apenas no escopo do método extraído e declare-as no método destino. Verifique se apenas uma das outras variáveis temporárias é modificada no escopo do código extraído. Veja então se dá para usar o método novo como uma query. Caso haja mais de uma destas variáveis ou caso a query não fique adequada aplique Split Temporary Variable ou Replace Temp with Query. Passe como parâmetro para o método destino as variáveis temporárias que são apenas lidas Compile quando tiver resolvido todos os problemas com variáveis Substitua o código extraído no método fonte com uma chamada ao método destino. Compile e teste.

Movendo Características entre Objetos (Fowler, 1999) Problemas com atribuição adequada de responsabilidades a objetos começam a ser resolvidos aplicando-se Move Field e Move Method. Quando classes ficam abarrotadas de responsabilidades pode-se usar Extract Class para separá-las. Ao contrário, quando classes ficam irresponsáveis pode-se usar Inline Class. Uma classe que está sendo usada por outra pode ser escondida através de Hide Delegate. Se esta operação implicar em mudanças constantes na interface da classe da frente pode ser preciso Remove Middle Man. Introduce Foreign Method e Introduce Local Extension são aplicados em casos especiais, quando se deseja mover responsabilidades para uma classe, mas não é possível se acessar o código fonte desta.

Organizando Dados (1 de 3) Se você normalmente usa acesso direto a um atributo mas necessita de um acessor então aplique Self Encapsulate Field. Use Replace Data Value with Object quando você começou com um simples dado e porteriormente se deu conta de que um objeto poderia ser mais útil. Caso estes objetos sejam usados em muitas partes do programa então Change Value to Reference. Se você vê um array funcionando como uma estrutura de dados então Replace Array with Object. A vantagem real desta transformação surge quando se usa Move Method para adicionar comportamento aos novos objetos. Uma vez que tenha percebido qual a finalidade dele, Replace Magic Number with Symbolic Constant para se livrar do problema.

Organizando Dados (2 de 3) Links entre objetos podem ser uni- ou bi-direcionais. Embora os primeiros sejam mais fáceis, eventualmente é necessário Change Unidirectional Association to Bidirectional para prover suporte a novas funções. A operação inversa, Change Bidirectional Association to Unidirectional, pode simplificar a solução. Duplicate Observed Data pode ser necessário quando se deseja separar dados do domínio dos dados de uma classe de GUI. Se qualquer dado público está exposto por aí Encapsulate Field. Se o dado é uma coleção então Encapsulate Collection. Se um registro inteiro está exposto então Replace Record with Data Class.

Organizando Dados (3 de 3) Códigos de tipo indicam particularidades sobre a condição de um objeto. Replace Type Code with Class quando este código não implica em mudanças no comportamento da classe. Replace Type Code with Subclass quando o comportamento se altera. Outra alternativa mais complicada é Replace Type Code with State/Strategy.

Simplificando Expressões Condicionais Decompose Conditional separa um condicional em partes, isolando a código de chaveamento das conseqüências deste chaveamento. Consolidate Conditional Expression quando vários testes produzem o mesmo efeito. Consolidade Duplicate Conditional Fragment remove duplicações no código condicional. Para tornar mais claro um condicional Replace Nested Conditional with Guard Clauses e Remove Control Flag. Observe sempre se é possível Replace Conditional with Polymosphism, inclusive através de Introduce Null Object.

Simplificando Invocação de Métodos (1 de 2) A transformação mais simples e importante é Rename Method. Add Parameter ou Remove Parameter para transformar interfaces. Se muitos parâmetros são passados numa chamada, Preserve Whole Object evita esta passagem, Introduce Parameter Object cria um local adequado para estes parametros, ou então Replace Parameter with Method. Se algum dos parâmetros é usado para condicionar o comportamento do método, então Replace Parameter with Explicit Method. Separate Query from Modifier, sempre que encontrá-los juntos.

Simplificando Invocação de Métodos (2 de 2) Esconda ou remova métodos sempre que puder com Hide Method e Remove Setting Method. Para evitar o conhecimento prematuro da classe de um objeto a ser criado, use Replace Constructor with Factory Method. Evite usar casts explícitos através de Encapsulate Downcast. Replace Error Code with Exception ou Replace Exception with Test.

Tratando com Generalização (1 de 2) Use Pull Up Field e Pull Up Method para promover uma função na hierarquia de classes, ou Push Down Method e Push Down Field para rebaixá-la. Use Pull Up Constructor Body para promover construtores, que é o caminho inverso de Replace Constructor with Factory Method. Métodos que apresentam similaridades mas variam nos detalhes podem ser transformados através de Form Template Method.

Tratando com Generalização (2 de 2) Extract Subclass, Extract Superclass e Extract Interface modificam hierarquia através da criação de novas classes. Classes desnecessárias podem ser removidas através de Collapse Hierarchy. Quando herança não é a melhor forma de design, Replace Inheritance with Delegation. O caminho contrário é Replace Delegation with Inheritance.

Grandes Refactorings Tease Apart Inheritance quando você tem uma hierarquia de herança que realiza dois trabalhos ao mesmo tempo. Convert Procedural Design to Objects quando você tem código escrito em estilo procedural. Separate Domain from Presentation quando você tem classes de GUI que contém lógica do domínio. Extract Hierarchy quando você tem uma classe que está fazendo muito trabalho, principalmente através de muitos comandos condicionais.

Refactoring Visão Geral do Catálogo de Martin Fowler Jorge Fernandes Janeiro de 2001