J820. Refactoring. Design no Código. argonavis.com.br. Helder da Rocha (helder@acm.org)



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

Um Exemplo de Refatoração. Prof. Alberto Costa Neto DComp/UFS

Reuso com Herança a e Composiçã

Programação de Computadores - I. Profª Beatriz Profº Israel

Engenharia de Software Experimental

Java 2 Standard Edition Como criar classes e objetos

Prototype, um Design Patterns de Criação

Introdução a Java. Hélder Nunes

Programação por Objectos. Java

Programação Orientada por Objetos

UML Aspectos de projetos em Diagramas de classes

Computação II Orientação a Objetos

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS

Evolução de Software e Refatoração

Padrões de projeto 1

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

Universidade Federal de Itajubá Instituto de Engenharia de Sistemas e Tecnologias da Informação-IESTI PCO203 Tópicos Especiais em Programação

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Orientação a Objetos

Classes, Superclasses e Subclasses

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Java. Marcio de Carvalho Victorino

LINGUAGEM ORIENTADA A OBJETOS

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

Padrão Básico de Projeto: Interfaces e Polimorfismo

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

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

Curso - Padrões de Projeto Módulo 2: Padrões de Criação

Programação Orientada a Objetos Herança Técnico em Informática. Prof. Marcos André Pisching, M.Sc.

Paradigmas da Programação PPROG. Linguagem JAVA. Interfaces. (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2013/14) 1/33

2 Diagrama de Caso de Uso

Argo Navis J931 - Padrões de Design J2EE. Introdução. Objetivos de aprender padrões J2EE. Conhecer padrões para uso na plataforma J2EE

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

Implementando uma Classe e Criando Objetos a partir dela

Guia de Fatores de Qualidade de OO e Java

Programação Orientada a Objetos (DPADF 0063)

Programação por Objectos. Java

Engenharia de Software III

Microsoft Access: Criar consultas para um novo banco de dados. Vitor Valerio de Souza Campos

Herança. Alberto Costa Neto DComp - UFS

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

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes

Profº. Enrique Pimentel Leite de Oliveira

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Análise e Projeto Orientados por Objetos

Como mandar mensagens OSC pelo Flash via Flosc

Especificação do 3º Trabalho

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

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

Roteiro do Programa e Entrada/Saída

3.1 Definições Uma classe é a descrição de um tipo de objeto.

