вторник, 7 апреля 2009 г.

Диаграмма вариантов использования

Данная статья представляет собой краткое изложение моего опыта работы c диаграммами вариантов использования (use-case diagram). Я постарался написать ее простым языком, а также описал некоторые нюансы, которые показали свою полезность при моделировании.


Под "программой" в статье понимается любое ПО: десктоп-приложения, веб-приложения, библиотеки, консоли и т.п.


Зачем нужна диаграмма вариантов использования?

Любая программа создается для того, чтобы удовлетворять потребности какой-либо группы людей (например, графический редактор используется дизайнерами), или предоставлять свой функционал для использования другими программами. Функционал, который реализован в программе, можно представить как некоторое, иногда очень большое, количество операций (действий) над чем-либо (документы, настройки и т.п.), которые пользователь может выполнять в программе. Тот же графический редактор, например, может изменять размеры изображений, удалять "красные глаза" на фотографиях, изменять цветовую гамму, сохранять изображение в jpg или bmp-формате и многое другое. Т.о., любую программу можно представить как конечный набор операций, предназначенных для использования конечным количеством тех или иных групп потребителей. Диаграмма вариантов использования служит для того, чтобы выявить, упорядочить и ограничить операции, реализуемые в программе, необходимые для пользователей, которые, как предполагается, будут с этой программой работать. Соответственно, данная диаграмма составляется на самом раннем этапе работы на программой, когда есть только какие-то общие идеи и концепции, но нет точного перечня того, что будет делать программа. Речь идет не только о написании программ с нуля, но и о расширении функционала существующего ПО.


Что из себя представляет диаграмма.

Если коротко, то в наглядной графической форме на диаграмме показано, "кто" "что делает".

"Кто" - группы пользователей, которые будут работать с программой, называются актерами или действующими лицами. Здесь следует заметить, что речь идет не о конкретных пользователях (Иванова Маргарита Львовна), а о тех ролях, в которых они выступают, работая с системой (бухгалтер). Например, с графическим редактором могут работать два действующих лица - фотограф и дизайнер - за которыми могут скрываться как тысячи людей, так и один человек. Иногда актер может точно соответствовать должности пользователя в компании - кладовщик, бухгалтер, логист.

"Что делает" - функции программы, которыми пользуются действующие лица, называются вариантами использования. Как вы уже поняли, вариант использования отвечает на вопрос: что делает? Есть хорошее правило наименование варианта использования начинать с глагола в неопределенной форме или оглагольного существительного: "Открыть файл", "Преобразование записи человеческой речи в текстовый формат", "Провести бухгалтерскую проводку". Как видно из приведенных названий, за каждым вариантом использования всегда скрывается какой-то процесс (бизнес-процесс или просто какое-то действие в программе), в который вовлечен актер. Актер может инициировать этот процесс, пользоваться его результатами, контролировать его ход. Данные процессы могут быть очень объемными и/или сложными, но в рамках диаграммы сущность процесса не имеет значения, важно показать, что он есть и будет использоваться тем или иным действующим лицом. Диаграмма вариантов использования не отображает, как этот процесс будет реализован, какие шаги в него входят, какие объекты создаются и т.п. Для это существуют другие диаграммы.

Между актерами и вариантами использования, а также между вариантами использования и другими вариантами использования, существуют отношения. Отношения между сущностями регламентируются несколькими простыми правилами:

  • Актер каждый всегда связан хоть с одним вариантом использования (иначе следует вывод, что актер просто не использует функционал программы)
  • Каждый вариант использования связан либо актером, либо с другим вариантом использования (иначе следует вывод, что в программе есть никому не нужный функционал)

Отношения между вариантами использования могут быть следующих видов:

  • include - вариант А входит в вариант Б, т.е. вариант Б является обобщением действий дочерних вариантов. Например: "Открыть файл" (вариант А) входит в "Работать с файлом" (вариант Б).
  • extend - вариант А делает то же самое, что и вариант Б, но с некоторыми дополнениями (А "расширяет" Б). Пример: "Создать документ на основе шаблона" (вариант А) есть расширение для "Создать документ" (вариант Б).
  • generalization - своего рода комбинация вышеуказанных случаев. Например, "Синхронизировать с веб-хранилищем" (Вариант А) входит в "Сохранить файл" (Вариант Б).


Как происходит моделирование.

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

Для моделирования можно использовать различное специализированное программное обеспечение (Rational Rose, MS Visio) или дешевый и сердитый вариант - карандаш и бумага.

При создании диаграммы есть ряд тонкостей, о которых хотелось бы упомянуть.

Любая диаграмма UML, в т.ч. и диаграмма вариантов использования, это УПРОЩЕННАЯ модель реальной системы, поэтому если диаграмма получается запутанной и сложной (большая не значит запутанная и сложная!), вероятно, что-то сделано не так, и требуется остановиться и подумать, как все упростить. Модель не может быть сложнее системы, которую она моделирует. Точнее, модель должна быть НАМНОГО ПРОЩЕ моделируемой системы.

