Прежде чем приступать к проектированию структур данных, следует убедиться в том, что построенная функциональная модель системы достаточно полна.
Будем считать функциональную модель полной, если рассмотрение каждого последующего прецедента не приводит к добавлению новых функций.
Основная ошибка, допускаемая неопытными разработчиками, заключается в том, что они рассматривают упрощённые прецеденты. (Или же не рассматривают их вообще.) Чтобы построить полную функциональную модель, нужно изучать сложные юз-кейсы, взятые из реальной жизни.
Вернёмся к нашему примеру – "проектирование графического редактора для создания открыток".
В третьей части мы расширим функциональную модель модуля редактирования.
Для этого обратимся к видеоуроку "Как нарисовать открытку":
Для этого обратимся к видеоуроку "Как нарисовать открытку":
В этом уроке автор создаёт поздравительную открытку к Дню Защитника Отечества. Опишем последовательность действий автора в виде прецедентов.
Открытка состоит из четырёх основных элементов:
1) пятиконечной звезды;
2) щита;
3) надписи;
4) фона.
Поэтому первый прецедент будет выглядеть так:
Прецедент 1. Создать открытку
- Создать звезду.
- Создать щит.
- Создать надписи и расположить их на рисунке.
- Создать фон.
Этот вариант использования выглядит весьма лаконично. Он также противоречит определению, данному Алистером Коберном:
"Вариант использования описывает поведение системы при её ответах на запрос одного из участников, называемого основным действующим лицом, в различных условиях. Основное действующее лицо инициирует взаимодействие с системой, чтобы добиться некоторой цели. Система отвечает, соблюдая интересы всех участников".
Алистер Коберн, Современные методы описания функциональных требований к системам/Пер. с англ. – М.: Издательство «Лори», 2002 г., с. 1.
Противоречие заключается в том, что в этом и других прецедентах не указаны ни основное действующее лицо, ни другие участники.
Это сделано намеренно. По двум причинам.
Первая причина заключается в том, что наши варианты использования имеют конкретное предназначение – помочь проектировщику выявить функции системы.
Описание взаимодействия между действующими лицами привело бы к увеличению размера прецедентов за счёт описания вспомогательных действий, которые в контексте решаемой задачи НЕ важны.
Вторая причина заключается в том, что при указании участников проектировщику нужно будет распределить функции между ними.
Распределение функций между действующими лицами, как правило, является не условием, а результатом проектирования. Одна и та же функция может быть выполнена как человеком, так и программой. И логика развития заключается в автоматизации функций, в передаче их от человека к программной системе. Поэтому решение о делегировании конкретной функции тому или иному участнику должно быть хорошо обосновано.
Но вернёмся к нашей открытке...
А) Опишем процесс создания открытки в виде прецедентов.
Как и в прошлый раз, я намеренно привожу описания всех вариантов использования, чтобы заинтересованный читатель мог при желании разобраться.
Прецедент 2. Создать звезду
- Создать правильный пятиугольник.
- Преобразовать пятиугольник в звезду.
- Изменить размеры звезды.
- Окрасить звезду бронзовым цветом.
- Создать копию звезды.
- Изменить размеры копии звезды.
- Окрасить копию звезды жёлтым цветом.
- Изменить местоположение копии звезды.
- Объединить звезду и копию в группу.
Прецедент 3. Создать щит
- Создать контур щита.
- Создать каркас щита.
- Создать заклёпки.
Прецедент 4. Создать контур щита
- Создать прямоугольник.
- Преобразовать прямоугольник в многоугольник.
- Преобразовать стороны прямоугольника в кривые Безье.
- Склеить левую и нижнюю кривые.
- Изменить форму стороны склеенной кривой.
- Разбить верхнюю кривую на две кривых.
- Изменить форму левой кривой.
- Изменить форму правой кривой.
- Создать копию объекта.
- Сделать зеркальное отражение копии относительно вертикальной оси.
- Изменить местоположение копии.
- Создать фигуру с общим контуром для двух фигур.
- Склеить нижние кривые.
- Изменить форму нижней кривой.
Прецедент 5. Создать каркас щита
- Окрасить контур бронзовым цветом.
- Создать копию фигуры.
- Изменить размеры копии фигуры.
- Изменить местоположение копии фигуры.
- Окрасить нижнюю фигуру линейной градиентной заливкой.
- Окрасить верхнюю фигуру линейной градиентной заливкой.
- Убрать абрис с обоих фигур.
- Создать копию фигуры.
- Пропорционально изменить размер копии относительно центральной точки.
- Поместить копию на задний план.
- Изменить направление линейной градиентной заливки на протиивоположное.
Прецедент 6. Создать заклёпки
- Создать окружность.
- Окрасить окружность радиальной градиентной заливкой.
- Пропорционально изменить размеры окружности.
- Изменить местоположение окружности.
- Создать копию окружности.
- Изменить местоположение копии окружности.
- Повторить шаги 5 – 6 несколько раз.
- Объединить щиты и окружности в один объект.
Прецедент 7. Создать надписи и расположить их на рисунке
- Изменить местоположение звезды.
- Изменить местоположение щита.
- Изменить размеры звезды.
- Изменить размеры щита.
- Создать надпись "23".
- Создать надпись "февраля".
- Создать надпись "День защитника Отечества".
- Объединить надписи и рисунок в группу.
Прецедент 8. Создать надпись
- Создать текст.
- Установить выравнивание текста (по левому краю, по центру, по правому краю).
- Изменить размер шрифта.
- Изменить местоположение текста.
- Изменить размеры текста.
- Окрасить текст в чёрный цвет.
- Создать копию надписи.
- Окрасить копию в желтый цвет.
- Изменить местоположение копии.
Прецедент 9. Создать фон
- Создать элемент фонового рисунка.
- Сложить фоновый рисунок из элементов.
- Создать плашку.
- Сформировать изображение.
- Удалить лишние элементы.
Прецедент 10. Создать элемент фонового рисунка
- Создать треугольник.
- Создать копию треугольника.
- Пропорционально изменить размеры копии треугольника относительно центра фигуры.
- Изменить размеры копии треугольника по высоте относительно его верха.
- Изменить размеры копии треугольника по высоте относительно его низа.
- Окрасить треугольник радиальной градиентной заливкой..
- Окрасить копию радиальной градиентной заливкой.
- Убрать абрис с фигур.
- Объединить треугольники в группу.
- Создать копию фигуры.
- Зеркально отразить копию относительно горизонтальной оси.
- Изменить местоположение копии.
- Объединить объекты в один объект.
Прецедент 11. Сложить фоновый рисунок из элементов
- Создать копию элемента фона.
- Повернуть копию объекта на 5 градусов вокруг её центра.
- Выполнить шаги 1 – 2 36 раз.
- Поместить центры объектов в общую точку.
- Объединить объекты в один объект.
Прецедент 12. Создать плашку
- Создать прямоугольник.
- Окрасить прямоугольник радиальным градиентом.
- Поместить прямоугольник на задний план.
Прецедент 13. Сформировать изображение
- Поместить центры объектов "щит с надписями", "звезда", "фон" и "плашка" в общую точку.
- Объединить объекты в группу.
Прецедент 14. Удалить лишние элементы
- Создать прямоугольник.
- Изменить местоположение прямоугольника.
- Вычесть прямоугольник из рисунка.
- Выполнить шаги 1 – 3 4 раза (для каждой стороны открытки).
- Изменить местоположение фигуры.
- Изменить масштаб фигуры.
Б) Дополним нашу табличку, созданную в прошлый раз, названиями новых функций.
Отметим новые функции полужирным шрифтом.
Таблица: Функциональная модель модуля редактирования, версия 2
Группа
|
Функция
|
1. Создание
|
F1.1. Создать прямоугольник.
|
F1.2. Создать эллипс.
| |
F1.3. Создать окружность.
| |
F1.4. Создать прямую.
| |
F1.5. Создать текст.
| |
F1.6. Создать треугольник.
| |
F1.7. Создать пятиугольник.
| |
2. Копирование
|
F2.1. Создать копию фигуры.
|
3. Группирование
|
F3.1. Объединить фигуры в группу.
|
F3.2. Разделить группу на отдельные фигуры.
| |
4. Размещение
|
F4.1. Переместить фигуру в заданную точку.
|
F4.2. Переместить фигуру на заданное расстояние.
| |
F4.3. Поместить центры фигур в одну точку.
| |
5. Масштабирование
|
F5.1. Изменить размеры фигуры по вертикали.
|
F5.2. Изменить размеры фигуры по горизонтали.
| |
F5.3. Изменить размеры фигуры пропорционально.
| |
F5.4. Изменить размеры фигуры пропорционально относительно центральной точки.
| |
6. Размещение по Z
|
F6.1. Поместить фигуру на задний план.
|
F6.2. Поместить фигуру на передний план.
| |
7. Форма
|
F7.1. Создать зеркальное отражение фигуры относительно вертикальной оси.
|
F7.2. Создать зеркальное отражение фигуры относительно горизонтальной оси.
| |
F7.3. Изогнуть фигуру.
| |
F7.4. Преобразовать эллипс/окружность в сектор.
| |
F7.5. Изменить угол сектора.
| |
F7.6. Преобразовать пятиугольник в звезду.
| |
F7.7. Преобразовать прямоугольник в многоугольник.
| |
F7.8. Преобразовать сегмент в кривую Безье.
| |
F7.9. Изменить форму кривой (изогнуть кривую, сделать кривую выпуклой или вогнутой).
| |
F7.10. Создать общий контур для нескольких фигур.
| |
F7.11. Найти отсечение контура одной фигуры контуром другой фигуры.
| |
F7.12. Разбить сегмент на две стороны.
| |
F7.13. Разбить кривую на две кривых.
| |
F7.14. Склеить соседние сегменты.
| |
F7.15. Склеить соседние кривые.
| |
F7.16. Склеить соседние сегмент и кривую.
| |
8. Форматирование
|
F8.1. Изменить шрифт текста.
|
F8.2. Изменить размер шрифта.
| |
F8.3. Изменить цвет текста.
| |
F8.4. Установить выравнивание текста:
- по левому краю;
- по центру;
- по правому краю.
| |
9. Заливка
|
F9.1. Залить фигуру заданным цветом.
|
F9.2. Залить фигуру фрактальным рисунком.
| |
F9.3. Залить фигуру линейной градиентной заливкой.
| |
F9.4. Изменить направление линейной градиентной заливки на противоположное.
| |
F9.5. Залить фигуру радиальной градиентной заливкой.
| |
F9.6. Изменить направление радиальной градиентной заливки на противоположное.
| |
10. Вращение
|
F10.1. Повернуть фигуру на 90 градусов.
|
F10.2. Повернуть фигуру на 180 градусов.
| |
F10.3. Повернуть фигуру на произвольный угол.
| |
11. Удаление
|
F11.1. Удалить фигуру.
|
F11.2. Удалить узел многоугольника (или кривой).
| |
12. Абрис
|
F12.1. Удалить абрис.
|
Все изложение в этой части построено на двух моментах, о которых можно поспорить. Первый - что необязательно указывать действующих лиц (Actors), второй - до какого уровня детализировать прецеденты. Первый момент определяется тем, отталкивается ли ваш подход к проектированию от пользовательского интерфейса, или же от доменных объектов и бизнес-функций (в смысле, что из этого первично, а что вторично). Если первичен UI, то актеров придется указать. Ну, а с детализацией - это зависит... Я лично предпочитаю избегать глубокой детализации в функциональной спецификации, лучше добавить пару абзацев в тех.спец.
ОтветитьУдалить1) В данном примере (и во всех других примерах тоже) я отталкиваюсь от обязанностей системы, т.е. от бизнес-функций.
ОтветитьУдалитьGUI определяется обязанностями системы + техническими ограничениями.
2) ИМХО, детализация нужна для того, чтобы составить функциональную модель системы. Т.е. составить список функций для системы в целом или для модуля, класса. Это нужно, потому что функции в дальнейшем определяют декомпозицию системы на модули и влияют на реализацию (== структуры данных) модулей.
На мой взгляд, детальные юз-кейсы можно и не писать в функциональную спецификацию. Они, скорее - рабочий инструмент проектировщика.
Спасибо,
Да, для приведенного примера так и есть. Просто я чаще всего проектирую для веба, а там обычно отталкиваются от GUI mock-up для описания функциональности. То есть, типичный вид функ.спец. - структура сайта, и для каждой веб-страницы скриншот плюс текстовое описание действий/прецедентов.
ОтветитьУдалитьИгорь, а кто проектирует структуру сайта?
ОтветитьУдалить