Статьи

Рубиновая грань

Пару лет назад я работал над устаревшим корпоративным Java-проектом, в котором клиенты были одержимы производственной средой. Они не позволили моей команде развернуть новые версии приложений, которые мы разрабатывали. Самое интересное, что они не позволили нам работать с базами данных. Я имею в виду такие вещи, как резервное копирование, настройка производительности и так далее.

В один прекрасный день у их системных администраторов была отличная идея. Они решили физически перенести базы данных на другую машину без изменения IP-адресов. Конечно, они не сказали нам, потому что были уверены, что приложения ничего не заметят. Но вы знаете: в теории нет разницы между теорией и практикой. Но на практике есть. Действительно, по причине, которую я игнорирую даже сегодня, когда они восстанавливали базы данных, поля NULL всех таблиц были установлены в пустую строку. Ницца.

Как ни странно, нам позвонили с жалобами на наши заявки. Почему наши приложения перестали работать? Да, я бы их убил, но они создали интересную проблему. Нам нужен был скрипт для восстановления в NULL всех пустых строк в базах данных. Конечно, они по-прежнему параноидально относились к производственной среде, поэтому они попросили сценарий SQL, который можно было проверить перед его запуском.

Сюда входит Ruby. Мне нужен был быстрый и грязный скрипт, чтобы найти все пустые строки в базах данных. Я написал сценарий в спешке, и мне действительно не хватало функции из моих дней Perl. Я думал сохранить все пустые строки в многоуровневом хеше с именем таблицы, именем поля и другими вещами, которые я сейчас не помню. Ну, отсутствующей функцией была автовификация . Теперь, вообще говоря, я совсем не скучаю по нему, но в этой сложной ситуации я не мог тратить много времени на поиски Руби. Поэтому я искал библиотеку, которая дала бы мне эту функцию. А вот и Руби Гранит.

Я наконец нашел эту фантастическую библиотеку, которая дала мне следующую особенность:

Это хорошо, не правда ли?
Теперь я хотел поделиться с вами этой историей, потому что она дала мне возможность подготовить почву для пары соображений. Это небольшой объем кода для относительно простой задачи, и я мог бы даже написать свой сценарий для пустых строк, используя другую технику. Но:

  1. Почему я должен заново изобрести колесо?
  2. Почему я должен упустить возможность прочитать хороший код ?

Этих двух вопросов достаточно, чтобы убедить себя копаться в этой библиотеке. В тот момент, когда я встретил это, я был влюблен. Если вы добавите длинный список очень уважаемых авторов , рецепт для любопытства готов 🙂

Объяснив причины, лежащие в основе моей серии статей о Ruby Facets, я могу представить саму библиотеку. Как вы можете прочитать в README , Ruby Facets — это первая коллекция расширений методов общего назначения и стандартных дополнений для языка программирования Ruby . Коллекция методов и общих дополнений довольно велика. Кроме того, он разделен на две части. Существует основная часть, которая предоставляет большое количество расширений для классов и модулей Ruby, таких как Array, Hash, Kernel и т. Д. Затем есть стандартная часть, которая предоставляет дополнительные модули и классы.

Одним из хороших аспектов библиотеки является то, как вам может потребоваться функция. Библиотека граней следует очень простому и интуитивно понятному шаблону.

Последний пример является наиболее полезным, поскольку он дает вам возможность получить только то, что вы действительно хотите. В общем, каждое требование этого типа дает вам только расширение, но есть некоторые разумные исключения, такие как facets / array / before . Этот шаблон запроса отлично подходит для библиотек, которые расширяют существующие классы, на самом деле ActiveSupport следует более или менее той же схеме для своих основных расширений.

Конечно, библиотека упакована как драгоценный камень, поэтому процесс установки очень прост. Вы можете начать играть с ним всего за секунду. Теперь я хочу показать вам небольшую хитрость, которую я использую для знакомства с библиотеками, которые добавляют расширения к классам Ruby. Следующее будет работать только с Ruby 1.9.x, так как он использует метод source_location . Вышеупомянутый метод, ссылаясь на официальную документацию, возвращает имя файла источника Ruby и номер строки, содержащие этот метод, или nil, если этот метод не был определен в Ruby . Такой классный метод! Посмотрите на следующие примеры, чтобы увидеть, как это работает:

Это работает хорошо и дает вам возможность сделать следующее:

Это может быть не самый привлекательный метод, но он хорошо работает для своей цели. Я решил снова открыть Class Я не открываю Class

Метод facets_ext

  1. получает все методы экземпляра класса получателя
  2. сопоставить массив с массивом массивов с символом и расположением метода
  3. выберите только те, которые связаны с гранями
  4. сопоставлять только символы и сортировать их

Точки 2 и 3 в некотором роде напоминают мне преобразование Шварца . Как вы можете видеть, этот метод не волшебен, он просто дает нам быстрый способ изучения библиотеки из консоли:

Я присоединился к строкам, чтобы сделать статью более читабельной. Так весело! Таким образом, вы можете исследовать библиотеку из консоли. Просто вставьте метод facets_extpry ).

В следующих статьях я сосредоточусь сначала на основных расширениях, стараясь быть как можно более полным. Некоторые части будут действительно захватывающими. Кстати, если у вас есть какие-либо предложения о том, на чем я должен сосредоточиться, они будут более чем приветствоваться.