Также следует отметить, что не существует идеально правильной нотации UML. В каждой компании и в каждом проекте могут быть свои нюансы. Например, в MS Visio отношение include называется uses, и есть дополнительные элементы - constrain'ы и др. Это не значит, что один вариант нотации правилен, а другой нет. Если последующая разработка на основе диаграммы была успешна, то и нотацию следует считать правильной. Другое дело, что в рамках одного проекта следует договориться об используемой нотации так, чтобы все диаграммы делались в одном ключе, на основе одних сущностей, и в дальнейшем этой нотации придерживаться.

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

Разнообразные уточнения, в т.ч. технического характера (в каком виде будет результат работы с вариантом использования, наметки классов и т.п.), следует обязательно фиксировать, например, как примечания к диаграмме, все это пригодится в дальнейшем.

Объект, над которым выполняется действие в варианте использования, возможно будет (а возможно, не будет, это не жесткое правило) являться экземпляром класса в программе (при использовании ООП, конечно), а действия, над ним выполняемые - методы этого класса. Например: варианты использования "Сохранить статью", "Редактировать статью", "Печатать статью" преобразуются в класс CArticle и методы CArticle.Save, CArticle.Edit, CArticle.Print.

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


Что с этим делать дальше?

Подготовить roadmap, как было описано выше.

Диаграмма вариантов использования служит отличным дополнением к ТЗ или любой другой спецификации создаваемой программы.

Для вариантов использования, по которыми скрываются сложные процессы, можно делать диаграммы деятельности (activity diagram) или последовательности (sequence diagram), описывающие ход процесса. Если диаграмма вариантов использования описывает, ЧТО система делает, то эти диаграммы говорят, КАК система делает ту или иную функцию.

Диаграмма вариантов использования также является одним из основных документов для создания диаграммы классов.

Пример диаграммы.

Диаграмма для desktop-приложения: блокнот с функциональностью wiki. В одном файле сохраняются несколько статей. Для статей существует история и возможность добавлять теги.

Данная диаграмма приведена лишь как иллюстрация к статье. Соответственно, рассмотрены только два варианта использования: "Работать с файлом", "Работать со статьей". Детализация также не очень глубокая. Можно было добавить варианты для работы с тегами, с таблицей и др. Все отношения "include" между вариантами показаны обычными линиями.


И еще.

Замените слово "программа" на слово "изделие". При проектировании "железа" все принципы остаются те же.

среда, 19 ноября 2008 г.

A.L.I.C.E.

Human: do you like to swim?
ALICE: Yes but I have no body yet!
Human: how do you like to swim if you have no body?
ALICE: Hmm, unknown person, I'm not sure if I'd like to swim if me have no body that much. What is it like?
Human: this is motiom.
ALICE: You don't say.
Human: Motion in the water
ALICE: Are we still talking about My favorite movie ? 

Эта девочка живет здесь

четверг, 6 ноября 2008 г.

О том, как установить web-приложение для bitnami стека

Ну-с, начнем...
Наверно, многие знают о существовании такого гм.. сервиса: www.bitnami.org. Что он позволяет? А позволяет он за пару минут установить на своем компьютере набор программ  apache+mysql+php. У Bitnami этот набор называется стек (stack), так и будем его именовать дальше. При этом установка стека производится за несколько кликов с использованием программы-инсталлятора с нормальным user-friendly интерфейсом, избавляя тем самым пользователя от нудного копания в файлах настройки. Установка может выполняться как на машинах с OS Windows, так и с MacOS и с Linux. Дополнительно к упомянутому набору в обязательном порядке ставится приложение phpMyAdmin, на тот случай, если потребуется что-то поковырять в MySQL ручками (и ведь потребуется!).
Однако, таких WAMP, LAMP и... MAMP(?) дистрибутивов при желании на просторах сети можно найти немало. Но у дистибутивов от bitnami есть еще одно огромное преимущество. Поверх самого WAMP или LAMP стека можно установить OpenSource приложения (скрипты): MediaWiki, Drupal, WordPress, phpBB и т.д. Есть только одна проблема, дистрибутивы вышеупомянутых приложений для стеков bitnami подготавливаются закрытым сообществом, спонсируемым компанией BitRock - производителем программы-инсталлятора. Поэтому, если вы хотите установить в своем стеке скрипт, не представленный на bitnami.org, вам не остается ничего другого, как написать жалостивое письмо в info@bitnami.com и попросить, чтобы интересное вам приложение включили в список для голосования. По результатам данного голосования и будут подготовлены дистрибутивы наиболее востребованных приложений.

Ну что ж... спасение утопающих дело рук самих утопающих.
Итак, что делать, если требуется поставить на стек приложение, дистрибутив которого еще не был создан bitnami.org?

