Рубрики
2. Теория программирования UML

Как рисовать UML диаграммы классов.

Диаграмма классов.

Архитекторы программного обеспечения разговаривают на языке UML. Это такая своеобразная программисткая латынь. Использовать UML напрямую для программирования  неудобно, зато многие его понимают и используют для выписывания рецептов описания архитектуры системы. Нарисовал диаграмму классов и стало понятней что к чему. Её поймет и дельфист и жаваист, и сишник и  питоньшик, и сишарпер и рубист (вобщем все кто изучал ООП).

Центральное место в UML занимают диаграммы классов. Это букварь. В интернете можно найти огромное количество информации о диаграммах классов (структура, обозначение классов, интерфейсов, атрибутов, отношений и т.д. ), но при этом относительно мало информации о том, как осуществлять сам процесс проектирование. В этой связи хотел обратить внимание читателя на два особых момента.

От общего к частному...

Самое главное при создании диаграммы классов использовать принцип "от общего к частному". На самом деле  это один из фундаментальных принципов, который великие художники прошлого открыли уже много лет назад.

Представим, что Вы не умеете хорошо рисовать, но вам очень хочется нарисовать например чью-то голову. Вы берете карандаш, кладете лист бумаги и начинаете рисовать его левый глаз. Потратив на этот несчастный левый глаз больше часа, Вы беретесь за нос, затем за правый глаз, ухо и только потом пытаетесь дорисовать все остальное. Вполне вероятно, что итог работы Вас опечалит (не советую показывать жертве результат работы) – глаз, нос, рот и уши будут не на своем месте. Конечно, бывают среди нас гении, у которых получится шедевр, но все-таки, те, кто занимается этим профессионально проповедуют другой подход - "От общего к частному, от частного к общему". Вначале делается эскиз, "топорный" рисунок. Затем дальнейшая проработка. Например так:

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

Но начинать нужно с формирования набора базовых классов. Для этого нужно просто нарисовать прямоугольники и написать в них имена основных классов. Затем постепенно прорабатывать все остальное.

Например так:

Рубрики
Java

java 4-ever

Суперский видеоролик!

http://www.youtube.com/watch?v=kLO1djacsfg

Рубрики
3. Инструментарий

Desktop wallpaper в качестве инструмента проверки браузера под различным разрешением

Используем обои для рабочего стола

У моего монитора разрешение 1680x1050, а в работе иногда нужно время от времени смотреть как будет выглядеть содержимое браузер например под разрешением 1024x768 или 1280x800.

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

Инструмент готов к использованию. Конечно это не так радует глаз как какая-нибудь супрематическая конструкция, но зато вполне утилитарно. Теперь для того, чтобы быстро проверить верстку в 1024x768 -- подгоняем размер браузера под нужный прямоугольник и смотрим.

При желании можно поместить в свободное пространство какую-нибудь приятную вам картинку. Я поместил Дюка (жавный маскот с красным носом). Он сейчас стал опенсорснутым, то есть вы его можете свободно (т.е. на халяву и безболезненно) использовать в различных целях. Например выкладывать в блогах и на своих веб страничках. Подробнее можно прочитать в "Open Source Duke".

Сами картинки с Дюком можно взять здесь.

Рубрики
3. Инструментарий 4. Полезняшки Java

javajobs.ru + twitter и другие мелочи

Сегодня две новости про javajobs.ru.

Первая
Прикрутил twitter к сайту поиска работы для Java программистов Java Job .RU.
Интеграцию сделал через twitter4j.

Все предельно просто.
Шаг 1. Добавляем в pom.xml

        <dependency>
            <groupid>org.twitter4j</groupid>
            <artifactid>twitter4j-core</artifactid>
            <version>2.1.2</version>
        </dependency>

Шаг 2. Делаем все по учебнику:

            TwitterFactory twitterFactory = new TwitterFactory();
            Twitter twitter = twitterFactory.getInstance(twitterID, twitterPassword);
            twitter.updateStatus(msg);

Если верить документации, объекты класса Twitter можно использовать конкурентно.
Вот цитата из javadoc: "...This class is thread safe and can be cached/re-used and used concurrently...".
Можно спокойно сделать объект twitter полем вспомогательного класса и использовать его при необходимости.

