Рад сообщить, что в прошедшие выходные, после долгого затишья, состоялся релиз моей небольшой, но смею надеяться, полезной поделки — гема TheSortableTree (rails 3, rails 4).
TheSortableTree — это гем, который помогает организовать отрисовку Nested Set деревьев. Но самое главное то, что он позволяет легко и просто управлять вашим Nested Set деревом с помощью удобного перетаскивания элементов в нужное место.
В текущей версии гема решена самая главная проблема — скорость отрисовки. Раньше она была чудовищно медленной. Сейчас (в среднем) можно получить скорость отрисовки 1500-2000 узлов в секунду. Я считаю эту скорость приемлемой и достаточной для большинства прикладных нужд.
Ниже (если вам интересно) немного истории создания гема, благодарности, планы, и рассказ о том, как на open source проекты влияет распитие крепкого черного чая вечером после работы.
P.S:
Anonym, возможно, ты будешь удивлен, но в этом релизе гема самую большую роль я отвожу тебе, хотя, я тебя практически не знаю и, возможно, ты никогда не программировал на ruby.
Немного истории
Интерес к nested set и его отрисовке у меня появился тогда же, когда я познакомился с ruby и ruby on rails. Это был год 2008.
Если вы помните, в то время реализация nested set алгоритма на ruby была в начальном состоянии. Мы использовали nested set для формирования дерева комментариев. Главной проблемой работы с вложенными множествами стало то, что приличного и достаточно распространенного решения для отрисовки деревьев фактически не было. Мы велосипедировали как могли.
В тот момент я захотел рисовать деревья простой рекурсией. Почему? Потому что этот подход, на мой взгляд, довольно прост в реализации, понятен для понимания и практически не содержит магии.
В 2009-2010 годах в моих проектах уже работала первая версия кода для отрисовки деревьев. Тогда код был совсем плох — классическая каша из вида и логики. Мне не удавалось найти время для расчистки авгиевых конюшен. Но! Код работал.
В конце 2011 я вычислил код, отделил логику от представления и оформил первую версию гема. Проблемы были, но я надеялся на коллективный разум github’a. В любом случае могу сказать, что в некотором плане код стал красивым. Но все еще ужасно медленным. Я даже не хочу вспоминать эти страшные цифры.
В конце 2012 случайная беседа с хабрапользователем Anonym натолкнула меня на мысль, что мой код работает безбожно медленно и так быть не должно. И если до этого я ждал доброго дядю с github’a, который мне подскажет что нужно изменить в моем коде, то в тот момент меня разобрал дикий интерес: что же не так?
Странно, но почему-то именно после виртуальной беседы с Anonym в одной из веток Q&A хабра, сидя дома за чашкой вечернего чая я прокрутил в голове основные фрагменты своего кода и нашел узкое место.
Решение было таким ужасно простым, что даже ввело меня в ступор на некоторое время. В тот же вечер гем был пропатчен и скорость отрисовки катастрофически возросла. Код стал быстрым.
В январе 2013 будучи в отпуске я оформил новую версию гема и выложил в сеть. Сейчас я вижу, что интерес к моей поделке есть и мне это чертовски приятно.
Благодарности
Я очень признателен всем тем, кто помогал мне советами, патчами, консультациями и конструктивной критикой и скепсисом: прежде всего это хабражители: vorbiz, UseRifle и Anonym.
Спасибо некому mjsarfatti за его скрипт nestedSortable на базе которого работает перетаскивание в моем геме.
Спасибо Иконзе за пару-тройку иконок.
Спасибо моей любимой жене за безграничную поддержку и то, что она меня вкусно кормит пока я живу в виртуальном мире.
Планы
Сейчас я вижу несколько основных направлений над которыми стоит поработать:
1. Я вырезал из гема хелпер, создающий простой шаблон для древовидных комментариев. На мой взгляд такой функционал сразу стоит вынести в отдельный гем, основанный на моем геме. Хотя таких решений уже наверняка полно. И тут стоит серьезно подумать.
2. Есть много других решений для древовидных структур данных — acts_as_ordered_tree, ancestry. Было бы хорошо сделать версию гема и под них.
3. Многие хотят, чтобы в больших деревьях можно было отрисовывать основные узлы дерева, а затем (при необходимости) подгружать дочерние элементы. Такой функционал, конечно, стоит реализовать. Вероятно, я этим вскоре займусь.
Немного о граничных условиях
Я обнаружил, что перетаскивание на клиенте начинает существенно тормозить, если перетаскиваемых узлов более 1500 (делайте поправку на технические ресурсы). Это просто информация к размышлению. Пока, эта проблема для меня лично не актуальна и я не буду придавать ей существенного значения. Однако, возможно, вам это пригодится. Просто знайте порядок цифр.
Итого
В целом, я доволен тем, что получилось. Надеюсь моя небольшая поделка облегчит кому-то жизнь.
Конечно я надеюсь на конструктивную критику, отзывы и issues на странице проекта.
Успехов и удачи!
ссылка на оригинал статьи http://habrahabr.ru/post/166711/
Добавить комментарий