2 de novembro de 2017


O move method and move field é um método de refatoração utilizado para mover métodos e atributos que possam estar em classe errada. A necessidade de realização desse tipo de refatoração pode ser um indício de que um método está utilizando atributos de outra classe e esteja interagindo pouco ou em nenhum momento com os atributos de sua própria classe, nesse caso, talvez esse método deva ser movido para essa outra classe. De igual forma, se um atributo estiver sendo muito utilizado por métodos de outra classe, é necessário verificar a viabilidade de mover esse atributo para a outra classe que o esteja utilizando com maior frequência.

A necessidade de uso dessa refatoração pode indicar que o método ou atributo a ser movido esteja atrapalhando a medida de coesão de certa classe. Se um atributo está alocado em uma classe A, mas, é utilizando em sua maior parte pela classe B a coesão das duas classes pode ficar prejudicada. Isso ocorre porque os métodos de B podem estar utilizando aquele atributo de A e não utilizem adequadamente os atributos de sua própria classe. Pode ocorrer ainda nessa situação, o fato de que os métodos de A não estejam utilizando em nenhum momento um atributo que foi alocado ali que esteja sendo utilizado somente pela classe B.

No exemplo abaixo utilizado por Fowler (1999), o método participate foi movido para a classe Project que estava utilizando método.

Antes da refatoração:

class Project {
  Person[] participants;
  ...
}

class Person {
  int id;
  ...
  boolean participate(Project p) {
    for(int i=0; i<p.participants.length; i++) {
      if (p.participants[i].id == id) return(true);
    }
    return(false);
  }  
}

... if (x.participate(p)) ...

Verificamos acima que a classe Person não utiliza o método participate, mas, o possui por um possível erro de estruturação.

Depois da refatoração:

class Project {
  Person[] participants;
  ...
  boolean participate(Person x) {
    for(int i=0; i<participants.length; i++) {
      if (participants[i].id == x.id) return(true);
    }
    return(false);
  }  
}

class Person {
  int id;
  ...
}

... if (p.participate(x)) ...

Na refatoração o método foi movido para a classe Project que faz o uso do mesmo. Essa refatoração deixou o código mais coeso, uma vez que, antes o atributo Person estava sendo acessado por um método alocado fora de sua classe.

Referência:

FOWLER, M. Refactoring: Improving the Design of Existing Code. 1. ed. Boston: Addison- Wesley Professional, 1999.

0 comentários:

Postar um comentário

Comentários:

Perfil

Formada em Sistemas de Informação e pós-graduada em Engenharia de Software.

Facebook

Views