На смену старым методикам Буча и Джекобсона пришел язык UML (Unified Modelling Language), ставший с легкой руки фирмы Rational и консорциума OMG стандартом для объектно-ориентированного моделирования. UML часто считают вещью в себе, языком сложным в изучении и использовании. Во многом это справедливо, ведь создатель UML, компания Rational, разработала этот язык для своего собственного продукта Rose, и вполне естественно, что он не раскрывает сложные моменты анализа и моделирования.

Долгое время пакет Rational Rose был безусловным лидером в области автоматизированного проектирования с использованием UML. И только фирма TogetherSoft LLC отважилась бросить перчатку системе Rоse. Вызов этот выглядел чересчур уж смело. Шутка ли, написать на Java сложную систему моделирования программного обеспечения с генерацией исходных текстов! В принципе потенциал Together (так называется рассматриваемый продукт) был виден давно. И тем не менее только его последняя третья версия по-настоящему привлекает своей мощью и завершенностью.

Фирма TogetherSoft LLC продает три варианта своего пакета: Together/J Developer для разработчиков, использующих Java, Together/C++ Developer для проектов на Cи++ и объединенную версию для обоих языков — Together/E (Enterprise). Enterprise-вариант обладает самыми широкими возможностями.

Для ознакомления с продуктом вы можете получить через Internet его специальный вариант Whiteboard с усеченными возможностями.

Интерфейс пользователя

Среда Together, как уже было сказано, выполнена на языке Java. В третьей версии системы активно использованы компоненты библиотеки Swing, что сделало внешний вид оболочки весьма и весьма привлекательным (рис. 1). Однако необязательно довольствоваться выставленным по умолчанию «металлическим» стилем элементов управления, среду можно сделать похожей на Windows или UNIX.

Рис.1

Компоновка панелей в окне обычна для продуктов, которыми пользуются разработчики: слева вверху панель структуры проекта, слева внизу панель инспектора, в которой изменяются параметры элементов диаграмм, и третья панель — рабочая, называемая панелью диаграмм. В центре окна вертикально размещается панель с составляющими диаграмм. Инспектор оснащен переключателем закладок, и в любой момент можно перейти к настройке параметров, ведению и просмотру документации, списку гипертекстовых ссылок и т. п.

Панель структуры проекта имеет закладки. Щелкнув на одной, вы получаете возможность воспользоваться браузером файловой системы, другая позволит посмотреть все автоматические скрипты, заложенные в систему. Однако любимой функцией Together работающие с этой системой называют ее умение показывать фрагменты больших диаграмм. Щелкнув на закладке с самолетом, пользователь видит маленькую схему всей диаграммы как бы с большой высоты. Темным прямоугольником обозначен тот фрагмент, который виден в панели диаграмм в текущий момент. Перетащите этот прямоугольник на другой участок диаграммы, и Together покажет его вам на рабочей панели (рис. 2).

Рис.2

Построение диаграмм моделей в среде Together максимально упрощено: выбирают нужный элемент и мышью щелкают на панели диаграмм. Для создания нескольких одинаковых элементов достаточно удерживать нажатой клавишу . Связи между элементами устанавливают примерно так же: сначала из палитры выбирают связь подходящего типа, затем «протягивают» линию от одного связываемого элемента к другому.

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

Следует отметить насыщенность оболочки Together контекстными меню: множество действий можно производить командами, размещенными в них. Число команд столь велико, что потребуется активно поработать с проектом, чтобы запомнить их.

Еще одной важной возможностью среды Together является постоянная синхронизация исходных текстов и диаграмм. Каждая поправка в «исходниках» немедленно отражается на диаграммах, связанных с ними. Так же обновляются и родственные диаграммы.

Кроме прочего, Together имеет встроенное средство для автоматического «облагораживания» диаграммы нажатием всего лишь одной клавиши комбинации. Попробовав эту «штуковину», я пришел к выводу, что нельзя применять ее бездумно, ибо полученные диаграммы могут стать хуже, чем если бы вы сделали компоновку вручную.

Типичные приемы работы с Together

Для того чтобы оценить удобство работы с Together, посмотрите, как выполняются типичные операции по созданию модели, в нашем случае системы для библиотеки. Но сначала нужно создать новый проект. В опциях проекта по умолчанию укажем язык Java. При групповой разработке полезными окажутся опции включения проекта в хранилище версий для автоматического контроля. В дальнейшем Together позволит добавлять новые версии объектов и диаграмм и извлекать старые с помощью контекстных меню и главного меню среды.

