2009-04-27 4 views
3

Я пытаюсь реорганизовать большое тесно связанное приложение и пытаюсь сделать его более удобным и гибким.Как реорганизовать тесно связанные классы?

У меня есть много модульных тестов, поэтому я надеюсь реорганизовать шаг за шагом.

Какой дизайн & Рефакторинг шаблонов следует рассмотреть при реализации/применении для выполнения этой задачи?

я могу думать о некоторых:

Также вы можете поделиться своим собственным опытом и передовой практикой для такого рода рефакторинга работы.

UPDATE

Я несу этот рефакторинг because of the reasons explained in this question. В принципе, я не могу внедрить систему плагинов, не извлекая пару интерфейсов, и эти интерфейсы сильно связаны, что требует отдельного приложения в 40 + DLL, чтобы просто компилировать без циклической ссылки.

+0

Я думаю, что вы можете найти книгу ([смотреть онлайн] (http://books.google.co.uk/books?id=9CL446IzhuAC&pg=PA38&lpg=PA38&dq=events+chapter+one+coupling&source=bl&ots= qmJTOuCz90 и сиг = EZKvZBjF8QmGohatC97HsmAqG0c & гл = еп & е = wj6tTqe5LcTX8gON_YyiCw & са = X & OI = book_result и кт = результат & resnum = 6 & вед = 0CEMQ6AEwBQ # v = OnePage & д = события% 20chapter% 20-ОН% 20coupling & F = ложь)) "на основе событий программирования: принимать события до предела " не принимать название по номинальной стоимости - глава первая дает проницательное описание и способ, с помощью которых уменьшить/сдвинуть связь на более низкие формы связанного поведения. –

ответ

0

Спасибо за все ответы. После того, как я изо всех сил старался изо всех сил, я обнаружил, что лучше всего создавать интерфейсы для всего. Это позволило мне свободно менять дизайн, и я только разбил сборку на день (день, потому что проект был большой, и мне нужно исправить так много ссылок и модульных тестов + некоторый рефакторинг).

После того, как вы извлекли и зафиксировали все интерфейсы, я могу создавать отдельные решения и свободно работать с дизайном.

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

8

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

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

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

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

+0

@Jeff Я добавил обновление к вопросу, объясняющее, почему я это делаю. –

+0

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

5

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

8

Это большой вопрос, и в ответ на него можно написать целую книгу. К счастью, у кого-то уже есть. Возьмите себе копию Эффективно работайте с устаревшим кодом от Michael Feathers. Это целая книга, посвященная ответе на ваш вопрос.

Это действительно хорошая книга.Я бы определенно поставил его там с Код Завершить, Дизайн шаблонов и Pragmatic Programmer на список книг, которые должны быть в библиотеке каждого разработчика.

+0

Я читал Code Complete и Pragmatic Programmer. В настоящее время мы изучаем работу с устаревшим кодом, глядя на весь раздел, посвященный методам Dependency-Breaking. –

+0

Да, это так. С обратной стороны книги: «Рассматриваемые темы включают в себя ... улучшение дизайна ... получение устаревшего кода в тестовую упряжь ... написание тестов, которые защищают вас от появления новых проблем ... обработки приложений, которые, похоже, не имеют любой структуры ... каталога из двадцати четырех методов устранения зависимости ». –

1

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

0

Некоторые большие советы от Phlip: Refactor the Low-hanging Fruit

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