Как провести рефакторинг: разделить класс на два, которые общаются через интерфейс - PullRequest
1 голос
/ 23 октября 2008

Я только начинаю свой первый крупномасштабный рефакторинг, и мне нужно разделить (к сожалению, большой) класс на два, которые затем обмениваются данными только через интерфейс. (Мой Presenter оказался контроллером и должен отделить логику графического интерфейса от логики приложения). Используя C # в VisualStudio 2008 и Resharper, какой самый простой способ добиться этого?

Я собираюсь попробовать а) собрать членов для нового класса и «извлечь новый класс» б) навести порядок в) «Извлечь интерфейс» d) выследить любые ссылки на класс и преобразовать их в ссылки на интерфейс

но я никогда не делал этого раньше, и задаюсь вопросом, знает ли кто-нибудь какие-нибудь хорошие советы или ошибки, прежде чем я начну все разрывать на части ... Спасибо!

Ответы [ 6 ]

5 голосов
/ 23 октября 2008

Позвоните мне по-старому, но лично я использую описанные вами автоматизированные функции только для технических задач (например, переименование и т. Д.) *

Для всех других рефакторингов, таких как извлечение интерфейсов и тому подобное, я предпочитаю делать вручную. Вы поймете, что вы можете сделать еще больший рефакторинг, и, как правило, код выйдет чище.

3 голосов
/ 23 октября 2008

Детские шаги.

Шаг 1: Сделайте небольшое изменение, используя отличный Рефакторинг от Resharper.
Шаг 2: Тест (желательно модульный тест), чтобы убедиться, что код все еще работает
Шаг 3: Подтвердите контроль источника

Повторите эти 3 шага много раз.

Может быть, это не сработает, если вы выполните один из этих рефакторингов "должен быть большой шаг сразу" В этом случае сделайте как можно больше мелких рефакторингов, прежде чем окунуться в большой шаг.

1 голос
/ 23 октября 2008

У меня есть только один важный совет - убедитесь, что вы можете вернуться к состоянию, прежде чем запускать рефакторинг, не теряя ничего. Тогда просто погрузитесь и сделайте это. Вы можете в конечном итоге остановиться и начать все заново, но бояться нечего (если вы прислушались к моему единственному совету). Вы многому научитесь, делая это.

0 голосов
/ 19 мая 2014

, прежде чем делать, инвестируйте в контроль источников: изучите Git. Рефакторинг без SCM походит на вождение с завязанными глазами.

0 голосов
/ 23 октября 2008

Я никогда не использовал VisualStudio, но нахожу, что автоматический рефакторинг в Eclipse довольно надежен - по крайней мере, настолько же надежен, как если бы я делал ту же работу.

0 голосов
/ 23 октября 2008

Короткий ответ здесь сначала, я собираюсь написать в блоге об этом, спасибо за идею!

Итак, давайте предположим, что у нас есть это:

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

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

Сначала нам нужно преобразовать все прямые использования членов в косвенные, то есть квалифицировать их полем. Для этого используйте рефакторинг экстракта суперкласса для извлечения части Presenter в суперкласс:

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

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

Создайте поле в PresenterAndController, которое будет делегировать одно, и используйте Generate (Alt-Ins) для создания делегирующих членов. Они будут скрывать базовые методы, так как они одинаковы:

  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
    }
  }

Удалите Presenter из списка наследования, и все готово для разделения классов. Теперь вы можете извлекать интерфейсы, использовать базовые типы, где это возможно, и в противном случае приводить их в порядок.

...