Для примера рассмотрим установку форума fluxBB на стек WAMP (т.е. Windows версия стека). Также предполагается, что в данном стеке уже установлены какие-либо другие приложения из дистрибутивов bitnami, например, WordPress. Также сразу хочу оговориться, что:
  • данная инструкция опробовалась только на php-приложениях (не Java, не Ruby),
  • если ваша БД дорога вам, лучше сделать лишний бэкап,
  • все действия вы делаете на свой страх и риск (точнее, чья система, того и риск).
Итак:
  1. Сначала загружаем приложение (249Kb) со страницы комьюнити форума. На момент написания данной заметки последняя версия форума - 1.2.20. Windows-версия приложения распространяется как zip-архив. Распаковываем его. В нем есть две подпапки: extras и upload.
  2. WAMPStack установлен в папку: D:\Program Files\BitNami WAMPStack, здесь и далее D:\Program Files - путь к стеку (зависит от того, куда вы установили стек, например, C:\MyProg, C:\Program Files и т.п.). Все дополнительно устанавливаемые приложения помещаются в каталог D:\Program Files\BitNami WAMPStack\apps. Создаем каталоги: 
    D:\Program Files\BitNami WAMPStack\apps\fluxBB 
    D:\Program Files\BitNami WAMPStack\apps\fluxBB\conf
    D:\Program Files\BitNami WAMPStack\apps\fluxBB\htdocs
  3. Копируем содержимое папки upload распакованного архива fluxBB в каталог D:\Program Files\BitNami WAMPStack\fluxBB\htdocs. Это, собственно, и есть выполнемые скрипты программы.
  4. Теперь нужно настроить файл конфигурации. Чтобы не создавать его с нуля, возьмем существующий файл от другого приложения и подправим там все необходимое. "Другим приложением" в нашем случае будет WordPress. Вот содержимое его конфигурационного файла:
    Alias /wordpress/ "D:/Program Files/BitNami WAMPStack/apps/wordpress/htdocs/"
    Alias /wordpress "D:/Program Files/BitNami WAMPStack/apps/wordpress/htdocs"

    <directory "D:/Program Files/BitNami WAMPStack/apps/wordpress/htdocs">
        Options Indexes MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    </directory>
    Это содержимое данного файла. Теперь мы его подправим, чтобы он указывал не на WordPress, а на fluxBB. Найти 10 отличий.
    Alias /fluxBB/ "D:/Program Files/BitNami WAMPStack/apps/fluxBB/htdocs/"
    Alias /fluxBB "D:/Program Files/BitNami WAMPStack/apps/fluxBB/htdocs"

    <directory "D:/Program Files/BitNami WAMPStack/apps/fluxbb/htdocs">
        Options Indexes MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    </directory>
    Некоторые пояснения: Alias указывает, где web-сервер будет искать скрипты нашего  приложения,  когда пользователь введет в адресной строке броузера адрес: http://localhost:port/fluxBB. Тег Directory задает права каталогу со скриптами.
    Помещаем скорректированный файл в каталог: D:\Program Files\BitNami WAMPStack\apps\fluxBB\conf
  5. Теперь нужно сообщить web-серверу, что в нашем стеке появилось новое приложение. Открываем файл: D:\Program Files\BitNami WAMPStack\apache2\conf\httpd.conf и добавляем в конец файла следующую строку:
    Include "D:/Program Files/BitNami WAMPStack/apps/fluxBB/conf/fluxBB.conf"
  6. В общем-то это все. Перезапустите WAMPStack (если не знаете как, перегрузите компьютер), и набрав в адресной строке броузера http://localhost:port/fluxBB, запустите скрипты форума. Но можно добавить еще одну красивость. Адрес http://localhost:port позволяет увидеть страницу со списком установленных приложений, вот, примерно, такую:


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



    В данном фрагменте строку insert_picture_here можно заменить на ссылку на подходящую картинку (а можно не заменять). Вот и все с "ручной" установкой приложения в BitNami WAMPStack! )
    Далее несколько слов, относящихся именно к инсталляции скрипта fluxBB.
  7. Перед развертыванием структуры БД форума требуется создать саму базу в MySQL. Делается это с помощью phpMyAdmin, название БД должно начинаться с префикса bitnami_, например bitnami_fluxbb.
  8. При первом запуске fluxBB открывается страничка для ввода параметров, необходимых для создания таблиц, стартового форума и пр. в нашей новой БД.
    Здесь следует помнить, что:
    логин для создания БД: root
    пароль: тот пароль, который был введен при развертывании стека
    название БД: название БД, которая была создана в п.7
    порт: номер порта MySQL (это не порт apache, который указывается в броузере!), также вводился при развертывании стека. Номер порта можно посмотреть в ini-файле стека: D:\Program Files\BitNami WAMPStack\properties.ini в секции [MySQL].
Ну вот, в общем-то и всё! )