Статьи

Рефакторинг в прогрессе

В настоящее время выполняется рефакторинг анализатора шаблонов WACT , SourceFileParser . Рефакторинг начался с версии 1.39.

SourceFileParser — эффективный центр движка шаблонов WACT, так что не обойтись без ошибок. Эта основная проблема, как вы можете видеть в Revision 1.38 , — это метод parse (), который представляет собой гигантский цикл, обрабатывающий все события XML (в настоящее время мы используем API XMLPull ), и в этой процедурной форме стало практически невозможно изменить. Отсюда необходимость рефакторинга…

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

Вот где это идет так далеко;

— Создал класс TreeBuilder, в который я выгружаю разделы процедуры из SourceFileParser :: parse () в соответствующие статические методы.

— Имена методов должны быть как можно более «нормальными», чтобы они «хорошо читались» так, как они отображаются в SourceFileParser.

— Сейчас я не хочу беспокоиться о работе с экземпляром TreeBuilder и любыми свойствами, которые он будет использовать, следовательно, с использованием статических вызовов. Использование его в качестве экземпляра из SourceFileParser вступает в «раунд 2» рефакторинга (возможно), как только я закончу создавать статические методы.

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

— Не слишком беспокоюсь сейчас о дизайне TreeBuilder. Кажется, превращается в своего рода «класс бога», делая что-либо и все, но подобные проблемы могут подождать, пока не будут сделаны основные изменения в SourceFileParser.

Одна полезная оптимизация, которая уже появилась, заключалась в устранении фрагмента кода, который снова появлялся в SourceFileParser. Неоднократно повторялось при добавлении статических методов, поэтому теперь такие методы, как TreeBuilder :: handlePlainTagOpen () и TreeBuilder :: handlePlainTagClose (), делегируют некоторую работу TreeBuilder :: handlePlainText (). В противном случае метод SourceFileParser :: parse () медленно начинает читаться человеком.

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