Простая визуализация структур данных в Java (OSEDUCONF-2021)

Материал из 0x1.tv

Докладчик

LJV (Lightweight Java Visualizer) — инструмент визуализации структур данных Java с использованием Reflection API для прохода по объекту и GraphViz для отрисовки. Проект изначально был разработан Джоном Хамером (John Hamer) в 2004 году на Java 1.4 под лицензией GPL, но с тех пор не обновлялся. Нами проект был переписан на современную версию языка Java, выложен на GitHub, а также добавлены новые фичи в виде дополнительных настроек отрисовки графов и более удобным интерфейсом для пользователя. LJV можно использовать для реверс-инжиниринга, а также он будет удобен преподавателям и студентам, чтобы изучать алгоритмы и структуры данных

Видео

Презентация

Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf Простая визуализация структур данных в Java (OSEDUCONF-2021).pdf

Thesis

История проекта

В 2004 году Джон Хаммер, который работал в Новой Зеландии, разработал инструмент для обучения студентов, чтобы они лучше освоили структуры данных. Долгое время, инструмент был написан на Java 1.4 и запускал заранее предустановленный на компьютере GraphViz. Но в осенью 2020 года мы решили возобновить проект. В первую очередь перед нами стоит цель исправить такие недостатки как: морально устаревший программный интерфейс (API), привязка к локально установленному GraphViz и отсутствие использования возможностей GraphViz новых версий.

Применение в преподавании и использование в Java Community

Изначальная идея возрождения проекта возникла в рамках подготовки курса Core Java Ивана Пономарёва для МФТИ. Диаграммы полученные с помощью LJV применялись на соответствующих лекциях о стандартных структурах данных в Java. Кроме того, была сделана интернет-публикация[1] и сделано выступление на профессиональной Java конференции SnowOne 2021[2][3][4], которые вызвали определённый интерес в сообществе Java-разработчиков.

Принцип работы

В режиме runtime инструмент строит внутреннее представление графа объектов памяти, используя Reflection API. Мы рекурсивно начинаем от передаваемого объекта и заходим в каждый связанный объект и собираем необходимую информацию. По ходу работы мы также формируем GraphViz представление с собранной информацией и сохраняем в текст на языке DOT, чтобы затем на его основе пользователь мог самостоятельно нарисовать граф в установленном локально приложении или с помощью онлайн-сервисов.

Изменения

Нами проделаны следующие задачи:

Мы обновили проект до Java 11, использовав практики построения API, которые выработались за 16 лет, а также новые возможности языка. Мы не стали писать на Java 14, так как данная версия ещё не стала популярнее Java 11, а мы ставим цель охватить больше людей, в частности преподавателей и студентов.

Полностью перестроен принцип генерации графа c использованием новых возможностей GraphViz, которые, в свою очередь, позволили легко добавить некоторую новую функциональность -- например, выбор направления отрисовки графа. Поэтому теперь пользователям доступна ещё больше возможных вариантов графа.

Изменён API инструмента на удобный method chaining, чтобы добавлять новые параметры к одному объекту.

А также код и документация выложены на Github, а сам проект доступен для скачивания в Maven Central.

Как использовать

У объекта LJV есть метод drawGraph куда мы передаём объект, который мы хотим визуализировать. Метод возвращает строку, которую мы загрузили в онлайн-сервис http://dreampuf.github.io и получили изображение:

<source lang="java">

  String graph = new LJV().drawGraph("Hello");

</source>

Ivchenko-img001-oseduconf-2021.png

Также перед вызовом drawGraph можно передать различные параметры:

<source lang="java"> String graph = new LJV()

 .setTreatAsPrimitive(Integer.class)
 .addFieldAttribute({"next", "color=red,fontcolor=red")
 .addFieldAttribute("prev", "color=blue,fontcolor=blue")
 .addFieldAttribute("first", "color=red,fontcolor=red")
 .addFieldAttribute("last", "color=red,fontcolor=red")
 .drawGraph(linkedList);

</source>

Ivchenko-img002-oseduconf-2021.png
Простая визуализация структур данных в Java (OSEDUCONF-2021)!.jpg

Примечания и ссылки

  1. John Hamer, Visualizing Data Structures as Graphs, ACE 2004 conference, https://www.cs.auckland.ac.nz/~j-hamer/ACE04-paper.pdf
  2. Ivan Ponomarev, LJV: What We Can Learn From Java Data Structures Visualization, https://dzone.com/articles/what-can-we-learn-from-java-data-structures-visual
  3. Иван Пономарёв. LJV: Чему нас может научить визуализация структур данных в Java -- доклад на Java-конференции SnowOne, 2021 г., https://snowone.ru/speakers/ivan_ponomarev
  4. Иван Пономарёв. LJV: Чему нас может научить визуализация структур данных в Java -- слайды к докладу на Java-конференции SnowOne, 2021 г., https://inponomarev.github.io/ljvtalk/

Plays:0   Comments:0

[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.