Pergunta

Eu apenas estou embarcando em meu primeiro refatorar em grande escala, e necessidade de dividir uma classe (infelizmente grande) em dois, que, em seguida, comunicar apenas através de uma interface. (My Apresentador acabou por ser um Controller, e precisa lógica GUI divisão da lógica App). Usando C # no VisualStudio 2008 e ReSharper, qual é a maneira mais fácil de conseguir isso?

O que eu vou tentar é a) Recolher os membros para a nova classe e "extrair nova classe" b) limpar a confusão resultante c) "Extract Interface" d) perseguir quaisquer referências para a classe e convertê-los para fazer a interface referências

mas eu nunca fiz isso antes, e me pergunto se alguém sabe alguma dica boa ou armadilhas antes de começar a rasgar tudo para além ... Obrigado!

Foi útil?

Solução

Passos de bebê.

Passo 1: Faça uma pequena mudança utilizando excelente Refactoring do ReSharper
. Passo 2: Teste (preferencialmente teste de unidade) para assegurar que o código funciona ainda
Passo 3: Comprometa-se com o controle de origem

Repita estes 3 passos muitas vezes.

Talvez isso não vai funcionar se você estiver fazendo um dos aqueles "deve ser um grande passo de uma só vez" refatorações. Nesse caso, faça como muitas pequenas refatorações quanto possível antes de tomar a mergulhar na grande passo.

Outras dicas

Chame-me à moda antiga, mas, pessoalmente, eu uso as funções automatizadas que você descreveu apenas quando é para tarefas técnicas (como renomear, etc ...)

Para todos os outros refactoring, como interfaces de extração e tal, eu prefiro fazer manualmente. Você vai descobrir que há ainda mais refatoração que você pode fazer e, geralmente, o código vai sair limpo.

Eu só tenho uma peça importante do conselho - tenha absoluta certeza de que você pode voltar para o estado antes de começar a refatorar sem perder nada. Em seguida, basta mergulhar e ir para ele. Você pode muito bem acabar por ter de parar e começar de novo, mas isso não é nada para ter medo de (contanto que você atendeu o meu conselho). Você vai aprender muito fazendo isso.

resposta curta aqui em primeiro lugar, eu vou escrever postagem no blog sobre isso, obrigado por uma ideia!

Então, vamos supor que temos o seguinte:

class PresenterAndController
  {
    public void Control()
    {
      Present();
    }

    public void Present()
    {
      // present something
    }
  }

Primeiro, precisamos converter todos os membros usos diretos para indiretos, ou seja, qualificá-los com o campo. Para fazer isso, use o extrato superclasse refatoração para extrair parte Presenter na superclasse:

  internal class Presenter
  {
    public void Present()
    {
      // present something
    }
  }

  class PresenterAndController : Presenter
  {
    public void Control()
    {
      Present();
    }
  }

Criar campo no PresenterAndController que será delegar um e uso Gerar (Alt-Ins) para criar os membros de delegação. Eles vão acontecer com métodos hide base, uma vez que eles são os mesmos:

  internal class Presenter
  {
    public void Present()
    {
      // present something
    }
  }

  class PresenterAndController : Presenter
  {
    private Presenter myPresenter;

    public void Present() // hides base method
    {
      myPresenter.Present();
    }

    public void Control()
    {
      Present(); // it now references method from this type
    }
  }

Remova Apresentador da lista herança e você é feito com as classes de divisão. Agora você pode extrair interfaces, tipos de uso base, sempre que possível e de outra forma arrumá-lo.

Eu nunca usei VisualStudio, mas acho que a refatoração automática no Eclipse para ser bastante confiável -. Pelo menos tão confiável quanto eu estaria fazendo o mesmo trabalho

antes de fazer, investir no controle de origem: aprender Git. Refatoração sem SCM é como dirigir com os olhos vendados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top