- PVSM.RU - https://www.pvsm.ru -
Приветствую!
Рад сообщить, что в прошедшие выходные, после долгого затишья, состоялся релиз моей небольшой, но смею надеяться, полезной поделки — гема TheSortableTree [1] (rails 3, rails 4).
TheSortableTree — это гем, который помогает организовать отрисовку Nested Set деревьев. Но самое главное то, что он позволяет легко и просто управлять вашим Nested Set деревом с помощью удобного перетаскивания элементов в нужное место.
В текущей версии гема решена самая главная проблема — скорость отрисовки. Раньше она была чудовищно медленной. Сейчас (в среднем) можно получить скорость отрисовки 1500-2000 узлов в секунду. Я считаю эту скорость приемлемой и достаточной для большинства прикладных нужд.
Ниже (если вам интересно) немного истории создания гема, благодарности, планы, и рассказ о том, как на open source проекты влияет распитие крепкого черного чая вечером после работы.
P.S:
Anonym [2], возможно, ты будешь удивлен, но в этом релизе гема самую большую роль я отвожу тебе, хотя, я тебя практически не знаю и, возможно, ты никогда не программировал на ruby.
Интерес к nested set и его отрисовке у меня появился тогда же, когда я познакомился с ruby и ruby on rails. Это был год 2008.
Если вы помните, в то время реализация nested set алгоритма на ruby была в начальном состоянии. Мы использовали nested set для формирования дерева комментариев. Главной проблемой работы с вложенными множествами стало то, что приличного и достаточно распространенного решения для отрисовки деревьев фактически не было. Мы велосипедировали как могли.
В тот момент я захотел рисовать деревья простой рекурсией. Почему? Потому что этот подход, на мой взгляд, довольно прост в реализации, понятен для понимания и практически не содержит магии.
В 2009-2010 годах в моих проектах уже работала первая версия кода для отрисовки деревьев. Тогда код был совсем плох — классическая каша из вида и логики. Мне не удавалось найти время для расчистки авгиевых конюшен. Но! Код работал.
В конце 2011 я вычислил код, отделил логику от представления и оформил первую версию гема. Проблемы были, но я надеялся на коллективный разум github'a. В любом случае могу сказать, что в некотором плане код стал красивым. Но все еще ужасно медленным. Я даже не хочу вспоминать эти страшные цифры.
В конце 2012 случайная беседа с хабрапользователем Anonym [2] натолкнула меня на мысль, что мой код работает безбожно медленно и так быть не должно. И если до этого я ждал доброго дядю с github'a, который мне подскажет что нужно изменить в моем коде, то в тот момент меня разобрал дикий интерес: что же не так?
Странно, но почему-то именно после виртуальной беседы с Anonym [2] в одной из веток Q&A хабра, сидя дома за чашкой вечернего чая я прокрутил в голове основные фрагменты своего кода и нашел узкое место.
Решение было таким ужасно простым, что даже ввело меня в ступор на некоторое время. В тот же вечер гем был пропатчен и скорость отрисовки катастрофически возросла. Код стал быстрым.
В январе 2013 будучи в отпуске я оформил новую версию гема и выложил в сеть. Сейчас я вижу, что интерес к моей поделке есть и мне это чертовски приятно.
Я очень признателен всем тем, кто помогал мне советами, патчами, консультациями и конструктивной критикой и скепсисом: прежде всего это читатели: vorbiz [3], UseRifle [4] и Anonym [2].
Спасибо некому mjsarfatti [5] за его скрипт nestedSortable [6] на базе которого работает перетаскивание в моем геме.
Спасибо Иконзе [7] за пару-тройку иконок.
Спасибо моей любимой жене за безграничную поддержку и то, что она меня вкусно кормит [8] пока я живу в виртуальном мире.
Сейчас я вижу несколько основных направлений над которыми стоит поработать:
1. Я вырезал из гема хелпер, создающий простой шаблон для древовидных комментариев. На мой взгляд такой функционал сразу стоит вынести в отдельный гем, основанный на моем геме. Хотя таких решений уже наверняка полно. И тут стоит серьезно подумать.
2. Есть много других решений для древовидных структур данных — acts_as_ordered_tree [9], ancestry [10]. Было бы хорошо сделать версию гема и под них.
3. Многие хотят, чтобы в больших деревьях можно было отрисовывать основные узлы дерева, а затем (при необходимости) подгружать дочерние элементы. Такой функционал, конечно, стоит реализовать. Вероятно, я этим вскоре займусь.
Я обнаружил, что перетаскивание на клиенте начинает существенно тормозить, если перетаскиваемых узлов более 1500 (делайте поправку на технические ресурсы). Это просто информация к размышлению. Пока, эта проблема для меня лично не актуальна и я не буду придавать ей существенного значения. Однако, возможно, вам это пригодится. Просто знайте порядок цифр.
В целом, я доволен тем, что получилось. Надеюсь моя небольшая поделка облегчит кому-то жизнь.
Конечно я надеюсь на конструктивную критику, отзывы и issues на странице проекта.
Успехов и удачи!
Автор: zayko
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/razrabotka/25442
Ссылки в тексте:
[1] TheSortableTree: https://github.com/the-teacher/the_sortable_tree
[2] Anonym: http://habrahabr.ru/users/anonym/
[3] vorbiz: http://habrahabr.ru/users/vorbiz/
[4] UseRifle: http://habrahabr.ru/users/userifle/
[5] mjsarfatti: https://github.com/mjsarfatti
[6] nestedSortable: https://github.com/mjsarfatti/nestedSortable
[7] Иконзе: http://iconza.com/
[8] вкусно кормит: http://open-cook.ru/
[9] acts_as_ordered_tree: https://github.com/take-five/acts_as_ordered_tree
[10] ancestry: https://github.com/stefankroes/ancestry
[11] Источник: http://habrahabr.ru/post/166711/
Нажмите здесь для печати.