В своей книге Физерс на четырех сотнях страниц излагает опыт организации сопровождения широкого спектра программ и дает читателям общее представление о том, какие проблемы и задачи встают перед теми, кому надлежит работать над изменениями в существующем коде.
Первая из трех частей книги посвящена описанию внутренних механизмов, связанных с изменениями кода, где Физерс делает акцент на четырех причинах, приводящих к необходимости изменений в программе. Наиболее частые изменения связаны с введением новых свойств в программу, а также с устранением ошибок. Вместе с тем значительные работы могут иметь отношение либо к улучшению структуры кода, либо к его оптимизации. Структурные действия над программой часто называют ее реорганизацией или рефакториногом и связывают, например, с удобством ее эксплуатационного сопровождения. Тогда как оптимизацию кода можно считать изменением программы, улучшающим характеристики выполнения существующих у программы функций, например времени работы или экономии требуемой для этого памяти.
Излагая принципы работы над изменениями кода, предусматривающие уменьшение риска от их проведения, Физерс пишет о необходимости получения ответа на следующие вопросы: какие изменения нужно сделать; что нужно сделать, чтобы убедиться в их правильности; как убедиться, что изменения ничего не нарушили; до какой степени можно пойти на изменения, чтобы они не оказались излишне рискованными. В книге рассматриваются два способа внесения изменений – правка наудачу и покрытие или модификация, отражающие две системные возможности. Первая работает по принципу начальной настройки, а вторая с использованием обратной связи, когда на каждое изменение имеются тесты и проверки осуществляются на протяжении внесения изменений в код с последующими исправлениями ошибок.
В книге можно найти и алгоритм выполнения изменений в унаследованном коде: определение точек изменения в коде, нахождение тестовых точек, разрыв зависимостей (являющихся помехами для тестирования), написание тестов, внесение изменений и реорганизация кода.
Весьма интересны в книге мысли автора по поводу представления кодов в виде текстов, что облегчает поиск зависимостей и помещение текстов в разрыв. При этом приходится считаться с необходимостью распознавания зависимости в случае, если нельзя получить доступ к значениям, которые вычисляет код, а также ее разделения, если невозможно ввести в среду тестирования даже фрагмент кода для выполнения. Кроме того, как отмечает автор, при попытке написать тест для существующего кода обычно заметно, насколько он подходит для тестирования, поэтому приходится прибегать к понятию шва – места в коде, в котором можно изменить поведение программы, не правя ее в этом месте. В главе, завершающей первую часть книги, излагаются сведения по инструментальным средствам, таким как автоматическая реорганизация кода, имитация объектов, блочное тестирование, тестирование с помощью среды Junit (TestCase) и переносимой системы CppUnitLite, тестирование в открытой среде NUnit, блочное тестирование xUnit, а также ряд средств общего тестирования FIT и FitNesse.
Вторая часть книги посвящена проведению изменений с учетом многих факторов, например в условиях дефицита времени или в случае необходимости бесконечной череды изменений. Все восемнадцать глав этой части книги представляют большой практический интерес – они содержат постановки вопросов, связанных с изменением кодов, и предлагают конкретные ответы на них: «Как ввести новое свойство,если класс нельзя ввести в средства тестирования», «Требуются изменения в коде, но неизвестно, какие методы следует тестировать» и др.
В последней части книги излагаются более двух десятков способов разрыва зависимостей в классах с целью подвергнуть их тестированию. Формально эти способы относятся к видам реорганизации кода, поскольку каждый из них предполагает сохранение поведения программы. С их помощью можно подготовить методы, классы и совокупности классов к тестированию, благодаря чему вся программная система становится более удобной для сопровождения. Вот некоторые из содержащихся в книге способов разрыва зависимостей, включая описание их процедур: адаптация параметра, вынос объекта метода, расширение определения и др.
В приложении к книге дается пример описания процесса реорганизации кода для случая, связанного с извлечением алгоритма программы.
Книга вызовет, безусловно, большой интерес у широкого круга читателей в силу высокого уровня изложения и своей уникальности – в ней имеется единственная ссылка на работу другого автора. Вместе с тем следует высказать сожаление, что автор сконцентрировал свое внимание лишь на проектных работах, тогда как проблематика книги имеет отношение и к сопровождению ПО в условиях его эксплуатации в постоянно меняющихся условиях.
Физерс, Майкл. Эффективная работа с унаследованным кодом. – М.: «Вильямс», 2009. – 400 с.: ил.