Вторая
На нашем javajobs.ru появилась возможность публиковать объявление прямо на сайте.
Вот ссылка на форму Разместить вакансию для Java программиста.
Формочка сделана на GWT.
Я знаю что можно было бы сделать и проще. К сожалению "если у вас в руках молоток, все вокруг кажется гвоздями".
Поскольку GWT, очень удобный для меня инструмент, я решил его использовать.
По крайне мере в работе над большими ентерпрайзнутыми проектами он меня не подводил.

Рубрики
3. Инструментарий 4. Полезняшки Java

Звездочка (*) в шестёрке и хитрые bat-файлы

Запуск java-программы из командной  строки.

Представим такую ситуацию...

В результате вашей работы в качестве java программиста у вас получился один JAR-файл (для простоты назовем его mytools-1.0-SNAPSHOT.jar). Кроме него вы планируете использовать более десятка других jar-файлов.

Ваша программа должна запускаться из командной строки, а не из супер-пупер IDE которую вы обычно используете в работе. Например Вашу программу нужно отправить другому человеку, у которого нет такой же как у вас среды разработки (Eclipse, NetBeans, IDEA и т.д.) или запустить на удаленном сервере доступ к которому осуществляется только через SSH. Таким образом, для запуска вашей программы вам нужно собрать все требуемые для работы jar-файлы, прописать их  в CLASSPATH и для удобства написать простой runme.bat файл или (runme.sh для линукса).

Рецепт 1.

Требуется: maven, maven-assymbly-plugin

Если вы используете maven, то возможно Вам будет удобно воспользоваться  maven-assymbly-plugin. Найти информацию по нему можно здесь: http://maven.apache.org/plugins/maven-assembly-plugin/

В результате вы можете собрать в один JAR-файл, который содержит всё необходимое для работы.

Для этого:
1. добавляем в pom.xml настройки для maven-assymbly-plugin.

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2-beta-5</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        [...]
</project>

2. Запускаем сборку

mvn assembly:assembly

3. Получаем jar файл со всеми зависимостями:

target/mytools-1.0-SNAPSHOT-jar-with-dependencies.jar

Подробную информацию как работать со сборками можно получить открыв ссылку приведенную выше.

Дальше, я предпочитаю копировать jar-файл в отдельную папку lib. После этого остается только создать простой BAT-файл в котором будет содержаться строка:

java -cp mytools-1.0-SNAPSHOT-jar-with-dependencies.jar com.programmisty.Main %*

%* - означает что все аргументы командной строки будут переданы в main-класс.

Минусы: Если необходимо заменить только одну зависимость, приходится распаковывать и перепаковывать весь этот монолитный jar-файл.

Рецепт 2

Собираем все необходимые jar-файлы в одну директорию. Например с помощью maven это можно сделать командой

mvn dependency:copy-dependencies

Если вы не используете maven, можно просто скопировать руками все необходимые вам файлы.
Затем копируем наш mytools-1.0-SNAPSHOT-jar и все дополнительные jar-файлы в папку lib.

Если у нас windows, создаем BAT-файл runme.bat. В итоге у нас получается что-то вроде этого:

.
|_lib
| |_mytools-1.0-SNAPSHOT-jar
| |_commons-lang-2.4.jar
| |_commons-logging-1.1.1.jar
| |_commons-httpclient-3.1.jar
| |-...
|_runme.bat

Теперь, возможно старым java программистам будет интересно узнать, что в Java 6 наконец-то в classpath можно использовать звездочку (*).
Раньше многие делали так:

set CP=lib/mytools-1.0-SNAPSHOT-jar
set CP=%CP%;lib/commons-lang-2.4.jar
rem "и так до самого конца"
java -cp %CP% com.programmisty.Main %*

Те кто похитрее делал так:

setlocal ENABLEDELAYEDEXPANSION
set CP=
for %%i in (lib/*.jar) do set CP=!CP!lib/%%i;
java -cp %CP% com.programmisty.tools.Main %*

Если вы работаете в Linux, то для настоящего линуксоида получить список jar-файлов в директории и присвоить значение переменной -- задачка "школьного" уровня. По этой ссылке можно найти несколько способ ее решения http://www.sql.ru/Forum/actualthread.aspx?bid=38&tid=569498

Но теперь, если у вас java 6 это вообще не проблема, файл runme.bat может выглядеть следующим образом:

java -cp "lib/*" com.programmisty.tools.Main %*

Под линуксом wildcard (то есть звездочка) также успешно работает. Подробнее можно прочитать здесь: http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html в разделе "Understanding class path wildcards"