Как справиться с плохим [закрытым] кодом

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

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

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

47
задан 3 revs, 2 users 89% 20 January 2010 в 08:56
поделиться

8 ответов

Майкл перья написал хорошую книгу об этой теме именно.

Эффективно работает с устаревшим кодом .

Еще одна замечательная книга Мартина Фаулера, Кент Бек и другие:

рефакторинг: улучшение дизайна действующего кода .

22
ответ дан 26 November 2019 в 19:48
поделиться

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

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

-121--2314761-

Ну, если вы собираетесь реформировать большие суммы кода в проекте, я бы порекомендовал использовать некоторую достойную версию, чтобы вы могли легко отступать и отступать легко. Учитывая, это, вероятно, является открытой дверью, но важной ИМО.

Кроме того, прежде чем начать попасть в сложный OO, попробуйте разбивать методы и функционировать на более мелкие. Обеспечение некоторого уровня атомности в каждом из функций, что облегчает поддержание кода, прочитанного и управления. Это все о небольших вещах, сломайте его в логические единицы эксплуатации, я делаю воздействие рефакторов на методе линии 1K. Это делает все виды модных вещей. Моя первая цель состоит в том, чтобы получить столько же вещей из нее на меньших кусочках, когда это сделано, я начну задуматься о лучшем дизайне oO, что намного проще, потому что я гораздо лучше понять на вещи.

Аспирин тоже работает хорошо.

4
ответ дан 26 November 2019 в 19:48
поделиться

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

-121--2991180-

XPath, по моему опыту, гораздо легче обойти голову. Я избегаю XSL, как чума, если смогу. Но вы правы, синтаксис очень разный, поэтому, если вы хотите переключиться с XSL на XPath, у вас впереди какая-то работа. Я не могу легко объяснить различия, но этот учебник должен дать вам некоторое представление о том, о чем XPath:

http://www.w3schools.com/XPath/xpath_examples.asp

-121--3677788-

Общие наконечники:

if (it is working)
   Do (not touch it);
else
{
   Make (as few modifications as possible)
   Or (it will stop working at all);
}

Это опыт поколений.

24
ответ дан 26 November 2019 в 19:48
поделиться

Это зависит от количества факторов, но наиболее важным является если у вас есть полномочия, чтобы изменить его.

Если вы делаете, Refactor его. Например, переименовывает классы / функции / переменные. Экстракт и обобщенные функциональности. Смотрите рефакторинг: Улучшение конструкции существующего кода (Библия для предмета). Прежде чем начать делать это, убедитесь, что код находится в правильном управлении версии (VC) и иметь хороший набор тестовых случаев. VC Пусть вы откатываетесь и тестируемые случаи помогают ловить неожиданные побочные эффекты.

Я предлагаю контролировать распределенную версию, такую ​​как Mercurial / Bazaar и Git, потому что она очень рефакторинга, не совсем структурирована, как добавление функций.

Если бы не было никаких тестов (общих), вы должны их создать. Прочитайте , работающие эффективно с устаревшим кодом . Особенно о «точке уплотнения» (не о сиамской кошке: P).

Если вы не создаете API обертки, который является очистителем.

Например:


Old code ====================
const ACT_SHOW = 'show';
const ACT_HIDE = 'hide';
function int DoThing(Object $Obj, Stirng $Action, Object $Param1, Object $Param1) {
     ....;
}
Added code ==================
enum Actions {
    show, hide;
};
class ActionDoer {
    private obj;
    ActionDoer($Object) {
        this.obj = $Object;
    }
    function int act(Actions $Action, $Param1, $Param1) {
        this.act($Action.toString(), $Param1, $Param1) ;
    }
    function int act(String $Action, $Param1, $Param1) {
        DoThing(this.obj, $Action, $Param1, $Param1) ;
    }
    function int show() {
        this.act(Actions.show, null, null);
    }
    function int hide(Color $ToBGColor, long $FadeTime) {
        this.act(Actions.hide, $ToBGColor, $FadeTime);
    }
}

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

Надеюсь, это поможет.

0
ответ дан 26 November 2019 в 19:48
поделиться

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

PEX - это инструмент, который я нахожу полезным (если вы находитесь в мире .NET World) для создания тестов для Legacy Code.

Наследийный код == код без тестов!

доброта,

Дэн

9
ответ дан 26 November 2019 в 19:48
поделиться

Когда я должен иметь дело с добавлением функциональности к плохому коду, мой обычный подход:

  • Написать автоматические тесты для каждой важной функции, которая должна работать (так как самый плохой код не имеет никаких тестов).
  • делают код изменения.
  • Убедитесь, что тесты все еще работают.

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

7
ответ дан 26 November 2019 в 19:48
поделиться

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

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

1
ответ дан 26 November 2019 в 19:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: