Рефакторинг WinForm ClickNCode в MVP Passive View - PullRequest
5 голосов
/ 17 апреля 2009

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

Поскольку формы напрямую управляют объектами домена и источником данных (и наоборот), моя первая задача - создать объекты презентатора / контроллера и делегировать эти обязанности.

Приложение представляет собой приложение .NET 1.1, и я занимаюсь разработкой в ​​VS.NET 2003 с довольно ограниченной надстройкой рефакторинга. Я использовал генератор тестов для существующего кода, чтобы создать тесты блоков котельной плиты, затем прошел и вручную отредактировал каждый тест. Конечно, это завершает тестирование того, что делает код, а не обязательно того, что предполагается делать. Для новых классов я делаю TDD.

Какие-либо советы, ресурсы, подводные камни, на которые стоит обратить внимание при проведении рефакторинга такого масштаба?

Несколько ресурсов, которые у меня уже есть:

  • Коллекция книг по программированию; Рефакторинг , PEAA , WELC
  • Интернет (очевидно)
  • Большое количество напитков с кофеином

Обновление: Например, какие шаги вы бы предприняли, чтобы включить это:

    private void OneOfManyFormEventHandlers(object sender, System.EventArgs e)
    {
        string LocalVariable;
        decimal AnotherLocal;
        if (!this._SomeDomainObject.SomeMethod(ClassField, out LocalVariable, out AnotherLocal))
        {
            MessageBox.Show("An error occurred calling method");
            return;
        }

        this.FormControl.Value = LocalVariable;
        this.AnotherFormContorl.Value = AnotherLocal;

        this.AnotherPrivateMethod();
    }

В это:

    private void OneOfManyFormEventHandlers(object sender, System.EventArgs e)
    {
         this.FormPresenter.DoSomething();
    }

Ответы [ 3 ]

2 голосов
/ 17 апреля 2009

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

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

Я выполняю рефакторинг презентатора (который теперь содержит обработчики событий) отдельным этапом и представляю доменные объекты только после того, как я переместил все виды использования этих объектов из всех форм.

Так что мои шаги будут:

  1. Удалить зависимость пользовательского интерфейса от логики
  2. Создание объектов домена (если они еще не доступны)
  3. Рефакторинг докладчиков для использования доменных объектов
  4. Внедряйте услуги в соответствии с вашим дизайном, пока вы на нем

Пока я делал это, я начал вводить тесты на вновь введенных границах, чтобы убедиться, что я не нарушаю работающий код, или чтобы найти ошибки в существующем коде, который я перемещаю.

0 голосов
/ 21 августа 2009

Вы можете найти ответы на Реализация MVC с Windows Forms полезными, поскольку они говорят о различных вариантах при реализации MVC и MVP

0 голосов
/ 20 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...