Программа Together строит диаграммы для UML-моделирования девяти типов. Учитывая, что в основном модели начинают строить с диаграммы Use Case, и мы поступим так же. Разместим на рабочем поле действующее лицо (actor) и назовем его библиотекарем (Librarian). Затем обратимся к инспектору и выберем из списка stereotype подходящий пункт manager. Сразу же после этого стереотип <> возникнет на диаграмме. Пункт stereotype присутствует во многих диаграммах, и список, отображаемый им, изменяется в зависимости от контекста диаграммы и выбранного элемента.

Еще одно действующее лицо — клиент (Customer). Его также следует разместить на экране.

Чтобы очертить рамки действий системы, следует положить на рабочее поле компонент System Boundary и назвать его Library System. Внутри него располагаем три случая использования системы (Use Cases): Find Title by Keywords (найти книгу по ключевым словам), Find Title by Author (найти книгу по имени автора) и Check Out Book (выписать книгу). Для этого, щелкнув на компоненте Use Case и удерживая клавишу , помещаем три экземпляра Use Cases, выглядящие на диаграмме как овалы с текстом внутри.

Остается соединить библиотекаря со всеми тремя случаями использования, а клиента — только с Check Out Book. Для этого нужно щелкнуть на компоненте связи Communicates («взаимодействие») и с нажатой клавишей протянуть линии. С этого момента вы можете двигать составляющие диаграммы как заблагорассудится, но связи будут сохранены. Together разрешает для удобства делать линии связей изогнутыми. Нужно только захватить линию мышкой в месте предполагаемого излома и сдвинуть по своему усмотрению (рис. 3).

Рис.3

Строить диаграммы классов в системе Together удобно за счет хорошего интерфейса и некоторых специфических для этого продукта возможностей. К примеру, если такая диаграмма нужна для библиотечной системы, то, очевидно, мы выберем из палитры компонент Class и разместим на диаграмме три его экземпляра: Library (библиотека), Librarian (библиотекарь), Title (наименование книги). Другой способ: выберите из контекстного меню рабочего поля команду New?Class или же нажмите комбинацию клавиш +L. После этого нужно лишь поменять имена классов, заданные по умолчанию, на выбранные нами.

А вот теперь небольшой трюк. Обратимся к полю stereotype класса Library и выберем <>. Стереотип для класса Librarian — <>, а для Title <>. И в ту же секунду квадратики на диаграмме поменяют цвета. Это умная Together выделяет разные категории стереотипных классов разными цветами.

Добавление новых составляющих в классы производится с помощью контекстного меню элементов диаграммы или клавишных комбинаций. Для Java-классов в считанные секунды можно добавить атрибут (+A), операцию (+O), свойство (+B), член по модели (+T), конструктор и даже внутренний (inner) класс Java.

Главная концепция в Together — максимально полное использование моделей (patterns), поэтому важен такой пункт, как Member by Pattern (член по модели). Для всех инженеров при разработке ПО модели выполняют роль неких стандартных «шахматных комбинаций». Говоря проще, модели есть стандартные, часто используемые действия.

Программа Together располагает огромным списком моделей, способным удивить даже умудренного инженера-разработчика. В диаграмме классов, например, имеются компонент связи по модели (Link by Pattern) и компонент создания класса по модели (Class by Model). Если воспользоваться связью по модели, то Together «вывалит» вам длинный список разнообразных типовых соединений для элементов диаграммы классов. В случае с библиотекой библиотекарь получит список всех книг, т. е. некий массив-вектор. Поэтому-то такая модель связи, как Aggregation as Vector (агрегация через вектор), подойдет как нельзя кстати. Выбрав ее, мы предоставляем Together самой изобразить связь с ромбом, как это принято в UML для агрегации, и внести в исходный текст класса Library дополнительное поле типа java.util.Vector, которое, собственно, и отвечает за связывание между классами.

Создание класса по модели легче для понимания, поскольку тесно связано с книжными понятиями моделей, взятыми из популярного «талмуда» Patterns, являющегося своеобразной библией современной методики разработки ПО. Поэтому, обратившись к компоненту Class by Model, вы найдете здесь знакомые модели Adapter, Chain of Responsibility, Proxy, Singleton и т.п. От разработчика требуется лишь понимание того, что он делает.

Поясним это на примере реализации синглетона — класса, допускающего создание только одного экземпляра. Щелкнув на компоненте Class by Model, вызываем специальную диалоговую панель, в которой имеется список возможных моделей. Выбор любой из них в левой панели приводит к появлению справа списка параметров, влияющих на генерацию исходных текстов. Подредактируйте их, если это требуется. Если что-то покажется незнакомым, загляните в справочный текст в поле Description внизу диалогового окна (рис. 4).

Рис.4

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

