Как кардинально перестроить систему, сохранив при этом функциональное поведение? - PullRequest
0 голосов
/ 31 июля 2009

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

Основная проблема заключается в том, что основная часть бизнес-логики находится в хранимых процессах (а остальное в файлах кода за интерфейсом пользователя), и не существует модели бизнес-предметной области, о которой можно было бы говорить. Мне нужно преобразовать логику из базы данных (и вниз из пользовательского интерфейса) в код, но поведение приложения фундаментально связано с этими хранимыми процессами. Таким образом, вопрос заключается в следующем - как вы идете о полной реорганизации такого рода?

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

Спасибо!

Редактировать Я должен был сказать, в идеале я хочу итеративно перестроить, в течение цикла многократного выпуска.

Ответы [ 4 ]

3 голосов
/ 31 июля 2009

ИМХО самое важное - разработать множество хороших тестов, которые охватывали бы всю функциональность, которую вы хотите сохранить.

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

2 голосов
/ 31 июля 2009

Это больно, но первый большой вопрос: вам действительно нужно сделать эту реархитектуру? Если проект базы данных более или менее нормален, можете ли вы вместо этого спроектировать новый материал и оставить старый в покое? Каждый рефлекс жаждет навести порядок, но с точки зрения бизнес-пользователя, какой уровень инвестиций необходим и каков окупаемость?

Вы уже определили итеративное изменение как подход. Для того, чтобы это работало, это означает, что в системе есть некоторый уровень детализации, который позволяет вам изменять некоторые части, не затрагивая другие. Предположительно, ваша идея заключается в том, чтобы придать какую-то новую ценность для бизнеса и одновременно очистить некоторую часть приложения - эффективно амортизировать стоимость изменений по многим ценным результатам, «налог на сбор мусора» при доставке новых материалов. Это "налог" приемлем?

Так что я думаю, что допущение гранулярности - это то, что вам нужно проверить. Определите маленький кусочек. Попытка рефакторинга. Считаете ли вы, что это такое изолированное изменение, как вы надеетесь? Была ли цена, как вы ожидали? и главное ... какие минусы есть? Есть вероятность того, что ваш код работает хуже, чем существующие хранимые процедуры. Разработка «налога» это одно, а выполнение во время выполнения «налога» это совсем другое дело.

1 голос
/ 31 июля 2009

Занимайтесь бизнес-логикой хранимых процедур и пользовательского интерфейса отдельно. И возьми SP первым. По одному:

  • написать процедуру, которая вызывает SP
  • Испытай это до чертиков
  • перенаправить любой код из SUT на вызовите эту процедуру вместо SP
  • записать бизнес-логику в это процедура (продолжая проходить все тесты, конечно )
  • падение SP

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

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

0 голосов
/ 31 июля 2009

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

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

...