суббота, 24 октября 2009 г.

Клиент для твиттера

Попытаюсь описать свой опыт работы с NetBeans, Java и библиотеками eseyMock, Mokito, twitter4j при создании зачатка Twitter-клиента.

Ногами сильно не бить, пишу по памяти - так что, что-то могу и упустить, что то и приукрасить. В любом случае, под катом много букв. Я не буду приводить код в топике, дабы не делать его ещё объемным.

Итак, первым делом потребовалась среда, поскольку я не думаю, что с одним блокнотом далеко бы ушёл. Качаю знакомый Eclipse и расширения для Java, получилось примерно 270 МБ. Вроде всё установил и готов к началу работы, но захотелось попробовать такого зверя как NetBeans (среда которая как раз и затачивалась под Java). Скачал её - 300+ МБ. Но в любом случае не пожалел.

1. IDE = NetBeans

Дальше мне потребовались API для работы с Twitter. Чего уж проще - идём на сайт twitter.com внизу странички есть ссылочка «API», открываем её и выясняем, что добрые люди уже всё для нас обернули разными языками, бери и пользуйся. Раз уж я решил писать на Java, то и обёртку API я искал для Java. Переход по ссылке привёл меня к 4м обёрткам на выбор. Это уже потом я понял, что выстроены они по активности скачивания и новизне. Решил попробовать библиотеку jTwitter мне он показался достаточно удобной. Поработав с ней менее полу часа, отказаться. Причин уже не помню, чем-то она меня не устроила. Далее мой взгляд упал на twitter4j-2.0.9 - пакет большой и на первых парах кажется не удобным. Но достаточно хорошее описание убирает все преграды.

2. Библиотека = twitter4j

Ну, а теперь пора за работу. Но как же прикрепить к моему новому проекту эту библиотеку? Я был похож на мартышку с очками. И так её прилажу и эдак поверчу, а оказалось всё очень просто.
  1. Открываем окно Projects (Ctrl + 1)
  2. там находим папку Librares правый щелчок мышки
  3. "Add JAR\Folder".
  4. Далее указываем скачанный jar файл обёртки.
Попробую подключиться к твиттеру. Как бы первый шаг он - важный самый. Да заодно и библиотеку проверю на работоспособность, а то вдруг опять что-то не то скачал и мне не понравиться. Процедуру я назвал ChckLogindata(), и в последствии я её пару раз переписывал, но суть её не изменилась.

Я подумал, что данный клиент не обязательно должен быть только для твиттера. Поэтому я завёл Интерфейс в отдельном пакете CommonClientLibares, ClientWrapper - здесь описаны только общие моменты для всех клиентов. Например Подключение к серверу.
Данный интерфейс был наследован в Классе TwitterWrap, который в свою очередь лежит в пакете TwitterClient. Фактически это класс обёртка над обёрткой API, я думаю, что можно было бы так не заморачиваться, но всё же этот подход кажется более правильным. К тому же без него я бы не смог попробовать TDD (Test-Driven Development).

Раз уж я затронул это страшное слово TDD, расскажу немного о своём тяжёлом опыте.
1. Никакого TDD в этом проекте не получилось. Не могу я себя заставить писать тест, а потом код. Хотя я и покрыл TwitterWrap тестами на 60% сделано это было уже после того, как я описал все функции в классе, а остальные 40% появились позже. На их покрытие у меня не хватило умения.
2. Первым делом, пока не было работы с библиотекой twitter4j, я вполне успешно следовал пастулатам TDD, было всё легко и понятно, использовалась стандартная библиотека jUnit. А потом, каюсь, сломался :).
3. Сначала для подмены twitter4j я попытался использовать библиотеку easymock-2.5.2. Но ума ей дать не смог. Насколько я понял, она создаёт МОКи только на основе Интерфейсов. А у меня в распоряжении имеется вполне себе работоспособный класс.
4. Гугление привело меня к другой обёртке. Которая, кстати, меня очень порадовала, имя ей mockito. Данная зверюга умеет создавать МОКи как на основе Интерфейсов ,так и на основе классов. Так же при помощи не хитрых манипуляций можно сказать МОКу, что мы будем ожидать при передачи определённых данных. Скачать библиотеку можно здесь
5. Умений мне не хватило, когда я стал получать специализированные листы от twitter4j. Думаю как говорит Александр, запишем это в технический долг, к которому необходимо будет вернуться, когда я поднаберусь в этом деле.
Вот собственно и история с TDD на данный момент.

Но вернёмся к нашим грядкам. Я построил обёртку над оберткой, и теперь осталось её обростить мясом пользовательского интерфейса.

Первым делом захотелось создать окно ввода Логина и Пароля. Вот здесь меня и ждала неприятность. Как же в этой среде реализовать вызов своего дочернего окна? Спустя время я дотумкал, что здесь всё просто. Как оказалось, я просто создавал окно не того типа. Необходим jDialog, ну, по крайней мере, с ним не было проблем. Что бы создать такой класс в NetBeans необходимо выполнить следующие действия:
1. Нажимаем горячую клавишу ctrl+N или File -> NewFile
2. Выбираем пакет Swing GUI Forms -> jDialog Form
3. Готово.

Вот теперь можно подключаться к системе. При выборе из ниспадающего меню будем получать различные сообщения, а при выборе персон будем отображать его твиты.

А ещё, хочется отправлять приватные сообщения пользователям или просто говорить в эфир, ну или же отправлять replay. Для этого я создал ещё одно окно, где можно писать сообщения, и ставить флаги, приватное сообщение, или replay.

Ну и поскольку не реализован ещё весь интерфейс, а в твитах частенько бывают ссылки, необходимо реализовать хоть какую-нибудь возможность копирования текста из сообщения. Для этого будем открывать диалоговое окно, с текстом сообщения.

Также реализуем "маленькую радость" поскольку сообщение иногда отправляют реплэями, то хочется читать сообщения, на которые послали ответы.

Вот кажется и всё.

Затрачено было ~ 25 часов.
+ ещё часа 3 на то, что бы разобраться с Google Code
Посмотреть можно здесь

Огромное спасибо Пшеничному Николаю без него у меня бы ничего не получилось.

2 комментария:

  1. Ждем переработки статьи и исправления ошибок.
    Если я правильно понял, то этот пост ты опубликовал в 3 часа ночи? :)

    ОтветитьУдалить
  2. Ну пост переработан. :) Спасибо.

    ОтветитьУдалить