/* Generated by Together */
public class Singleton {
protected Singleton(){}
  public static Singleton getInstance(){
      if (anInstance == null) {
        synchronized(Singleton.class) {
          if (anInstance == null) {
            anInstance = new Singleton();
          }
        }
      }
      return anInstance;
    }
/**
 * @link
 * @shapeType PatternLink
 * @pattern Singleton
 * @supplierRole Singleton factory
 */
  /*# private Singleton _singleton; */
  private static Singleton anInstance = null;
}

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

Рис.5

Любопытно, но в списке моделей Together нашлось место и компонентам JavaBeans и Enterprise JavaBeans. Можно изготовить компонент JavaBean, используя только что описанную технику создания моделей классов. Но Together предлагает и альтернативный способ, особенно удобный в тех случаях, когда уже есть готовый класс, из которого вы хотите получить компонент. Для этого нужно выделить атрибут выбранного класса на диаграмме, обратиться к его контекстному меню, скомандовать Choose Pattern и выбрать модель Property, чтобы превратить атрибут в свойство компонента. Опциями генерации методов чтения/записи можно определить, будет ли свойство читаемым, записываемым и видимым (рис. 5).

Со своей стороны, Together анализирует измененный класс и соображает, что перед ним теперь компонент. На диаграмме компоненты JavaBeans отмечаются маленьким прямоугольником, а у Enterprise JavaBeans в этом прямоугольничке есть еще и буква E.

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

Параллельное документирование диаграмм ведется в окне инспектора. Закладка Doc переключает его в режим редактирования и просмотра текста. Создавая описания, можно использовать теги HTML для форматирования. На завершающем этапе остается вызвать генератор документации, который изготовит ее электронный вариант либо в формате HTML, либо в RTF, либо в обычном текстовом виде.

Диаграмма последовательности действий в Together позволяет выстраивать наглядную модель последовательности сообщений, проходящих между объектами. Для пущего удобства контекстное меню любого объекта диаграммы снабжено пунктами, позволяющими ассоциировать с объектом определенный тип. Это действительно удобно, потому что, во-первых, вы задаете тип в диалоговом режиме, и Together показывает вам список всех имеющихся в проекте типов. Это не даст совершить ошибку и напомнит о необходимости создать тип, если его еще нет. И во-вторых, увязав объект с типом, вы перестаете зависеть от его имени. Ведь стоит только поменять в диаграмме классов какое-то имя, как объекты, использующие его, будут перерисованы в соответствии с новым наименованием, и исходный текст, разумеется, тоже будет обновлен.

Еще один важный пункт контекстного меню объектов в диаграмме последовательности действий — New? Class/Interface. Это прямо-таки бальзам для забывчивых. Предположим, вы не создали описание класса, и вспомнили об этом лишь тогда, когда занялись расписыванием последовательности. Не беда — новый класс или интерфейс можно создать и прямо из диаграммы последовательности действий (рис. 6).

Рис.6

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

Контекстное меню объектов в диаграмме последовательности действий предлагает альтернативный вариант просмотра — в виде диаграммы взаимодействий, также широко распространенной в языке UML.

Скрипты

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

Системные скрипты, как вы сами понимаете, выполняют различные действия, напрямую связанные с моделированием. Среди них есть генераторы HTML, IDL, DDL, дескрипторов-описателей для компонентов Enterprise JavaBeans. Они же отвечают за экспорт диаграмм в Rational Rose и импорт их из Rose в Together.

Примеры служат учебным пособием для того, как нужно писать скрипты, используя языки Java и Tcl. Впрочем, последний представлен лишь двухстрочным сценарием, отображающим диалоговую панель с приветствием «Hello World!». И тем не менее примеры скриптов — бесценны. С их помощью можно получить (по исходному тексту и топологии классов) полную последовательность вызовов, оформленную в виде диаграммы, или посмотреть дерево наследования для классов проекта.

Написание и использование скриптов возможно, поскольку Together имеет собственный программный интерфейс расширения среды Open Tools API, состоящий из трех слоев.

Самый высокий позволяет читать UML и управлять элементами среды Together, промежуточный делает возможным редактирование моделей и диаграмм, а самый нижний предназначен для написания и редактирования исходных текстов.

О грустном

Так ли все хорошо в пакете Together, как кажется на первый взгляд? Может быть, есть недостатки? Ваша правда. Лично мне в глаза бросились два. Раздражает невозможность разбить строки на несколько более коротких. К примеру, если Use Case назван довольно длинной строкой «Формирование списка абонентов для рассылки», то в окне Together образуется овал со строкой в полдиаграммы. Поиск по документации ничего не дал. Клавишные комбинации типа + и + также не сработали. Может, конечно, и есть некий способ перенести текст на следующую строку, но мне он так и остался неизвестен.

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