25 июля 2012 г.

Создание и работа с RESTful web service в Groovy/Grails

Программисты всегда хотели упростить себе жизнь. Одна парадигма сменялась другой, появлялись новые языки, новые подходы. В мире веб-разработки произошли большие изменения - появились такие фреймворки, как Ruby on Rails, Django. И если еще можно вести долгие споры что же использовать для создания сайтов (PHP, RoR, Lift), то для веб сервисов в enterprise традиционно используется Java. Оглянитесь, не смотря на возможность реализации веб сервисов на руби или питоне или любом другом вашем любимом языке, enterprise-мир эту возможность не использует! В первую очередь это связано с проблемой интеграции данных сервисов в существующее java-окружение. К счастью существуют языки на 100% совместимые с java, которые могут помочь нам, простым скромым программистам, уменьшить рутину и оставить для разработки только самые интересные части системы. Одним из этих языков является Groovy. Сегодня я хочу рассказать как с помощью Groovy и Grails написать простенький веб-сервис. Кто знает, возможно вам удастся убедить вашего начальника, что время быстрой разарботки уже пришло?

21 марта 2012 г.

Ruby глазами Java-программиста

Программист должен быть любознательным и всегда с радостью воспринимать что-то новое. Именно поэтому я решил помимо знакомого мне Grails посмотреть на тот фреймворк, который был вдохновителем для его создания - Ruby on Rails. Но перед тем, как углубляться в фреймоврк было бы неплохо знать язык, который он использует. Сам по себе язык Ruby крайне простой, но мне, как C/Java программисту, он первое время показался просто мозговыносящим. Но если не держаться за старый опыт и открыться простоте Ruby то тогда всё получится :) В этой заметке я бы хотел привести моменты, которые меня особенно удивили.

29 февраля 2012 г.

Spring Web Flow и Grails 2

Предположим бизнесс-процесс вашего приложения требует от пользователя последовательности действий, которые он должен совершить. К примеру, в интернет-магазинах мы не можем посмотреть страницу благодарности за покупку не сделав этой самой покупки. Или мы не можем посмотреть какой-либо отчет, не указав критерии данных, которые должны войти в отчет. Для простых действий всё довольно тривиально, но если шагов перед завершением процесса должно быть множество, то мы рискуем превратить наш код в вермишель из хитросплетений вызовов и проверок. Для того чтобы этого избежать существует замечательный фреймворк - Spring Web Flow. И в этой заметке я приведу пример его использования в Grails 2.0.1.

7 февраля 2012 г.

Проксирование запросов БД

Недавно меня попросили написать приложение, которое бы проксировало запросы к БД и возвращало результат выполнения этих запросов клиенту. Не знаю стоял ли за этой просьбой здравый смысл - возможно кто-то хотел скрыть от клиентских приложений параметры БД, а возможно просто не осилил работу с БД в своем языка (странно, да?). Но задача есть задача и вооружившись Java, Spring и Apache CXF за пару часов я набросал простенький веб-сервис для запросов. О том как я это сделал и будет данная статья.

2 февраля 2012 г.

Инициализация double brace

Во всех языках программирования существуют красивые, лаконичные и простые конструкции, составляющие основу языка, а есть "хаки", глядя на которые невольно вспоминаешь собеседования и вопросы вида "вот вам 5 строк кода и 10 минут на то, чтобы объяснить как это вообще работает". Об одной из таких конструкций, а именно об инициализации double brace я и хотел бы сегодня рассказать.

24 января 2012 г.

Ссылки в Java

Все знают что такое жесткая (strong) ссылка. Мы сталкиваемся с ними ежедневно. Например, этот код:
StringBuffer buffer = new StringBuffer();
создаст экземпляр класса StringBuffer и поместит жесткую ссылку на этот экземпляр в переменную buffer. Что же заставляет нас называть такую ссылку жесткой? И какие они еще бывают? Ответы - под катом.

23 января 2012 г.

Подготовка к собеседованию на java-программиста-2 (уровень Middle)

