На этой неделе у меня только что работал какой-то устаревший код, который был похож (хотя и не так страшен) на то, что вы описываете.
Нет ничего, что могло бы вытащить вас из этого. конечный автомат может быть окончательной формой, которую принимает ваш код, но это , а не поможет вам туда добраться, и вы не должны принимать решение о таком решении, прежде чем распутывать беспорядок, который у вас уже есть.
Первый шаг, который я хотел бы сделать, - написать тест для существующего кода. Этот тест не для того, чтобы показать, что код верен, но для того, чтобы убедиться, что вы что-то не сломали, когда начнете рефакторинг. Получить большой кусок данных для обработки, передать его монстру и получить вывод. Это твой лакмусовый тест. если вы можете сделать это с помощью инструмента покрытия кода, вы увидите, что тестирование не распространяется. Если вы можете, создайте несколько искусственных записей, которые также будут использовать этот код, и повторите. Как только вы почувствуете, что сделали с этой задачей все, что можете, выходные данные станут вашим ожидаемым результатом для теста.
Рефакторинг не должен изменять поведение кода. Помни это. Вот почему вы знаете входные и выходные наборы данных, чтобы подтвердить, что вы не собираетесь ломать вещи. Это ваша сеть безопасности.
Теперь Рефакторинг!
Несколько вещей, которые я сделал, которые я нашел полезными:
Инвертировать if
операторов
Огромная проблема, с которой я столкнулся, это просто чтение кода, когда я не смог найти соответствующий оператор else
, я заметил, что многие блоки выглядят так:
if (someCondition)
{
100+ lines of code
{
...
}
}
else
{
simple statement here
}
Перевернув if
, я мог увидеть простой случай и затем перейти к более сложному блоку, зная, что другой уже сделал. не большое изменение, но помогло мне в понимании.
Метод извлечения
Я часто это использовал. Возьмите какой-нибудь сложный многострочный блок, возьмите его и отодвиньте в сторону своим собственным методом. это позволило мне легче увидеть, где происходило дублирование кода.
Теперь, надеюсь, вы не сломали свой код (тест все еще проходит правильно?), И у вас есть более читаемый и лучше понятый процедурный код. Смотри уже улучшилось! Но тот тест, который вы написали ранее, на самом деле не достаточно хорош ... он только говорит о том, что вы дублируете функциональность (ошибки и все) в исходном коде, и это только строка, на которую вы попали, как я уверен, вы найдет блоки кода, которые вы не можете понять, как попасть или просто не можете попасть (я видел оба в своей работе).
Теперь большие изменения, когда вступают в силу все шаблоны с громкими именами, - это когда вы начинаете смотреть на то, как вы можете реорганизовать это надлежащим образом. Существует более одного способа снятия кожи с этой кошки, и она будет включать в себя несколько шаблонов. Не зная подробностей о формате этих файлов, которые вы анализируете, я могу лишь бросить некоторые полезные предложения, которые могут быть, а могут и не быть лучшими.
Рефакторинг к шаблонам - отличная книга для объяснения шаблонов, которые полезны в этих ситуациях.
Вы пытаетесь съесть слона, и нет другого способа сделать это, кроме одного укуса за раз. Удачи.