2008-09-19 2 views
2

Я работаю над приложением, которое составляет около 250 000 строк кода. В настоящее время я единственный разработчик, работающий над этим приложением, которое изначально было построено в .NET 1.1. Всепроникающий повсюду - это класс, который наследуется от CollectionBase. Все коллекции баз данных наследуются от этого класса. Я рассматриваю рефакторинг, чтобы наследовать из обобщенного списка списков. Излишне говорить, что в книге Рефакторинга Мартина Фаулера нет никаких предложений. Должен ли я попытаться использовать этот рефактор? Если да, то каков наилучший способ решить этот рефактор?Как переработать с дженериками класса, который наследует от CollectionBase?

И да, есть единичные тесты на всем протяжении, но не команда QA.

ответ

1

250000 Lines является много рефакторинга, плюс вы должны принять во внимание несколько последующих:

  1. У вас есть отдел QA, который будет в состоянии проверили его рефакторинга кода?
  2. У вас есть модульные тесты для старого кода?
  3. Есть ли временные рамки вокруг проекта, то есть вы поддерживаете код, поскольку пользователи находят ошибки?

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

Если 2 да, то просто разветвите и начните рефакторинг, опираясь на те модульные тесты.

Отдел QA также поможет вам, так как вы можете указать им новый код для тестирования.

И, наконец, если клиенты/пользователи нуждаются в исправлениях, исправьте их первым.

2

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

+0

Я полностью согласен, нет ничего принципиально неправильного в базе сбора. – 2008-09-19 01:15:22

0

Я согласен с Томасом.

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

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

Я также лично немного изволен массовыми рефакторами, подобными этому. Поручите мне работу один раз. Это была моя первая работа за пределами правительства (которая, как правило, немного более прощает, как только вы получаете «владение», чертовски трудно уволить), и я был единственным веб-программистом. У меня появилось устаревшее приложение ASP, которое было плохо написано на моих коленях. Мой первый приоритет состоял в том, чтобы переделать черную вещь в нечто меньшее ... нехорошее. Мой работодатель хотел, чтобы пожары погасли, и больше ничего. Шесть месяцев спустя я снова искал работу: p Мораль этой истории: сначала проконсультируйтесь с вашим менеджером, прежде чем приступать к этому.

1

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

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

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

2

Если вы в собираются пройти через это, не используйте Список < T>. Вместо этого используйте System.Collections.ObjectModel.Collection< T >, что является скорее верным ударом коллекции CollectionBase.

Класс Collection<T> предоставляет защищенные методы, которые могут использоваться для настройки его поведения при добавлении и удалении элементов, очистке коллекции или установке значения существующего элемента. Если вы используете List<T>, нет способа переопределить метод Add(), чтобы обрабатывать, когда кто-то рекламирует коллекцию.

+0

Там я добавил дополнительную информацию. – 2011-07-26 19:23:15

2

Как выставлен CollectionBase из унаследованного класса?
Есть ли вещи, которые Generics могли бы сделать лучше, чем CollectionBase?

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

Но если есть много экспозиции от этого класса, вам, возможно, придется рассматривать это воздействие в качестве контракта и попытаться разложить экспозицию.

Смежные вопросы