Разбирать свой код, написанный в творческом порыве месяцы, а то и годы тому назад, - занятие малоприятное. Разбирать чужой код, даже если он написан не индусами, - это в десять раз хуже. Поэтому инструмент, который поможет разобраться в чужом коде, просто бесценен. Именно о таком инструменте я сейчас и расскажу.
В чём проблема?
Кто-то, конечно, может сказать, что чужой код для него совсем не проблема, что ему неоднократно приходилось с ним разбираться, и что разборки завершились успешно. И для того, чтобы понять, как работает код, и его исправить или оптимизировать, вовсе нет никакой необходимости в специальных инструментах: достаточно хорошо знать используемый язык программирования и используемые в коде библиотеки, а также представлять себе общую логику работы программы и внимательно вникать в комментарии. В общем-то, действительно, что уж тут говорить, при горячем желании или суровой необходимости разобраться можно если не в любом, то практически в любом программном коде. Что написал один человек, то сможет прочесть другой - раньше или позже, так или иначе. Однако проблема как раз в этом "раньше или позже". Если на написание нового программного кода уйдёт меньше времени, чем на разбор и "починку" старого, то программист будет абсолютно прав, если сразу приступит к написанию нового. Да и если времени уйдёт всё-таки больше, многие всё равно предпочтут писать свой код, нежели копаться в чужом. Так что, к сожалению, не всё так безоблачно, как могло бы показаться сначала.
Конечно, инструмента, который мог бы разобраться в чужом коде, а потом объяснить вам, что да как, и разложить всё по полочкам, к сожалению, не существует. Как и того, который бы сам поправил все ошибки в чужом коде и избавил бы вас от необходимости в этот самый код вникать. Если бы такие инструменты и существовали, вряд ли бы это было бы хорошо для нас с вами - терялся бы весь смысл самого существования профессии программиста. Тем не менее, разобраться в чужом коде вполне может помочь программный продукт, который извлечёт из кода логику работы, а затем представит в виде понятных каждому схем и диаграмм. С ними гораздо проще и быстрее можно составить представление о том, для чего в коде программы присутствует тот или иной класс, потому что большая часть людей всё-таки относится к визуалам; то есть, принимать и обрабатывать информацию им проще именно зрительно.
Поскольку в настоящее время очень распространены, стараниями корпораций Microsoft и Sun, языки программирования Java и C#, то и инструмент, о котором я вам расскажу, умеет работать именно с ними. Кто-то может сказать, что C++ тоже очень распространён, на что я могу ответить только тем, что со всеми вопросами о поддерживаемых языках программирования нужно обращаться не ко мне, а к авторам этого крайне полезного и удобного программного продукта. О котором, кстати, давно пора начать разговор, а то вступление, кажется, несколько затянулось.
Общий обзор CodeLogic
Как несложно догадаться благодаря названию этой статьи, программный продукт, о котором будет идти речь, имеет название CodeLogic. Вернее, продукта два: CodeLogic for Java и CodeLogic for C#. Просто они, скажем так, довольно похожи, а потому вряд ли имело бы смысл рассказывать о каждом из них по отдельности. Я, честно говоря, даже скачивать их оба не стал, а ограничился только тем, который для Java (как-то ближе мне этот язык, всё-таки). Но всё, что касается версии для Java, справедливо и для версии, работающей с C#, если верить описаниям продуктов на сайте их разработчика, компании Logic Explorers. Расположен этот сайт, к слову, по следующему адресу: logicexplorers.com.
Как я уже говорил, задача CodeLogic - это анализ программы и представление её в виде наглядных схем. Предварительной подготовки проекта для этого никакой не нужно: вы запускаете CodeLogic, указываете директорию, в которой находится проект, а затем наслаждаетесь тем, что программа за вас всё сама проанализирует и нарисует. Вам же останется только разобраться с тем, что именно она там нарисовала, однако по схемам, генерируемым CodeLogic, разобраться в логике работы и внутренней структуре программного кода можно несравненно быстрее, чем при простом его чтении.
При всём при том, что диаграммы в CodeLogic соответствуют всем правилам построения UML-диаграмм, пользователь может прекрасно разобраться в них и без каких бы то ни было специальных познаний в области UML. Всего программа генерирует три вида диаграмм: Class Diagram, Sequence Diagram и Flow Diagram. Посмотрев на них, вы легко сможете отличить одну от другой, а также понять, что именно каждая из них иллюстрирует. Несмотря на это, а также на то, что я когда-то уже рассказывал на страницах "КВ" о премудростях разных видов UML-диаграмм (см. статью "Просто и доступно об UML" в №40/2007), думаю, сказать несколько слов о каждом из видов диаграмм, поддерживаемых CodeLogic, будет совсем не лишним.
Диаграммы
Итак, первый тип - это Class Diagram, или же, говоря по-русски, диаграмма классов. Как написано в Википедии, "она описывает структуру системы, показывая её классы, их атрибуты и операторы, и также взаимосвязи этих классов". В Википедии, конечно, написано много всякого, и откровенной чуши тоже хватает, однако в данном случае всё верно на сто процентов. На этой диаграмме в качестве блоков изображаются классы, а стрелки между ними, соответственно, изображают их взаимосвязи. В CodeLogic для того, чтобы перейти от сокращённого отображения классов к полному, то есть, помимо названий классов, программа также будет отображать список их методов с параметрами. Конечно, для полноценного чтения диаграмм данного типа лучше иметь некоторые представления об UML-диаграммах вообще и о диаграммах классов, в частности. Почитать о них можно подробнее, скажем, здесь: www.intuit.ru/department/se/intuml/3.
Следующий тип диаграмм - это Sequence Diagram, или, говоря русским языком, диаграмма последовательности. Что изображается на этой диаграмме? А на ней изображается разворачивающаяся во времени последовательность взаимодействий объектов. Здесь у нас есть объекты (тоже в виде прямоугольников) с отходящими вниз от них вертикальными линиями. Линии эти показывают течение времени, а стрелки, отходящие от них, указывают направления взаимодействия. Более подробно, опять-таки, на "Интуите": www.intuit.ru/department/se/intuml/5.
Ну и, наконец, третий тип диаграмм, которые встречаются в CodeLogic - это Flow Diagram, или диаграмма выполнения. Это уже не совсем UML - нам эта вещь знакома под именем блок-схемы, и составлению её учат ещё в школе, когда на информатике рассказывают об алгоритмах. Здесь всё довольно просто: в схематическом виде показывается выполнение того или иного метода того или иного класса, что позволяет быстрее разобраться в том, как работает небольшой кусок кода, а не приложение, в целом. Впрочем, блок-схема - это уже, так сказать, бонус, и многим будет быстрее прочитать код, чем смотреть, что да как, с её помощью. Хотя, безусловно, её полезность быстро возрастает с ростом сложности самого метода, для которого она строится, так что отрицать факт того, что она в CodeLogic совсем не лишняя, думаю, было бы глупо.
В общем-то, как видите, все диаграммы, которые строит CodeLogic, реально помогают разобраться во внутренней структуре программы.
То, о чём ещё не говорилось
Теперь давайте посмотрим, что ещё я не рассказал о CodeLogic. Во-первых, стоит сказать, что этот программный продукт поставляется как в виде отдельного приложения, так и в виде плагина для популярных сред разработки, таких, как Eclipse, IntelliJ IDEA, JBuilder, JDeveloper (для Java) и Microsoft Visual Studio (для C#). При этом разработчики на своём сайте большими красными буквами предупреждают, что продукт не поддерживает IntelliJ версии 5, что, на мой взгляд, выглядит несколько странно.
Что касается CodeLogic для Java в виде отдельного приложения (именно эту версию я себе скачал и именно с ней "игрался"), то самый главный её минус, на мой взгляд, это несколько непродуманный пользовательский интерфейс. Конечно, написать красивый и функциональный интерфейс с помощью стандартных библиотек Java сложно, но, по крайней мере, можно было бы хотя бы добавить панель инструментов, чтобы не нужно было каждый раз для показа куска кода, соответствующего тому или иному элементу диаграммы, залезать в меню. Ну и масштабирование диаграмм на экране тоже можно было бы сделать лучше, а не делать жёстко прошитые "зумы" 25%, 50%, 75%, 100%, 150% и 200%. Также раздражает некоторая задумчивость программы, которая, видимо, генерирует диаграмму заново каждый раз, когда переключаешься между отображением разных типов диаграмм.
Если вам нужно применить диаграмму, построенную с помощью CodeLogic, где-нибудь ещё, то её можно экспортировать в формат PNG или в формат Microsoft Visio, а также в XML UML. А можно прямо из CodeLogic распечатать, если вам нужно иметь диаграмму на бумаге.
Резюме
Что ж, давайте подведём итоги всему сказанному выше. Во-первых, CodeLogic - программа, конечно, далеко не идеальная и не всегда удобная в использовании, но ужасно полезная. Во-вторых, благодаря тому, что она доступна в виде плагина для множества популярных сред разработки, очень просто совмещать исследование кода и его правку. Ну и, в-третьих, благодаря экспорту диаграмм в картинки и в Visio CodeLogic превращается в мощный инструмент реверсного построения диаграмм для множества самых разных целей.
Хочу ещё раз отметить, что, несмотря на свою не такую уж маленькую стоимость ($300 на одного разработчика), CodeLogic помогает во многих случаях и потому вполне окупается. Использовать этот мощный инструмент можно в самых разных ситуациях: для исправления и поддержки чужого кода, для введения нового разработчика в проект, для документации уже написанного кода и для объяснения того, как много вы сделали, менеджерам проекта... Конечно, может быть, и можно разобраться в любом программном коде и без подобных инструментов, создающих настоящий путеводитель по лабиринту его структуры и логики. Но, если честно, я бы предпочёл всё-таки пользоваться в таких случаях CodeLogic. Просто это действительно удобно.
Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by