PADRÕES DE SOFTWARE. Jerffeson Teixeira de Souza, Ph.D. Tarciane de Castro Andrade. Grupo de Padrões de Software da UECE (GPS.

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

Análise de Programação

Exercícios de Revisão Java Básico

Capítulo 4. Packages e interfaces

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

Programação Orientada a Objetos. Encapsulamento

Programação de Computadores - I. Profª Beatriz Profº Israel

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

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

Tópicos em Engenharia de Computação

Polimorfismo. Prof. Leonardo Barreto Campos 1

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

ISO/IEC 12207: Gerência de Configuração

Introdução à orientação a objetos. João Tito Almeida Vianna 25/05/2013

UNIVERSIDADE FEDERAL DO PARANÁ

Programação Orientada a Objetos: Lista de exercícios #1. Bruno Góis Mateus

Introdução às Linguagens de Programação

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

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

Computação II Orientação a Objetos

Programação com Objectos. Processamento de Dados I. 4. Classes Abstractas

2 Engenharia de Software

7 RTTI e Interfaces. Desenvolvimento OO com Java. Vítor E. Silva Souza (vitorsouza@inf.ufes.br)

Computação Orientada aos Serviços. WF (parte 1) Semestre de Inverno 12/13

2 Desenvolvimento de Software Orientado a Aspectos

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

Programação Orientada a Objetos. Prof. Diemesleno Souza Carvalho diemesleno@iftm.edu.br

Projeto de Software Orientado a Objeto

Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos

DEFINIÇÃO DE MÉTODOS

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

BSI UFRPE Prof. Gustavo Callou

2 Orientação a objetos na prática

RevISTa: Publicação técnico-científica do IST-Rio. nº 05 Data: Dezembro / 2012 ISSN

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Orientação a Objetos e a Linguagem Java

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro Maio/ 2015

TOTVS BA Guia de Customização Linha Logix

Curso de PHP. FATEC - Jundiaí. A programação orientada a objetos (object-oriented oriented programming

Programação Orientada a Objetos em java. Polimorfismo

Programação Orientada a Objetos C++

insfcanceof new public switch transient while byte continue extends for int null

8 Classes Internas. Desenvolvimento OO com Java. Vítor E. Silva Souza

Capítulo 8. Introdução UML

Programação Orientada a Objetos em Java

Transcrição:

J820 Refactoring Design no Código Helder da Rocha (helder@acm.org)

O que é Uma técnica de design baseada no código Refactoring (ou refatoramento) permite que se altere o design de uma aplicação, grande ou pequena, alterando o seu código diretamente É uma prática altamente disciplinada e previsível. Não é hacking puro e simples. Visa sempre o melhoramento do código Refatoramento contínuo melhora o código e a aplicação inteira continuamente Todo mundo faz (ou já fez), nem sempre de maneira disciplinada, porém. 2

Quando aplicar Sempre que possível Em TDD, refactorings são essenciais já que a primeira solução, a mais simples, geralmente não tem o melhor design Alterações como "tornar variável private" são um tipo de refatoramento Afeta não apenas a variável em questão, mas todos que dependem dela O refatoramento consiste em fazer todas as mudanças necessárias para que o código volte a funcionar após a alteração. 3

Testes são fundamentais Refatoramento é mexer no código que está funcionando É um grande risco se não houver testes para esse código Antes de refatorar, escreva testes de unidade para os elementos que serão alterados Execute os testes várias vezes durante o processo Modifique os testes para mantê-los em dia com o código que testam Siga o passo-a-passo recomendado por cada refatoramento. Vários sugerem quando novos testes devem ser escritos e executados 4

Experiência Refatoramentos são simplesmente técnicas para mexer no design do código Geralmente é para melhorar o código em relação às boas práticas OO Em alguns casos pode piorar nesse aspecto quando há outros objetivos no processo (ex: performance) Refatoramentos refletem experiências testadas Ganha-se tempo ao se utilizar um padrão de refatoramento em vez de descobrir tudo sozinho 5

Patterns O conhecimento de Padrões de projeto (Design Patterns) não é essencial para utilizar refatoramentos, mas ajuda bastante Muitos refatoramentos visam transformar o código de forma a aplicar um padrão Outros refatoramentos partem de um padrão de projeto ou produzem padrões no processo Um conhecimento geral dos padrões GoF traz grandes benefícios para qualquer desenvolvedor 6

Exemplo interativo de refactoring A melhor maneira de entender como funciona o refatoramento é através de um exemplo interativo Utilizaremos o exemplo do primeiro capítulo do livro "Refactoring", de Martin Fowler O exemplo mostra um código que "cheira mal" devido a vários problemas que dificultam o seu reuso, manutenção, compreensão e até eficiência Demonstraremos alguns passos que tornarão o programa bem melhor 7

Exemplo do livro: Locadora de Videos 8

public class Movie { public static final int CHILRENS = 2; public static final int REGULAR = 0; public static final int NEW_RELEASE = 1; Movie.java public String _title; private int _pricecode; public Movie(String title, int pricecode) { _title = title; _pricecode = pricecode; public int getpricecode() { return _pricecode; public void setpricecode(int arg) { _pricecode = arg; public String gettitle() { return _title; 9

Rental.java class Rental { private Movie _movie; private int _daysrented; public Rental(Movie movie, int daysrented) { _movie = movie; _daysrented = daysrented; public int getdaysrented() { return _daysrented; public Movie getmovie() { return _movie; 10

Customer.java 1/3 class Customer { private String _name; private Vector _rentals = new Vector; public Customer(String name) { _name = name; public void addrental(rental arg) { _rentals.addelement(arg); public String getname() { return _name;... 11

... public String statement() { Customer.java 2/3 double totalamount = 0; int frequentrenterpoints = 0; Enumeration rentals = _rentals.elements(); String result = "Rental Record for " + getname() + "\n"; while (rentals.hasmoreelements()) { double thisamount = 0; Rental each = (Rental) rentals.nextelement();... // Determine amounts for each line switch (each.getmovie().getpricecode()) { case Movie.REGULAR: thisamount += 2; if (each.getdaysrented() > 2) thisamount += (each.getdaysrented() - 2) * 1.5; break; case Movie.NEW_RELEASE: thisamount += each.getdaysrented() * 3; break; case Movie.CHILDRENS: thisamount += 1.5; if (each.getdaysrented() > 3) thisamount += (each.getdaysrented() - 3) * 1.5; break; 12

Customer.java 3/3... // Add frequent renter points frequentrenterpoints++; // Add bonus for a two-day, new-release rental if ((each.getmovie().getpricecode() == Movie.NEW_RELEASE) && each.getdaysrented() > 1) frequentrenterpoints++; // Show figures for this rental result += "\t" + each.getmovie().gettitle() + "\t" + Sting.valueOf(thisAmount) + "\n"; totalamount += thisamount; // Add footer lines result += "Amount owed is " + String.valueOf(totalAmount) + "\n"; result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points"; return result; 13

Catálogo de refactorings Assim como padrões de projeto, técnicas de refatoramento refletem a experiência adquirida por programadores experientes que pode ser reutilizada por todos para alcançar resultados desejados mais rapidamente e de maneira testada Assim como padrões de projeto, refatoramentos têm nome. Além disso, têm uma forma reversível de aplicação, geralmente em passos pequenos Deve-se sempre executar testes de unidade em cada passo, para garantir a reversibilidade Catálogos de refatoramento geralmente descrevem como implementar cada alteração detalhadamente 14

Extract Method Problema: Você tem um fragmento de método que pode ser agrupado em método independente Solução: transforme o fragmento em um método cujo nome explique a sua finalidade. void printowing(int amount) { printbanner(); System.out.println ("name: " + _name); System.out.println ("amount " + amount); void printowing() { printbanner(); printdetails(amount); void printdetails(double amount) { System.out.println ("name: " + _name); System.out.println ("amount " + amount); 15

Replace Method With Method Object Problema: Você tem um método longo que usa variáveis locais de tal maneira que não é possível aplicar Extract Method Solução: Transforme o método em um objeto para que todas as variáveis locais virem atributos class Order... double price() { double primarybaseprice; double secondarybaseprice; double tertiarybaseprice; // long computation;... 16

Substitute Algorithm Problema: Algoritmo de método pode ser melhorado. Solução: substitua o conteúdo do método com um algoritmo que faça a mesma coisa mas seja melhor. String foundperson(string[] people){ for (int i = 0; i < people.length; i++) { if (people[i].equals ("Don")){ return "Don"; if (people[i].equals ("John")){ return "John"; if (people[i].equals ("Kent")){ return "Kent"; return ""; String foundperson(string[] people){ List candidates = Arrays.asList(new String[] {"Don", "John", "Kent"); for (int i=0; i<people.length; i++) if (candidates.contains(people[i])) return people[i]; return ""; 17

Move Method Problema: Um método é usado por mais recursos de outra classe que na classe em que é definido. Solução: crie novo método com corpo similar na classe em que é mais usado. Transforme o antigo em simples delegação ou elimine-o. Veja também: Move Field 18

Extract Class Problema: Você tem uma classe fazendo trabalho que deveria ser feito por duas classes. Solução: Crie uma nova classe e transfira métodos e atributos relevantes para ela. 19

Introduce Local Extension Problema: Uma classe servidora que você está usando requer vários métodos adicionais, mas você não pode modificar a classe. Solução: crie uma nova classe que contém esses métodos extras. Faça essa extensão uma subclasse ou um wrapper da original. 20

Hide Delegate Problema: Um cliente tem acesso e está chamando uma classe que é delegada pelo objeto que utiliza. Solução: Crie métodos no servidor para ocultar o objeto do acesso pelo cliente. 21

Remove Middle-Man Problema: Uma classe está fazendo delegações simples em excesso. Solução: Faça o cliente delegar diretamente. 22

Replace Data Value With Object Problema: Você tem um item de dados que requer dados adicionais ou comportamento. Solução: transforme o item de dados em um objeto. 23

Encapsulate Collection Problema: Um método retorna uma Coleção (List, Set, HashMap) - acesso total e ausência de controle sobre tipos de dados (tudo é Object) Solução: Faça-o retornar uma visão read-only dos dados e forneça métodos de adição e remoção. 24

Replace Type Code With Subclass Problema: Você tem um código de tipo imutável que afeta o comportamento de uma classe. Solução: Substitua o código de tipo com uma subclasse. 25

Replace Type Code With Class Problema: Uma classe tem um código numérico de tipo que não afeta seu comportamento Solução: Substitua o número com uma nova classe. 26

Replace Type Code With State/Strategy Problema: Você tem código que representa um tipo e que afeta o comportamento de uma classe mas não pode usar subclasses Solução: Represente o tipo com um objeto de estado. 27

Replace Subclass with Fields Problema: Você tem subclasses que só variam em métodos que retornam dados constantes Solução: mova os métodos para atributos de superclasses e elimine as subclasses 28

Replace Conditional With Polymorphism double getspeed() { switch (_type) { case EUROPEAN: return getbasespeed(); case AFRICAN: return getbasespeed() - getloadfactor() * _coconuts; case NORWEIGIAN_BLUE: return (_isnailed)? 0 : getbasespeed(_voltage); throw new RuntimeException ("Should be unreachable"); Problema: Você tem um tipo condicional que age diferentemente dependendo do tipo de um objeto. Solução: Mova cada bloco para método em uma subclasse e faça o método original abstrato. 29

Parameterize Method Problema: Vários métodos fazem coisas similares mas com diferentes valores contidos no corpo do objeto Solução: crie um método que usa um parâmetro para os valores diferentes. 30

Preserve Whole Object Problema: Você está recebendo diversos valores de um objeto e passando-os como parâmetros em uma chamada Solução: Mande o objeto inteiro int low = daystemprange().getlow(); int high = daystemprange().gethigh(); withinplan = plan.withinrange(low, high); withinplan = plan.withinrange(daystemprange()); 31

Replace Constructor With Factory Method Problema: Você quer poder realizar mais que simples construção quando cria um objeto (ou ter mais controle e flexibilidade ao criar objetos) Solução: Substitua construtor com um factory method Employee (int type) { _type = type; static Employee create(int type) { return new Employee(type); 32

Extract Subclass Problema: Uma classe tem recursos que só são utilizados em algumas instâncias Solução: crie uma subclasse para esse conjunto de recursos. 33

Extract Superclass Problema: Você tem duas classes com recursos similares. Solução: crie uma subclasse e mova os recursos comuns à superclasse. 34

Extract Interface Problema: Vários clientes usam o mesmo subconjunto da interface de uma classe, ou duas classes têm parte de sua interface em comum Solução: extraia o subconjunto em uma interface 35

Form Template Method Problema: Você tem dois métodos em subclasses que realizam passos similares na mesma ordem, porém os passos são implementados de forma diferente Solução: Coloque os passos em métodos com a mesma assinatura e depois puxe-os acima na hierarquia. 36

Replace Inheritance With Delegation Problema: Uma subclasse usa apenas uma parte da interface da superclasse ou não deseja herdar dados Solução: Crie um atributo de dados para a superclasse, ajuste os métodos para delegar à superclasse e remova a estrutura de subclasse 37

Replace Delegation With Inheritance Problema: Você usa delegação e está frequentemente escrevendo pequenas delegações para toda a interface Solução: Faça a classe que delega uma subclasse da delegada 38

Alguns "cheiros ruins" e suas soluções Código duplicado Extract Method, Extract Class, Pull Up Method, Form Template Method Intimidade inapropriada Mome Method, Change Bidirectional Association to Unidirectional, Replace Inheritance with Delegation Classe gigante Extract Class, Extract Subclass, Extract Interface, Replace Data Value with Object Método gigante Extract Method, Replace Method with Method Object, Decompose Conditional 39

Mais Refatoramentos Veja o catálogo do Martin Fowler (do livro Refactoring) em www.refactoring.com/catalog Procure descobrir refatoramentos específicos para a área no quel você está pesquisando J2EE Aplicações gráficas Concorrência e programação paralela Refatoramento, Padrões de Projeto, estratégias (aplicações de patterns / idioms) e Melhores Práticas estão sempre relacionados Todos fornecem experiências valiosas que melhoram a produtividade e utilização dos recursos de uma linguagem na solução de problemas de design. 40

Fontes [1] Martin Fowler, "Refactoring: improving the design of existing code". Addison-Wesley Object Technology Series, 2000 [2] Martin Fowler. "On-line Refactoring Catalog". www.refactoring.com/catalog/. Fonte dos diagramas e imagens. 41

Curso J820 Produtividade e Qualidade em Java: Ferramentas e Metodologias Revisão 1.1 2002, 2003, Helder da Rocha (helder@acm.org)