Продолжаем популярную тему собеседований. На этот раз мне попалась компания, в которой большое внмание уделяется многопоточности. Под катом вы найдете 15 вопросов, которые были мне заданы на должность Staff Java developer.

19 января 2012 г.

Обзор EasyMock

Юнит-тестинг - тестирование классов или их методов в изоляции от других объектов системы. Обычно классы в Java зависят от других классов, таким образом чтбы протестировать какую-либо функциональность вам нужно будет создать экземлпяр класса, отличного от тестируемого, что само по себе противоречит идее юнит-тестинга. Mock-объект - интерфейс или класс-пустышка, в котором вы определяете результат вызова методов. Эти объекты и передаются классу, который мы хотим протестировать, т.к. при юнит-тестинге мы должны избегать зависимостей от любых внешних данных.

Мы можем писать такие классы-заглушки сами, а можем воспользоваться одним из Mock-фреймворков для симуляции таких классов.

В Java к самым популярным Mock-фреймворкам можно отнести EasyMock и jMock. Сегодня мы рассмотрим первый из них.

17 января 2012 г.

Вопросы на интервью по технологиям Java Spring и Hibernate

Продолжаем тему интервью. В прошлых статьях мы рассмотрели основные концепции, которые вы должны знать для прохождения интервью по Java, но основ языка недостаточно. Обычно компании предпологают, что вы уже владеете каким-либо популярным фреймворком и способы самостоятельно реализовать реальное приложение. На сегодня самыми популярными фреймворками являются Spring и Hibernate. Возможно скоро к этому must have списку добавиться GWT, а пока что давайте рассмотрим какие вопросы могут быть заданы вам при прохождении интервью на уровень staff developer.

12 января 2012 г.

Подготовка к собеседованию на java-программиста (уровень Middle)

Продолжим тему собеседований. В этот раз рассмотрим что вы обязаны знать, если претендуете на должность middle (staff) java developer (описание для уровня junior смотри тут).
Отдельные части текста нагло взяты из википедии, необъятных просторов интернета и, что самое страшное, головы.

Подготовка к собеседованию на java-программиста (уровень Junior)

Недавно в руки попала табличка, по которой в одной замечательной компании рекомендуют собеседовать java-программистов. Опуская моменты специфичные для данной конкретной вакансии попробуем очень вкраце пробежаться по вопросам, которые я бы рекомендовал повторить перед собеседованием на java-программиста. Это описание для уровня junior, описание для уровня middle (staff) смотри тут.

3 января 2012 г.

SOLID в 5 предложениях

Single Responsibility Principle
Не должно существовать более одного мотива для изменения данного класса.

Open/Closed Principle
Нужно избегать случаев, когда появление новых требований к функциональности влечет за собой модификацию существующей логики, стараясь реализовать возможность ее расширения.

Liskov Substitution Principle
Наследующий класс должен дополнять, а не замещать поведение базового класса.

Interface Segregation Principle
Клиент не должен вынужденно зависеть от элементов интерфейса, которые он не использует.

Dependency Inversion Principle
Абстракции не должны зависеть от деталей, в то время как детали должны зависеть от абстракций.

<? super E> и <? extends E> в коллекциях

Многие программисты путают (а некоторые и не знают) эти конструкции при работе с коллекциями. Что же они означают?

Первая означает, что объекты коллекции будут предками для Е, а вторая - объекты, которые являются подтипами Е. Таким образом при использовании <? extends E> мы точно знаем, что объект коллекции будет типа E или его потомком (т.е. совместимым с Е).
Пусть у нас есть такая иерархия:
Parent extends Object
Child extends Parent
и есть очередь LinkedBlockingQueue<Parent>. Мы можем вызвать конструктор данной очереди, передав ей List<Child>, потому что каждый Child является Parent, и мы не можем передать List<Object>, потому что Object может быть не совместим с Parent.

Так же вы можете перенести эту очередь в List<Object>, потому что каждый Parent является Object, но вы не можете перенести очередь в List<Child>, потому что этот лист будет ожидать того, что все элементы будут совместимы с Child.

Таким образом имеем простое правило: extends - для вычитки из коллекции, super - для занесения в коллекцию.