inicio mail me! sindicaci;ón
Everything NUMB3R5

Шаблоны проектирования - Маркер

Советские люди не знали что фломастер называется "маркером". Возможно что вскоре мы как раз забудем про слово "фломастер". Но речь идёт несколько о другом.

Недавно был на вокзале и покупал билетик - то ли мне хотелось съездить домой, то ли мне не хотелось ехать домой, но собирался, может даже не домой и не ехать, а так - погреться зашёл. В общем занял за мной мужчина "кавказской" национальности. По-русски говорит без акцента, одет прилично, то есть предметов одежды из бутика "Адидас" не наблюдалось. Да и вообще, не казался он на вид "чистокровным" грузином (или осетином), не важно, в общем обычный такой человек, но немного "чёрненький". Стоит он значит, никого не трогает "примус починяет". Вдруг подходит к нему молодой человек в штатском (ака "мент") и просит предъявить документы. Мужчина обижается, брови сводит домиком и артачится - мол, "А зачем? И кто вы вообще такой?". Парень в штатском рассказывает что ему закон блюсти предписано судьбой и даже бумажка свидетельствующая имеется, и не мешкая предъявляет документ. В общем спорить бесполезно, показывает мужчина паспорт и полицай уходит "не солоно хлебавши". Спустя две минуты подходит ещё один милиционер в маскирующем костюме "как у людей" и всё повторяется, разве что домик из бровей выглядит уж несколько более угрожающе. И только парень отходит, как подходит следующий (флешмоб, ни как иначе) и просит документы, мол, мания такая, смотреть в паспорта. Мужчина краснеет и, как следствие, злится (хотя может я и перепутал что здесь первично) и направляет полицая прямиком в сад, прилагая в качестве увесистого аргумента то, что его паспорт не такой уж и уникальный, что бы всем подряд показывать.

А мораль басни такова: объект типа "человек" был маркирован (густыми усами, носом "картошкой" и чёрными вьющимися волосами). И эта маркировка как раз и позволяла сотрудникам правохранительных органов распознавать в нём своего "клиента". Так вот и с паттерном всё точно так же.

Например интерфейс Serializable не имеет никаких объявленных методов и как раз предназначен для "маркировки" объекта, что бы другим было понятно у кого документы спрашивать.

Шаблоны проектирования - Адаптер

Есть на свете вещи, такие что можно потрогать - материальные вещи. Их обычно производить физически сложно и порой дорого. А можно зарабатывать не имея финального материального продукта - мечтать.

Вот представьте: сидите вы на подоконнике, плюётесь сверху вниз, плюётесь снизу вверх (или надуваете пузыри мыльные, если плеваться вам общественное положение не велит), а взгляд ваш где-то далеко - мечтаете одним словом. Грезите и даёте вещам имена.

Примерно так и появились на свет Шаблоны проектирования. Бандиты (Erich Gamma, Richard Helm, Ralph Johnson и John Vlissides) написали книгу (тут даже ссылку приводить не стану) и укрепили свои позиции китов философии. Но вот простые вещи доходчиво они так и не смогли объяснить. Попробую я объяснить некоторые из шаблонов на примерах проблем житейских.

Адаптер. Когда вы делали у себя в квартире ремонт, вы поставили новые розетки. Все они не похожи друг на друга - красные, белые и зелёные, и размеры и формы у них различаются, но есть общее сходство - дырочки в каждой розетки по две, эти дырочки расположены на одинаковом расстоянии и диаметр их одинаков. Но вот настаёт день "Икс" и вы обнаруживаете что в ванной комнате у вас розетка советского типа, а у любимого фена уже нормальная вилка (о боже! оно не входит!), но вот розетку поменять не можете - у стиральной машинки тоже старая вилка. "Да %б жешь вашу мать" - сетуете и идёте на ближайший рынок и покупаете переходник. Собственно всё.
Занавес. Адаптер!

У вас был интерфейс - розетки его реализовали, а вилки использовали. И вот вы обнаружили ещё один интерфейс - розетку в ванной комнате (нехороший интерфейс), тогда вы приобрели адаптер, который спрятал под собой некрасивый интерфейс и сделал вид что всё хорошо.

Если есть пожелание по поводу следующего мыльного пузыря шаблона проектрования - я открыт. Иначе выберу сам.

Хитрый порядок сортировки Vs ANSI SQL

Сортировка в SQL - дело простое. Чего уж там говорить, добавляем ORDER BY [Field] (A | DE)SC и дело в шляпе. Но вот представьте, вдруг вам понадобилось вывести результат в следующем порядке поля Field: 1, 3, 2, 5, 4. Тут уж ASC и DESC окажутся бессильными. Но что делать когда совсем не хочется логику сортировки выносить за рамки SQL? Вот такая ситуация у меня однажды и случилась (да чего уже врать - два раза по однажды).

Однажды суровой Харьковской зимой приходит на моё имя тикет, мол клиент хочет что бы статьи на его сайте сортировались, да не просто так, а хитро-хитро, и привёл пример: 1, 3, 2, 5, 6 - вот так вот хочется сортировать, а иногда сортировать иначе. Пригорюнился я, да делать нечего. Сортировать так сортировать, хитро так хитро. Засучил рукава, отложил Реверси и закипела работа. Сразу нарисовались три варианта реализации:

  • Сортировку вынести в Java-код
  • Сделать дополнительное поле в таблице и по нему сортировать
  • Заколдовать MySQL что бы он сам всё делал
Вариант с Java-кодом не похож на способ действия настоящего хакера, так что он остался, как говорится - "на крайняк". Дополнительное поле выглядит гораздо интересней, да вот под задачу не подходит, так как порядок от случая к случаю меняется. Остался только один путь, и как истинный джедай, поковырявшись волшебной палочкой в интернете, нашёл хорошее решение:
SELECT a.name, a.description FROM articles a ORDER BY FIELD(a.type_id, 1, 3, 2, 5, 6)

Дальше уже было всё менее интересно: содержимое ORDER BY FIELD стало формироваться динамически, клиент подарил нам радость своей улыбкой. А у меня осталась тоска в сердце - а ведь работать будет только на MySQL.

Второй раз история повторилась уже летом. Другой клиент, другой проект, другая задача, а вот сортировка по-прежнему- хитрая-хитрая. Но теперь-то мы знаем что делать! Но увы, Orcale != MySQL, и СУБД наотрез отказалась понимать экзотический запрос многозначительно выкрикнув что-то вроде "ORA-01234: Ахтунг, случилась ошибка!". Делать нечего - надел ласты и костюм и занырнул в интернет, да поглубже. И вот, при помощи разговорника удалось вымолвить на аборигенском диалекте:
SELECT a.name AS NAME, a.description AS DESCRIPTION FROM articles a ORDER BY DECODE(FIELD, 1, 3, 2, 5, 6)

Клиент опять улыбается, а у меня опять тоска - ну почему ANSI SQL не предусмотрел такие вещи?