Влияние компьютерных игр на личность играющего. Виды диаграмм UML Что такое Use Case
Реми Кулом (слева) с компьютерной программой Crazy Stone против гроссмейстера Норимото Ёды
В 1994 году компьютер обыграл чемпиона мира по шашкам, в 1997 году - по шахматам. Сегодня компьютеры превосходят людей абсолютно во всех популярных играх с полной информацией , кроме одной - го.
У классической игры с 2500-летней историей очень простые правила, но компьютерные программы даже близко не могут подобраться к победе над лучшими гроссмейстерами, пишет Wired.
Древнюю игру можно считать «восточной версией шахмат». Как и шахматы, это игра с полной информацией, то есть в любой момент игры все игроки имеют полную информацию о состоянии игры и воздействуют на игру дискретными действиями. Здесь успех не зависит от удачи или скорости реакции.
Несмотря на рост вычислительной мощи компьютеров (чемпион мира по шахматам сегодня, вероятно, проиграет даже вашему домашнему ПК), алгоритмы игры в го на экспертном уровне остаются нерешённой и одной из самых интересных задач ИИ. Проблема ещё и в том, что очень немногие способны подняться до девятого дана в игре. Для этого нужно несколько лет обучаться в Японии или Корее. Там талантливых детей забирают из дома для обучения в академии го примерно с 9 лет.
Продвинутые любители почти всегда застревают на определённом уровне игры и не могут улучшить результат: «Требуется некий ментальный прыжок, чтобы снять эту блокировку, и в разработке программ та же проблема, - объясняет Дэвид Фотлэнд (David Fotland), главный разработчик процессора PA-RISC в компании Hewlett Packard в 70-е годы. Он тестировал программу го на процессоре своей разработки. - Вопрос в том, как оценивать всю доску, а не отдельные фрагменты».
Игра давно пользовалась популярностью не только на востоке, но и на западе, особенно среди математиков и физиков. Например, Эйнштейн частенько играл в го, также как знаменитые математики Джон Нэш и Алан Тьюринг.
Компьютерные программы для го разрабатывают уже 45 лет, этой проблеме уделяли почти столько же внимания, сколько и шахматным программам. Первую написал гений теории игр Альфред Зобрист в 1968 году. Она могла обыграть абсолютного новичка, который только что познакомился с правилами (запись первой игры человек-компьютер). Начало казалось оптимистичным. В следующие четыре десятилетия было потрачено огромное количество времени и интеллектуальных усилий, но даже с учётом прогресса в вычислительной мощности программы так и не смогли одолеть даже продвинутого любителя.
Причину можно понять, если сравнить го с шахматами. В начале шахматной партии у белых есть 20 возможных ходов, а у чёрных - 20 возможных вариантов ответа. После первого хода на доске может быть 400 различных позиций. А теперь сравните цифры в го: на доске 19х19 у чёрных есть 361 возможных начальных ходов, а у белых 360 вариантов ответа. Это означает 129 960 возможных комбинаций только после первого раунда.
Так называемый «фактор ветвления» - среднее количество ходов, доступных в каждом раунде - в шахматах составляет 35, в го - 250. Игры с сильным ветвлением затрудняют работу стандартных алгоритмов, использующих правило минимакса для создания дерева возможных комбинаций. Даже с учётом анализа не всех, а только перспективных ветвлений для более глубокого анализа. То, что работает в шашках и шахматах, не работает в го. Выбор перспективных ветвлений в дереве возможных комбинаций го - часто совершенно таинственный процесс. Даже игроки не понимают, как они это делают: «Просто смотришь на доску и знаешь», говорят они.
Опять же, в шахматах почти всегда можно понять, кто выигрывает, хотя бы по числу фигур. В го ситуацию могут толковать только эксперты.
Среднее количество ходов в игре: в шахматах - около 40, в го - 200. Учитывая фактор ветвления и эту статистику, становится понятным бессилие компьютеров.
Талантливый французский программист Реми Кулом (Rémi Coulom) добился первого успеха с программой Crazy Stone в 2006 году, когда догадался совместить минимакс и метод Монте-Карло. Новый алгоритм расчёта дерева ветвлений он назвал Monte Carlo Tree Search или MCTS. Француз выиграл чемпионат среди компьютерных программ UEC Cup в 2007 и 2008 годах, но это так и не принесло ему известности, и Реми забросил разработку. Но в 2010 году он получил предложение от японского игрового разработчика Unbalance - и в 2011 году вышла первая коммерческая версия Crazy Stone. В 2013 году Реми победно вернулся на чемпионат.
Однако, в 2014 году случилась неудача. В финальном противостоянии против программы Zen зрители поняли, что творится нечто странное уже после третьего хода. Программа Zen, после стандартной постановки двух камней по углам вдруг поставила третий камень около центра. Так никто не играл, это было явно «нечеловеческое» решение. Вскоре уровень победных ожиданий у Crazy Stone вырос до неприлично высоких значений, более 60%. Судя по всему, программа считала безопасной группу камней в правом верхнем углу, хотя она не была безопасной. Поскольку успешная стратегия напрямую зависит от правильной оценки доски, зрители начали шептаться о возможном поражении Crazy Stone. Так оно и вышло: на 186 ходу Crazy Stone признала поражение, а Zen стал новым чемпионом UEC Cup.
Впрочем, у Кулома осталась возможность реванша. Как финалист, он получил право играть против настоящего гроссмейстера-человека с форой в четыре камня. В этом году на турнир приехал Норимото Ёда. Японский гроссмейстер сел за стол в традиционном зелёном кимоно. Реми Кулом - в очках без оправы и синем свитере, в которых был и на прошлом чемпионате.
А ддиктивное поведение (от англ. addiction - склонность, пагубная привычка; лат. addictus - рабски преданный) - особый тип форм деструктивного поведения, которые выражаются в стремлении к уходу от реальности посредством специального изменения своего психического состояния. Синоним – аддикция.
Выделяют основные виды аддикций:
- злоупотребление одним или несколькими веществами, изменяющими психическое состояние, например, алкоголь, наркотики, лекарства, различные яды;
- участие в азартных играх, в том числе компьютерных;
- сексуальное аддиктивное поведение;
- переедание;
- работоголизм (трудоголизм);
- длительное прослушивание музыки, главным образом основанной на ритмах.
При формировании аддикции происходит редукция, т.е. упрощение, сглаживание межличностных эмоциональных отношений.
Симптомокомплекс психических нарушений, вызванных чрезмерным увлечением компьютером или Интернетом, описан психиатрами под названием компьютерная и Интернет-зависимость или компьютерный синдром.
Патологическое влечение к компьютерным играм и Интернету относится к нехимическим или поведенческим аддикциям, то есть зависимостям, не имеющим в основе своей конкретных биохимических субстратов (в отличие от алкоголизма, наркомании, никотиновой зависимости).
1. ВОЗДЕЙСТВИЕ НА ОРГАНИЗМ КОМПЬЮТЕРНЫХ ИГР
Ученые предприняли попытки изучить последствия компьютеромании на психофизическом уровне и обнаружили следующее.
Физические изменения в организме обусловлены влиянием нескольких факторов:
- длительным сидением в однообразной позе, зачастую искажающей осанку и внутренние органы человека;
- мерцанием монитора;
- электронным излучением.
К последствиям воздействия вышеперечисленных факторов медики относят:
- Снижение иммунитета (защитных свойств организма) – предрасположенность к инфекциям, онкологическим заболеваниям.
- Неврологические нарушения – существует ряд наблюдений детских неврологов о развитии судорожных приступов, спровоцированных эффектом мерцания монитора и частой сменой изображения во время игры (происходит фотостимуляция судорожной активности головного мозга).
- Нейровегетативные изменения – к ним относят колебания артериального давления, частоты сердечных сокращений, частоты дыхания, повышение температуры тела, головные боли.
- Сосудистые нарушения. За счет однообразной позы развиваются застойные явления в сосудах органов, отеки, варикозное расширение вен.
- Изменение осанки.
- Нарушение репродуктивной функции.
- Ухудшение зрения.
- Эндокринные нарушения.
Так, в Японии исследования выявили, что компьютерные игры стимулируют, например, у детей лишь ограниченный участок мозга, поэтому им нужно больше читать, писать и считать. Кроме того, для стимуляции работы мозга и его нормального развития важно, чтобы дети играли со сверстниками на воздухе и больше общались с другими.
Как утверждают американские учёные, чрезмерное увлечение жестокими компьютерными играми приводит к нарушению передачи импульсов между нервными клетками и замедляет работу мозга (что подтвердили результаты исследований функциональной магниторезонансной томографии, проведённой участвовавшим в исследовании подросткам). Особенно сильно подобное торможение проявляется у тинейджеров с нарушениями в поведении, у которых активность в коре лобной доли (отвечающей в том числе за эмоции и импульсивность) и без того значительно снижена.
По данным статистики, полученным в США, в среднем шестиклассник смотрит телевизор 4 часа в день, - и это не считая того времени, которое он проводит за различными играми перед экраном компьютера или телевизора. Дети признают, что часто играют дольше, чем собирались. Не редко из-за этого они запускают учебу.
По некоторым оценкам, около 40 % американских детей в возрасте от 5 до 8 лет страдают ожирением. К этому, очевидно, располагает недостаточная физическая активность - следствие долгих часов, проведенных за телевизором или компьютером. Одна компания даже разработала специальные тренажеры, на которых можно заниматься, не отрываясь от компьютерных игр. Но разве не лучше было бы посвящать этим играм не так много времени, чтобы его хватало и на другие занятия, необходимые для разностороннего развития личности ребенка?
А вот еще одна опасность, которую таят в себе электронные игры: от долгого сидения перед экраном страдают глаза. Факты говорят о том, что, по меньшей мере, каждый четвертый пользователь компьютера имеет проблем со зрением. Одна из причин кроется в сокращении частоты морганий, что вызывает сухость и раздражение глаз. Когда человек моргает, стимулирует выделение слезной жидкости, которая омывает глазное яблоко, защищая его от загрязнения. Дети, увлекшись, забывают обо всем на свете, и потому могут играть за компьютером часами, почти без перерывов. Это приводит к чрезмерному напряжению глаз и проблемам с фокусировкой. Специалисты рекомендуют через каждый час работы с компьютером делать перерыв на несколько минут.
2. ВОЗДЕЙСТВИЕ НА ПСИХИКУ. ВОЗНИКНОВЕНИЕ ИГРОВОЙ АДДИКЦИИ
Сегодняшние темпы компьютеризации превышают темпы развития всех других отраслей. Современный человек начинает взаимодействовать с компьютером постоянно – на работе, дома, в машине и даже в самолете. Компьютеры стремительно внедряются в человеческую жизнь, занимая свое место в нашем сознании, а мы зачастую не осознаем того, что начинаем во многом зависеть от их работоспособности.
Вместе с появлением компьютеров появились компьютерные игры, которые сразу же нашли массу поклонников. С совершенствованием компьютеров совершенствовались и игры, привлекая все больше и больше людей. По прогнозам, в ближайшие годы рынок электронных игр будет неуклонно расширяться. В обществе формируется целый класс людей-фанатов компьютерных игр; игра становится их основной деятельностью. Круг социальных контактов у них очень узок, вся иная деятельность направлена лишь на выживание, на удовлетворение физиологических потребностей; главным становится удовлетворение потребности в игре на компьютере. Опыт показывает, что многим из них это увлечение отнюдь не идет на пользу, а некоторые серьезно нуждаются в помощи. Большинство из них - люди с известными психологическими проблемами: несложившаяся личная жизнь, неудовлетворенность собой, и, как следствие, потеря смысла жизни и нормальных человеческих ценностей. Единственной ценностью для них является компьютер и всё, что с этим связано.
Для психического здоровья самая большая опасность компьютерных игр заключается в возникновении зависимости. Зависимости от компьютерных игр человек подвержен наиболее сильно, поскольку события в компьютерных играх не повторяются и происходят достаточно динамически, а сам процесс игры непрерывен. До окончания любой игры существуют некие логические стадии, которые, по большей части, достаточно жестко завязаны друг на друге, что заставляет субъекта не отвлекаться, а воспринимать прохождение всей игры от начала до конца, как некий единый процесс.
Компьютерные игры, особенно ролевые, являются одним из способов так называемой аддиктивной реализации, т.е. ухода от реальности.
Полностью погружаясь в игру и достигая в ней определенных успехов, человек реализует таким образом (виртуально) большую часть имеющихся потребностей и игнорирует остальные. В любом обществе находятся люди предпочитающие убегать от проблем. Тех, кто в качестве такого способа выбирает алкоголь называют алкоголиками, наркотики – наркоманами, работу – работоголиками, азартные игры – патологическими гэмблерами. Интернет-зависимыми, компьютерные игры – кибераддиктами и т.д. В последнем случае вместо решения проблем здесь и сейчас человек головой уходит в компьютерную игру. Там, в игре, ему хорошо: он сильный смелый, вооруженный, успешный... Время, проведенное за игрой, не делает его сильнее и успешнее в реальной жизни. Потому, выныривая из виртуального мира в реальный человек испытывает дискомфорт, ощущает себя маленьким, слабым и беззащитным в агрессивной среде. И желает как можно скорее вернуться туда, где он победитель.
Полное погружение в игру создает эффект участия игрока в некой виртуальной реальности, в неком существующем только для него сложном и подвижном процессе. Именно это свойство компьютерных игр не позволяет игроголику прервать процесс для выполнения каких-либо социальных обязательств в реальной жизни. Некоторые из них просиживают за компьютером ночами напролет, выпадая из реальной жизни. Окружающие беспокоятся, но зачастую не знают, что предпринять. Один юный любитель компьютерных игр сказал: Когда я общаюсь с людьми в сети, то кажусь им умным и элегантным. А когда они видят меня в жизни, они советуют мне похудеть.
Таким образом человек уходит от реальности в вымышленный мир. Вот какую меткую характеристику дает любителям компьютерных игр один обозреватель: Для сетевого игрока вымышленный мир гораздо привлекательнее реального. Жизнь вне игры у него сводится лишь к зарабатыванию минимума средств, необходимых для продолжения игры.
Само собой, разработчики подобных программных продуктов заинтересованы в том, чтобы игра увлекала настолько, насколько это возможно. Задача производителей игрового программного обеспечения - создать максимальный эффект погружения, чтобы при выпуске очередной серии, человек, зависимый от компьютерных игр, не раздумывая, купил именно их продукт.
Компьютерные разработки направлены на улучшение передачи мультимедийных эффектов, что непосредственно связано с игровыми процессами. Сегодня существует множество способов создания эффекта участия игрока в процессе, начиная от логики игры (от первого лица, командная игра и проч.) и графического исполнения (трехмерная графика, изометрический вид) до музыкального сопровождения (оцифрованный голос, психологически интригующая или напряженная музыка) и натуральных звуковых эффектов.
Увлечение компьютерными играми – это не пристрастие к какой-либо одной компьютерной игре, поскольку это скорее психологическая цепная реакция. Пройдя одну игру в каком-либо жанре, который понравился больше всех, игроголик ищет другие игры этого же жанра, сделанные в идентичной стилистике и не уступающие по психологическому напряжению, а дальше – тремление пройти все (по крайней мере, известные) игры этого типа, коих в данный момент на рынке огромное множество.
Многие игры имеют совмещенные игровые жанры, что подталкивает аддикта к переходу к другим типам игр. Необходимо отметить, что прохождение новой компьютерной игры занимает от 5-6 часов до нескольких суток, иногда даже недель. Для того чтобы игроголик как можно дольше играл в ту или иную игру, разработчики вводят в них дополнительные небольшие подуровни, так называемые секретки, поиск которых требует массу времени. Человек одержимый компьютерной игрой окончательно не прощается с ней до тех пор, пока не найдет все секретные уровни, комнаты, не соберет все бонусы. Путем создания секретных подуровней, производители как бы подталкивают игрока к некому соревновательному ощущению кто кого? , что является одной из множеств причин возникновения зависимости от компьютерных игр.
Игры, события в которых зависят непосредственно от игрока, т.е. развивающиеся самостоятельно вместе с игроком, ориентируясь на его слабые и сильные места, либо имеющие множество случайных параметров, которые задает игрок, заставляют аддикта проходить их снова и снова. Каждый раз в каждой новой ситуации игрок проверяет, что случится, если развитие событий он поведен по-другому. Подобные игры поглощают еще сильнее, чем те, которые построены на сценариях, поскольку они предоставляют еще большую свободу действий играющему, дают ему возможность почувствовать себя самому разработчикам того или иного уровня или сценария компьютерной игры.
Еще один из способов посадить на компьютерную иглу субъекта, – это предоставление в комплекте с игрой пакета программ для разработки собственных сценарных уровней игры, а иногда даже для создания собственных персонажей и замены голосовых и звуковых эффектов, т.е. предоставление широких мультимедийных возможностей. Подобные программы временно придают популярной игре некий культовый характер. В виртуальных конференция и на сайтах фанатов появляются уровни для той или иной компьютерной игры, сделанные непосредственно игроками и предоставлены для всеобщего прохождения и оценки. Если игра поддерживает многопользовательские системы (одновременная игра двух и более игроков), – это еще более усиливает психологическую зависимость субъектов от игры. Несколько играющих могут посоревноваться друг с другом в том, кто нашел тактику игры эффективней, а игра против компьютера куда менее интересная, чем такая же игра, но против живого человека. Мало того, игра против человека в разработанном самим же игроком уровне, - это действительно возбуждает его сознание, в момент игры ему кажется, что он попал в свой собственный виртуальный мир, где необходимо доказать свою мощь, силу и игровое мастерство.
Таким образом, негативные последствия компьютерных пристрастий – это и зависимость, выражающаяся в психопатологических симптомах (таких, как невозможность переключиться на другие развлечения, чувство превосходства над остальными людьми, оскудение эмоциональной сферы), и сужение круга интересов, и трудности в общении со сверстниками, и соматические нарушения (падение зрения, быстрая утомляемость).
Факторы риска развития компьютерной зависимости можно объединить в три группы:
1) Социальные
Недостаточная профилактическая и разъяснительная работа в семье, ослабление контроля гигиены труда за компьютером.
Массовая увлеченность окружающих ребенка сверстников и взрослых (родителей) компьютерными играми и интернетом.
Финансовый стимул – возможность выиграть деньги, играя в тотализатор, on-line казино.
Отсутствие альтернативного досуга – нежелание или отсутствие возможности заняться чем-либо иным, кроме компьютера.
2) Наследственно-биологические
Наследственно обусловленная предрасположенность к развитию определенного типа высшей нервной деятельности. В геноме человека расшифрован 31 ген, отвечающий за выработку гормонов настроения – нейромедиаторов (дофамина, серотонина, норадреналина, ГАМК). Индивидуальные особенности психики во многом зависят от скорости выработки и передачи этих веществ в центральной нервной системе человека.
Пре-, пери- и постнатальные вредности (вредности периода новорожденности), нейроинфекции, черепно-мозговые травмы, интоксикации, тяжелые заболевания способствуют развитию органической неполноценности головного мозга и формируют определенные характерологические свойства личности.
3) Психо-характерологические
Молодые люди с низкой самооценкой, неуверенные в себе, эмоционально неустойчивые, испытывающие трудности в общении, погруженные в мир собственных переживаний (интроверты), ощущающие недостаток внимания и поддержки родных и близких более подвержены зависимости от компьютерных игр и Интернета. В игре ему хорошо: он сильный смелый, вооруженный, успешный... Выныривая из виртуального мира в реальный человек испытывает дискомфорт, ощущает себя маленьким, слабым и беззащитным в агрессивной среде, и желает как можно скорее вернуться туда, где он победитель.
Молодой человек настолько вживается в реалистичную компьютерную игру, что ему там становится гораздо интереснее, чем в реальной жизни. Там поставлены вполне конкретные задачи, невыполнение которых не приведет к каким-либо потерям, к плохим оценкам, к ругани со стороны родителей. Сделанная ошибка может быть исправлена путем многоразового повторного прохождения того или иного момента игры.
Будущего аддикта привлекает в игре:
- наличие собственного (интимного) мира, в который нет доступа никому, кроме него самого;
- отсутствие ответственности;
- реалистичность процессов и полное абстрагирование от окружающего мира;
- возможность исправить любую ошибку, путем многократных попыток;
- возможность самостоятельно принимать любые (в рамках игры) решения, вне зависимости к чему они могут привести.
Необходимо отметить, что поскольку в детском возрасте умственные способности человека развиваются в процессе взаимодействия и приспособления к окружающему, и, в отличие от взрослого человека - зрелой личности со сформированными механизмами психологической защиты, ребенок принимает без критики то, что ему предложено, то и зависимым становится быстрее взрослого. Поэтому вопросы ранней профилактики компьютерной зависимости лежат в области компетенции, прежде всего, родителей.
В целом же, механизм затягивания человека, формирования игровой зависимости основан на частично неосознаваемых стремлениях, потребностях: уход от реальности и принятие роли. Эти механизмы включаются сразу после знакомства человека с ролевыми компьютерными играми при более или менее регулярной игре в них и работают независимо от сознания человека и характера мотивации игровой деятельности.
3. ПСИХОЛОГИЧЕСКАЯ КЛАССИФИКАЦИЯ КОМПЬЮТЕРНЫХ ИГР
Все компьютерные игры можно условно разделить на ролевые и неролевые.
Ролевые компьютерные игры – это игры, в которых играющий принимает на себя роль компьютерного персонажа, т.е. сама игра обязывает играющего выступать в роли конкретного или воображаемого компьютерного героя. Ролевые компьютерные игры порождают качественно новый уровень психологической зависимости от компьютера, нежели неролевые игры или любые виды неигровой компьютерной деятельности. Очевидно, что психологическая зависимость от ролевых компьютерных игр является самой мощной по степени своего влияния на личность играющего.
Выделим критерии принадлежности компьютерной игры к классу ролевых игр:
Ролевая игра должна располагать играющего к вхождению в роль компьютерного персонажа и атмосферу игры посредством своих сюжетных и мультимедийных (графическое и звуковое оформление) особенностей.
Ролевая игра должна быть построена таким образом, чтобы не вызывать у играющего мотивации, основанной на азарте – накопить больше очков, побив тем самым чей-то рекорд, перейти на следующий уровень и т.д.
Хотя и в любой компьютерной игре есть элемент азарта, но в ролевой игре этот фактор не должен иметь первостепенного значения.
Предложенная ниже классификация не является всеохватывающей, полной и законченной. Выглядит она следующим образом:
I. Ролевые компьютерные игры.
- Игры с видом из глаз своего компьютерного героя.
- Игры с видом извне на своего компьютерного героя.
- Руководительские игры.
II. Неролевые компьютерные игры.
- Аркады.
- Головоломки.
- Игры на быстроту реакции.
- Традиционно азартные игры.
СПЕЦИФИКА КОМПЬЮТЕРНЫХ ИГР
I. Ролевые компьютерные игры
Основная особенность – наибольшее влияние на психику играющего, наибольшая глубина вхождения в игру, а также мотивация игровой деятельности, основанная на потребностях принятия роли и ухода от реальности. Здесь выделяется три подтипа преимущественно по характеру своего влияния на играющего, силе затягивания в игру, и степени глубины психологической зависимости.
1) Игры с видом из глаз своего компьютерного героя. Этот тип игры характеризуется наибольшей силой затягивания или вхождения в игру. Специфика здесь в том, что вид из глаз провоцирует играющего к полной идентификации с компьютерным персонажем, к полному вхождению в роль. Через несколько минут игры (время варьируется в зависимости от индивидуальных психологических особенностей и игрового опыта играющего) человек начинает терять связь с реальной жизнью, полностью концентрируя внимание на игре, перенося себя в виртуальный мир.
Играющий может совершенно серьезно воспринимать виртуальный мир и действия своего героя считает своими. У человека появляется мотивационная включенность в сюжет игры.
2) Игры с видом извне на своего компьютерного героя. Этот тип игр характеризуется меньшей по сравнению с предыдущим силой вхождения в роль. Играющий видит себя со стороны, управляя действиями этого героя.
Отождествление себя с компьютерным персонажем носит менее выраженный характер, вследствие чего мотивационная включенность и эмоциональные проявления также менее выражены по сравнению с играми с видом из глаз. Если в случае с последними человек в критические секунды жизни своего героя может бледнеть и ерзать на стуле, пытаясь увернуться от ударов или выстрелов компьютерных врагов, то в случае вида извне внешние проявления более умеренны, однако неудачи или гибель себя в облике компьютерного героя переживается играющим не менее сильно.
3) Руководительские игры. Тип назван так потому, что в этих играх играющему предоставляется право руководить деятельностью подчиненных ему компьютерных персонажей. В этом случае играющий может выступать в роли руководителя самой различной спецификации: командира отряда спецназа, главнокомандующего армиями, главы государства, даже бога, который руководит историческим процессом. При этом человек не видит на экране своего компьютерного героя, а сам придумывает себе роль. Это единственный класс ролевых игр, где роль не задается конкретно, а воображается играющим. Вследствие этого глубина погружения в игру и свою роль будет существенной только у людей с хорошим воображением. Однако мотивационная включенность в игровой процесс и механизм формирования психологической зависимости от игры не менее сильны, чем в случае с другими ролевыми играми.
II. Неролевые компьютерные игры
Основанием для выделения этого типа является то, что играющий не принимает на себя роль компьютерного персонажа, вследствие чего психологические механизмы формирования зависимости и влияние игр на личность человека менее сильны. Мотивация игровой деятельности основана на азарте прохождения и (или) набирания очков. Выделяется несколько подтипов:
1) Аркадные игры. Такие игры еще называют приставочными, т.к., в связи с невысокой требовательностью к ресурсам компьютера, широко распространены на игровых приставках. Сюжет, как правило, слабый, линейный. Все, что нужно делать играющему – быстро передвигаться, стрелять и собирать различные призы, управляя компьютерным персонажем или транспортным средством. Эти игры в большинстве случаев весьма безобидны в смысле влияния на личность играющего, т.к. психологическая зависимость от них чаще всего носит кратковременный характер.
2) Головоломки. К этому типу игр относятся компьютерные варианты различных настольных игр (шахматы, шашки, нарды и т.д.), а также разного рода головоломки, реализованные в виде компьютерных программ.
Мотивация, основанная на азарте, сопряжена здесь с желанием обыграть компьютер, доказать свое превосходство над машиной.
3) Игры на быстроту реакции. Сюда относятся все игры, в которых играющему нужно проявлять ловкость и быстроту реакции. Отличие от аркад в том, что они совсем не имеют сюжета и, как правило, совершенно абстрактны, никак не связаны с реальной жизнью. Мотивация, основанная на азарте, потребности пройти игру, набрать большее количество очков, может формировать вполне устойчивую психологическую зависимость человека от этого типа игр.
4) Традиционно азартные игры. Сюда входят компьютерные варианты карточных игр, рулетки, имитаторы игровых автоматов, одним словом – компьютерные варианты игрового репертуара казино. Психологические аспекты формирования зависимости от этих компьютерных игр и их реальных аналогов весьма сходны и, поэтому, мы не будем акцентировать на этом внимание.
Итак, ролевые компьютерные игры в наибольшей мере позволяют человеку войти в виртуальность, отрешиться (минимум на время игры) от реальности и попасть в виртуальный мир. Вследствие этого ролевые компьютерные игры оказывают существенное влияние на личность человека.
4. СИМПТОМЫ ИГРОВОЙ ЗАВИСИМОСТИ
Проявления синдрома компьютерной зависимости нарастают постепенно и не сразу становятся заметными окружающими. При этом зависимость от компьютерных игр осознают в первую очередь окружающие субъекта друзья, родственники, знакомые, но отнюдь не он сам, что очень схоже с любым другим видом аддикции.
Основными симптомами, определяющими данное заболевание, можно считать следующие:
- поглощенность, озабоченность игрой (воспоминания о прошлых играх, планирование будущих, мысли о том, как найти деньги на игру);
- ощущение эмоционального подъема во время работы с компьютером, взвинченность и возбуждение во время игры;
- нежелание отвлечься от игры с компьютером;
- переживания, тревоги или раздражения при необходимости остановить игру;
- использование игры как средства для того, чтобы избавиться от неприятных переживаний;
- попытки отыграться после проигрыша, исправить ситуацию;
- ложь и попытки рационального оправдания своего поведения с целью скрыть истинную степень своей вовлеченности в игру;
- забывание о домашних делах, обязанностях, учебе, встречах в ходе игры на компьютере, ухудшение отношений в учебном заведении, с родителями, с друзьями;
- одалживание денег у других лиц, чтобы приобрести новую игру.
- пренебрежение собственным здоровьем, гигиеной и сном в пользу проведения большего количества времени за компьютером;
Если у человека есть четыре и более симптомов, это уже болезнь...
5. ЧТО ДЕЛАТЬ?
В настоящее время ученые не могут однозначно сказать: есть ли необходимость жестко решать проблемы компьютерной аддикции в молодежной среде. С одной стороны, подобная зависимость поглощает человека, отнимая массу времени на развитие и образование, исключая субъекта из активного социального процесса, с другой стороны, зависимость от компьютерных игр - это явление проходящее, временное.
Компьютерная зависимость отличается от курения, алкоголя, наркотиков и увлечения азартными играми тем, что в какой-то момент времени наступает насыщение компьютером. Далее субъект либо занимается им профессионально, либо компьютер перестает иметь столь значимое место в его жизни. Данный вопрос остается открытым в первую очередь по той причине, что никогда не ясно, в какой момент у компьютерного аддикта, в частности, у игроголика, наступит момент пресыщения. Не будет ли уже поздно учиться и наверстывать? Не потеряет ли он свой социальный статус, пребывая в эйфории компьютерных игр, в данном случае подразумевается отчисление из школы или института, увольнение с работы, потеря звания или положения.
Возможно, что перенасыщение компьютерными играми в раннем детстве потребует гораздо меньше времени, чем, например, у студента вуза. Не исключено, что ребенку быстрее надоест однообразие экрана, по сравнению с беЗконечностью возможностей и неоткрытых моментов реального мира. Но, к сожалению, нет никаких гарантий, что психика ребенка при подобном неоправданном эксперименте не будет повреждена.
Проверенным способом не дать человеку оказаться в зависимости от компьютерных игр – это привлечь его в реальную жизнь, чтобы он реализовал себя в ней. Существует масса интересных занятий (общение с природой, практики йоги, чтение развивающей литературы и т.д.), которые не только позволяют познавать собственный мир, развивать бдительность и осознанность, а также тренируют тело и нормализуют психологическое состояние. Виртуальная же реальность – это нематериальность воздействия, условность параметров и эфемерность, – не есть жизнь, это лишь её вторичная часть, параллельный, но не основной процесс. Нет смысла игнорировать компьютерные возможности, необходимо их использовать по мере надобности, а развлечения в виде компьютерных игр совмещать с реальными активными действиями в реальном мире.
Диаграммы прецедентов частично описывает use case – прецедент использования проектируемой системы, давая частичное описание частичного применения системы с точки зрения условного внешнего обозревателя (за которым – в идеале - стоит согласованная точка зрения участников работ). При этом описание фокусируется на том, что должна делать система по отношению к своему внешнему окружению (периферии), а не то на том, как она эта делает.
Иначе говоря, диаграмма есть частичная спецификация.
Напомним, в рассматриваемом подходе выделение основных (но не всех возможных) прецедентов на начальной стадии разработки играет ключевую роль, что отличает этот подход от чисто алгоритмического. При этом сначала обычно рассматриваются успешные сценарии (варианты).
Заметим, в случае достаточно крупных программных систем мы не используем термин «алгоритм», например – неуместно говорить об «алгоритме текстового редактора (редактирования текста)» и т.п. Причина ясна – в сложных случаях мы можем надежно описать (проанализировать, проверить и т.п.) некоторые ветки алгоритма верхнего уровня, но не сам законченный алгоритм, предполагающий законченное описание всех возможных веток.
Иначе говоря, сценарий – это и частичная алгоритмизация.
Пример. Запись пациента на прием в поликлинику.
Данный простейший пример предполагает примерно следующий скрытый за ним сценарий прецедента (естественно сделать его комментарием к имени прецедента):
"Пациент звонит в поликлинику для записи к врачу в целях профилактики. Регистратор поликлиники находит в журнале регистрации ближайший свободный период, согласует время с пациентом и фиксирует его в журнале»
Make Appointment (согласовать назначение [у врача]) – имя прецедента. Patient (пациент) – роль человека. Связь между актором и прецедентом – ассоциация коммуникации (для краткости коммуникация – в виде обмена сообщениями)
Пример 2. Уточнение предыдущей диаграммы (посредством ее расширения).
Вторая диаграмма отражает больше деталей ситуации. Здесь появляются новые акторы: Scheduler – регистратор, Doctor – врач, Clerk – служащий, и новые прецеденты CancelAppointment – отменить прием, RequestMedication – запросить лечение и PayBill – оплатить счет.
Крупные программные среды UML-моделирования имеют средства поддержки версий. В таком случае мы можем считать представлением (view) группу диаграмм, относящихся либо к последней версии, либо ко всем. Второе, очевидно, предпочтительно.
Уже самый первый пример ставит перед нами «главный вопрос всех времен и народов»: «Ну и зачем мне эти диаграммы прецедентов?» Еще более популярный вариант: «Да вообще кому они нужны - все эти диаграммы!». В процессе обучения его лучше не скрывать в себе, но переадресовать себе самому, перефразируя и конкретизируя. Кому именно и когда именно и зачем именно они полезны?
Программист, конечно, увидит для себя возможности программной реализации - очертания [архитектуры, строения] будущей программы. Для понимания остальных возможностей нужно лишь представить себя в другой роли. В роли клиента – для оценки полезности использования системы в своей работе. В роли заказчика и постановщика – при обсуждении задачи. В роли тестера – при подготовке тестов прогона тех или иных веток выполнения программной системы.
Мораль стара – полезно встать на место другого, посмотреть на мир его глазами.
Но обратимся снова к конкретному примеру. Зачем нужно такое уточнение? Для человека, хорошо знакомого с предметной областью (доменом) – в данном случае, системой здравоохранения – в этой диаграмме нет новой информации. Для него она неявно содержится уже в первом прецеденте, выводиться из него. Однако, во-первых - не все люди одинаково хорошо знакомы с данным доменом. Во-вторых – они могут иметь разные мнения как на сам домен, так и на то, какие его черты должны быть отражены в разрабатываемой системе. Наконец, мы можем в дальнейшем попросту забыть то, на чем договорились.
Проще говоря, для понимания необходимости диаграмм вообще , достаточно представить себя просто человеком, который не все знает, не все помнит, не все умеет и т.д. Короче – хорошо бы быть скромней…
Описание коммуникаций. Диаграммы последовательностей [системы]- sequence diagrams
Диаграммы последовательностей некоторой системы объектов - артефакт модели (часть документированного описания) прецедентов, используемый для частичного описания поведения некоторой системы объектов в виде возможных, основных (успешных) и альтернативных сценариев.
Главное назначение таких диаграмм - отображение событий, передаваемых исполнителями системе через ее границы. Каждая из них дает схематическое описание сценария прецедента в виде последовательности событий, генерируемых внешними акторами - и компактное, обозримое (для анализа, контроля и т.п.) описание событий, генерируемые внутри самой системы. Иначе говоря – диаграмма пытается ответить скорее на вопрос: «какие главные события инициируются извне», чем как именно система реагирует на внешние сигналы. Не точно и полно - лишь по мере возможности.
Отметим здесь новую трактовку старого поведенческого подхода (бихевиоризм, от behavior - поведение), базового для кибернетики. Строение системы важно – но не само по себе, а лишь постольку, поскольку оно обеспечивает нужное поведение, верную реакцию на внешние сигналы. Не так важно, как устроена система – важнее, чтобы она имитировала нужное поведение. Устройство разнообразных т.н. «умных» машин «виртуально» - это касается машин как реальных, так и виртуальных. Проще говоря – оно не должно и не может походить на настоящее. А поведение – реально.
В кибернетических терминах, все внутренние подсистемы (связанные с описанием объектов данной системы) рассматриваются как "черный ящик", а сама система – как полупрозрачный, или «серый ящик». Как и ранее, то, что находиться вне ящика считается относящимся к логике , внутри ящика – к реализации системы (скрытой в устройстве ящика – касается ли она определения структуры связанных с ним данных или методов). В «полупрозрачном» случае, имеется в виду реализация самого верхнего уровня.
Вспомним, что классы и объекты в ООП описывают – соответственно, на более и менее абстрактном уровне – статическое представление модели. Они содержат указание на методы – именованную ссылку на определение правил (алгоритмов) потенциального поведения объектов, при этом скрывая фактическое поведение объектов, по отношению друг к другу. Проще говоря, они отвечают скорее на вопрос «как может вести себя [один] данный объект», а не на вопрос о том, как ведут себя объекты – вместе, в целом.
Поведение системы объектов рассматривается здесь как скоординированное взаимодействие объектов, фиксируемое в виде временнóй шкалы исполнения методов посылки сообщений - трассы сообщений. Течение времени отображается координатой «сверху вниз», посылающие сообщения объекты (источники) левее, получающие сообщения – правее (приемники сообщений). По возможности.
По процедурному программированию нам хорошо знакомо понятие трассы [состояний] , описывающей фактическое поведение объекта в виде последовательности смен его состояний. При этом каждое из состояний описывается в виде именованного набора значений переменных – характеристик состояния объекта на некий момент времени. В императивной (командной) модели управления подразумевается, что некто (исполнитель верхнего уровня) командует изменениями ниже стоящего объекта, вызывая связанные с ним процедуры в соответствии с некоторым правилом - алгоритмом, программой изменений подчиненного объекта. Трасса вызовов – и есть ветка исполнения алгоритма, представляемая в виде последовательности имен соответствующих процедур.
В данном случае речь снова идет о трассе вызовов – точнее, о трассе инициирующих такие вызовы сообщений. Но уже в более сложном случае системы объектов, изменяющих (через вызов метода объекта-источника) состояний объекта-приемника (а также, возможно, в качестве побочного эффекта – и состояний других объектов). Изменение состояния и трактуется теперь как «событие в жизни объекта».
Здесь по-прежнему есть внешние объекты, инициирующие внутренние процессы обмена сообщениями, но в более сложных для описания случаях нет единого главного «командира» и иерархии подчиненности.
Пример. Бронирование места в гостинице.
|
Внешний объект, инициирующий поток сообщений – окно регистрации Reservation window. Объект Reservation window посылает сообщение makeReservation() {забронировать } соответствующей службе сети отелей HotelChain. Та, в свою очередь пересылает сообщение makeReservation() отелю Hotel. Если в гостинице есть свободные номера, объекта Hotel вызывает методы Reservation {забронировать номер) и Confirmation {подтвердить заказ}.
Каждая из пунктирных вертикальных «линий жизни» (lifeline), представляет заполненное событиями время потенциального существования некоторого объекта – в виде изменения состояний других объектов и изменения его собственных состояний. Каждая стрелка описывает вызов метода посылки сообщения. Стрелка идет от отправителя к приемнику сообщения, выделяя полосу активности (период обработки сообщения - activation bar) на временной координате.
На диаграмме объект Hotel вызывает самого себя (self call) для определения доступности номера. Если условие IsRoom выполняется, Hotel создает объекты Reservation и Confirmation. Звездочка на вызове available означает итерацию – циклический вызов (для того, чтобы выяснить, доступен ли номер для всех дней предполагаемого пребывания гостя). Выражение в квадратных скобках означает условие (предикат).
Диаграмма включает в себя также поясняющий комментарий в виде текста на прямоугольнике с загнутым углом - возможный и, в любом неочевидном случае необходимый для любой иной UML диаграммы.
Диаграммы кооперации (взаимодействий) –
collaboration diagrams
Диаграммы кооперации, как и диаграммы последовательностей, относятся к диаграммам описания взаимодействия. Они содержат ту же информацию, что и диаграммы последовательностей – но в ином ракурсе, фокусируясь не на описании процессов коммуникации между объектами (в виде последовательности вызовов), но на определении роли объектов в качестве источника и приемника сообщений. Словом, здесь мы пытаемся ответить не на вопрос «как» происходит коммуникация фактически, но кто и кому может пересылать сообщения.
Пример. Тот же - бронирование места в гостинице.
|
|
Прямоугольники, представляющие роли объектов, помечаются именем класса и/или объекта (в последнем случае имя класса отделяется от имени объекта двоеточием). Сообщения на диаграмме кооперации нумеруются. При этом сообщения нижнего уровня - посылаемые во время обработки некоторого сообщения - нумеруются префиксами, отделяемыми точками от номера сообщения высшего уровня – в соответствии с последовательностью этих вызовов.
Иначе говоря, таким хорошо известным нам образом (линейная запись дерева) кодируется факт следования или вложенности скрытых здесь процессов обработки сообщений – одного в другой. Как и ранее, они не могут перекрываться.
Описание строения. Диаграммы состояний. Statechart diagrams.
Диаграммы состояний, или автоматные диаграммы - пожалуй, наиболее хорошо нам знакомые. Или, вернее, должны быть нам знакомы - по меньшей мере, по вводному курсу дискретной математики.
Вспомним общие положения. Конечный автомат – модель возможного реагирования (в виде прямой и обратной реакции) объекта моделирования на внешние события - изменения во внешней среде (окружении, периферии, ситуации, контексте и т.п.)
Понятие автомата - центральное в понимании логической схемы функционирования компьютера как устройства, выполняющего пошагово одну-единственную операцию (как и любое иное), имитирующую операцию аппликации (применения функции к аргументу). Неявно, понятие автомата лежит в начале основных программистских концепций – например, трактовке программ как преобразователя потоков и/или последовательных файлов. Но в данном случае, нам стоит вспомнить концепции более ранние. Не о компьютерах или программах, но о не менее знаменитой собаке академика Павлова…
В общем случае, автомат реагирует на такие изменения среды
- явно определяемым изменением состояния своего внутреннего, невидимого извне и скрытого внутри него устройства; такие внутренние состояния в теории автоматов именуются, но не описываются.
- изменением состояния среды – неявным, поскольку наличие таких состояний среды подразумевается, но не сами состояния не определяются.
Обратной связью называется изменение поведения (внутреннего состояния) автомата, возникающее (косвенно) в результате его собственных действий по изменению среды.
В явном виде, определяется коммуникация автомата со средой, в виде
- множества возможных входных и выходных сообщений. Их роль в теории автоматов выполняют элементарные сигналы, буквы (в ООП, естественно – объекты).
- двух функций (или одного оператора), определяющих по текущим входному сообщению и внутреннему состоянию выходное сообщение и следующее внутреннее состояние. Соответственно называемых функцией выхода и функцией перехода (transition).
Если (и когда ) входные сообщения отсутствуют, автомат описывает источник (или отправитель, sender)подготовленных им ранее выходных сообщений. Если (и когда ) отсутствуют выходные сообщения, автомат описывает приемник (адресат, получатель) и обработчик выходных сообщений.
- ввод – набор на клавиатуре - [предположительно] действующего (активного, верного) общего идентификатора пользователя - вроде номера паспорта; в данном случае – это номер клиента системы социального страхования SSN (social security number),
- ввод [предположительно] действующего персонального идентификатора пользователя как клиента данного банка PIN (personal id number)
- отсылку данной информации на проверку (validation).
Описание возможных [внутренних] состояний авторизации начинается с именования. Getting SSN – получить SSN, Getting PIN – получить PIN, Validating – проверка и Rejecting – отказ, в случае неудачи сценария «по умолчанию». Далее определяются переходы из состояния в состояние, для каждой пары состояний и всевозможных комбинаций сообщений.
Что описывается в теории множеств в терминах фундаментального понятия декартового произведения множеств.
Существенным отличием диаграмм состояний в UML (по сравнению с классической теорией автоматов) является возможность описания структурных состояний , т.е. состояний, которые сами являются системами. Тонким моментом является здесь переход сообщений через границы системы. Контуры принятого здесь UML подхода намечены нами при обсуждении понятия прецедента.
Но возможности языков всегда обусловлены необходимостью решения некоторой проблемы и прежде чем «влезать внутрь ящика (черного или серого)» стоит задуматься – какой именно? Классическая теория сложности вычислений определяет «информационный взрыв» - обилие информации, с которой человек не может справиться (manage) в терминах экспонент (например 2 n). Что не подлежит сомнению, но… В практике программирования уже полиномы (в данном случае, минимально n 2) – уже в общем случае не управляемы – не контролируемы, анализируемы, проверяемы и т.п. Для того, чтобы взглянуть в лицо хаосу, достаточно вообразить себе автомат со 50 состояниями. Кажется, немного… если бы не 2500 возможных переходов.
Это касается любых диаграмм – бинарных и иных графов, вне зависимости от интерпретации, типа задачи описания и способа ее решения. Надеюсь, сейчас для нас становиться куда более предметным не только понимание происхождения UML, но и всех иных структурных методов в программировании и в целом – назначение математических формализмов. А ты говорил - «пустая абстракция, оторванная от жизни»… Чьей жизни? - Только не от жизни описателя моделей.
Обратим внимание на интересную особенность примера. Авторизация – не вещь (физический объект), не система таких объектов, но процесс . И вместе с тем, конечно – объект нашего текущего внимания и описания.
Диаграммы деятельности –
activity diagrams.
Диаграммы деятельности – по сути своей, хорошо знакомые нам блок-схемы с рядом особенностей, отражающих изменение процедурного подхода под влиянием ООП и тех идей частичности описаний, которые мы связали ранее с итеративным подходом.
В особенности, трактовкой алгоритмов как совокупного описания множества успешных и неудачных сценариев прецедентов – в сложных случаях описываемых лишь частично на каждой стадии разработки.
Наиболее заметные отличия видны на следующем примере.
Пример. Схема работы банкомата (ATM Machine) по обслуживанию клиента (Customer) банка (Bank).
По-прежнему условия (предикаты) изображаются ромбами, методы ([пользовательские] операторы) – прямоугольниками с закругленными концами.
Сторожевое условие (guard condition) трактуется здесь как проверка необходимости выполнения неправильного хода событий – т.е. неудачного сценария. По сути – необходимости обработки логического исключения (exception) (вызванного сбоем «времени логики», а не «времени исполнения»).
Плавательные дорожки (swimlines) разделяют «пловцов» - объекты, чьи методы исполняются. Как видно из примера, фактически они трактуются здесь как субъекты деятельности , исполняющие некоторую общую работу.
В резком контрасте с ранним императивным и более поздним процедурным подходами. В первом объект исполняет команду, во втором – действия выполняются. В обоих случаях - без явного указания субъекта (актора), инициирующего (начинающего, активирующего) действие (операцию). Блок-схемы (flowcharts, т.е. диаграммы потоков) выражают поток передачи управления – с неявным субъектом управления и явным объектом управления. В данном случае уместнее говорить о субъектах – в рамках распределения и передаче полномочий и ответственности за ту или иную часть работы.
Продолжая разбор этих случаев, можно допустить две интерпретации примера, в зависимости от конкретной предметной области.
· Банкомат и банк вместе составляют систему-сервер, выполняющую работу для инициирующего ее клиента (актора) – имеющего приоритет, отраженный в порядке следования субъектов.
· Все субъекты исполняют некоторую общую работу, преследуя интересы взаимовыгодного сотрудничества. Клиент инициирует работу не потому, что он имеет абсолютный приоритет – но лишь потому, что «в этот раз кто-то все-таки должен начать первым». Иными словами – в других диаграммах возможен иной порядок расположения субъектов.
Конечно, для данной предметной области больше подходит первая, характерная для современных «клиент-серверных» подходов интерпретация.
Мы привыкли рассматривать подобные диаграммы как законченные описания. Но в контексте рассматриваемого подхода, существует еще одна важная трактовка диаграмм, исходящая из возможностей описателя. Можно предположить, что мы находимся на той стадии разработки, когда взаимоотношение субъектов еще не определены или нам неизвестны. Как-то (пока) надо описать.
Немедленным следствием возникающего здесь «разделения труда» между несколькими акторами, является необходимость согласования возникающего параллелизма выполнения действий. На диаграмме такое согласование обозначается новым типом ветвления – вилка (fork) и соединения (join) процессов.
Параллелизм – крайне сложная тема, допускающая много толкований. В контексте необходимости описания предметной области, естественно продолжить тему разделения труда между субъектами исходя из необходимости достижения общего результата. В этом «многопроцессорном» варианте порядок действий неважен.
Исходя из возможностей описателя, возможна иная трактовка. Мы знаем, что данный процесс когда-то должен начаться и когда-то завершиться. Но [пока] не знаем точно порядка действий.
Задача описания предметной области.
Модель предметной области отображает концептуальные классы – основные, с точки зрения моделирующего, классы понятий, относящиеся к предметной области (не к программной реализации).
В случае моделирования бизнеса – деятельности крупных предприятий - обычно говорят о бизнес-логике, бизнес-моделировании и т.п. На языке UML модель предметной области представляется в виде набора диаграмм классов, на которых свойства и методы проименованы, но в общем случае не реализованы. Иначе говоря – по мере возможности, определены интерфейсы классов.
Формально говоря, в рассматриваемом подходе построение диаграмм классов в основных своих принципах мало отличается от принятого в «обычном ООП». Самую существенную разницу привносят рассмотренные нами выше мотивы разделения труда. По мере возможности, программист соучаствует в предыдущих этапах, но отвечает за этап программной реализации. Внутри него, он волен выделять классы, исходя из необходимости решения внутренних проблем программной реализации – в рамках своей роли, он этого делать не может. Классы предметной области заданы реалиями предметной области.
Правда, в предлагаемом подходе это уже не означает односторонней подчиненности – по мере острой необходимости, он (изредка) - в качестве обратной связи (feedback) - может просить об изменении задачи в силу невозможности выполнить задачу в заданных условиях – например, при заданных ресурсах времени (т.е. в срок).
Напомним (в качестве пищи для размышлений), что исторически понятие [петли] обратной связи (feedback loop) появилось в кибернетике (точнее, в теории автоматов) именно в связи с необходимостью формального описания сложного поведения, характерного для живых существ. А не реальных автоматов , наиболее частых (в силу простоты) примеров в сегодняшней литературе по программированию.
Модель предметной области отображает:
· объекты предметной области или концептуальные классы;
· ассоциации между концептуальными классами;
· атрибуты и операции концептуальных классов (имена свойств и методов).
Пример диаграммы классов. Схема оплаты заказов.
Пример подразумевает примерно следующий (успешный) сценарий оплаты (payment) заказа (order) клиентом (customer) некоторой торгово-транспортной компании: «Клиент, заказавший список товаров (см. item – характеризацию свойств товара в отдельном пункте заказа) может оплатить заказ кредитной карточкой (credit), наличными (cash) или банковским чеком (check)»
Обратим внимание, что диаграммы классов, помимо самих классов, описывают в виде графа и разнообразные реальные связи (association) между классами.
Иначе говоря – при описании структуры классов мы применяем идущий от теории множеств и отношений (relation) реляционный подход, рассмотренный нами ранее при освоении реляционных баз данных. Отметим здесь возможность указания кратности связей, описывающих точнее (по сравнению с «один» и «много»), сколько объектов (экземпляров, instance) одного класса может находиться в данном отношении с другим классом. 0..1 - не более одного, 1 - ровно 1, 1* - не менее одного и т.п.
Некоторую путаницу здесь обычно вносит разнообразие типов связей. Здесь связь (association) – любая возможная связь между классами, вне зависимости от того, какое дальнейшее отношение между объектами оно подразумевает.
Одни из них – как и ранее - относятся к описанию структуры данных. Таковы, например, связь Customer-Order и связь «часть-целое» (aggregation, отношение агрегирования) между классами Order и OrderDetail.
Другие (generalization – обобщение) – к описанию взаимосвязи классов по наследованию. См. в примере связь класса Payment с подклассами Cash, Check и Credit. Это статическая (фиксированная) связь между классами , подразумевающая возможность динамической (изменяемой) связи между объектом и классом . В каждый момент времени объект относим к некоторому конкретному классу – но затем эта принадлежность объекта может измениться. Что собственно и отличает понятие класса в ООП от типа в процедурном программировании.
Закладки на будущее. Помимо «просто связей», своеобразной особенностью UML является возможность определения иных, пользовательских типов связей, а также группировки классов в пакеты – по иным, отличным от рассмотренных нами ранее соображениям. В том числе, будущим, пока нам неизвестным.
Обычно пакеты (равно как изначально модули и компоненты) связывают с решением специальных задач обработки программ в качестве данных (например, компиляции), но мы вольны их использовать и по каким-то иным, оригинальным соображением (если они действительно оригинальны).
Диаграммы объектов. *
Диаграммы объектов используются значительно реже диаграмм классов. Фактически, мы спускаемся здесь до уровня программной реализации. Применять их полезно, когда графическое представление помогает обратить внимание участников разработки на те особенности реализации, которые тяжело распознать по тексту программы.
В качестве неформальной мотивации, легко представить температуру в коллективе при возвращении из отпуска программиста, не посвятившего коллег в особенности реализации. Как известно, по закону Паркинсона (он же закон падения бутерброда) необходимость коррекции программного кода происходят как раз во время отсутствия написавшего его программиста! Во всяком случае, такие примеры надолго запоминаются…
Пример 1. Рекурсивные связи
Здесь предполагается иерархия классов, описывающих подразделения (departments) университета.
Пример 2. Унаследованные статические связи.
mathStat, math, statistics, appliedMath, mathEd – объекты, ссылки на класс Department
Вероятно, более сложным и важным примером является описание далеко не всегда очевидных возможностей изменения в программе принадлежности одного объекта к различным классам – относительно иерархии наследования.
Диаграммы компонент и диаграммы развертывания –
Component and deployment diagrams
Компонента [архитектуры программной системы] – модуль, часть [текста] программы, традиционно связываемый с автоматизацией, алгоритмической обработкой программного кода (программы как данные). При использовании UML они трактуются как физические аналоги диаграмм классов и описываются аналогичным образом. Иначе говоря, диаграммы компонентов - формальный аналог диаграмм классов, предназначенный для описания программной архитектуры, строения программной системы.
И в этом качестве – не столь важны для прикладного программиста. Но еще раз обратим здесь внимание на один важный момент. Мы привыкли, что задачи программирования ставятся заказчиком - задаются извне программирования. Но, несомненно, весьма большая часть задач рождается внутри самого программирования – касается ли они software или hardware, программной или аппаратной его части. Так, изначально модули трактовались скорее как единицы компиляции (compilation, сборки) – но проложили путь объектному программированию в качестве универсального способа моделирования. То, что в модульном программировании трактуется как именованная константа (имя модуля обозначает фиксированный интерфейс и его реализацию), в объектном становиться именем переменной (имя объекта обозначает переменный интерфейс и реализацию).
В компонентном программировании понятие компоненты идет еще дальше и имеет более четкое определение. Просто – именованный, но [пока] никак не реализованный интерфейс. Родившись в среде чисто системных задач (особенно важно здесь вспомнить задачу поддержки версий), она становиться здесь инструментом решения любых задач (повышенной сложности).
Диаграммы развертывания предназначены главным образом для описания физической конфигурации (архитектуры) программного и аппаратного обеспечения. Так, следующий пример показывает взаимосвязи между программными и аппаратными компонентами программной системы по обработке транзакций по сделкам с недвижимостью.
Пример. Физическая среда поддержки продажи недвижимости.
Здесь Real Estate Server и Bank Server – сервера агентства по продаже недвижимости и ипотечного банка, предоставляющего ссуду своему клиенту (customer) в ответ на его заявление (application). PC – клиентский компьютер, позволяющий пользователю разрабатываемой нами программной системы делать запросы как в банк, так и агентство, в соответствии с имеющейся в его базе данных списком (listing) предложений.
Аппаратные устройства представляются узлами (nodes). Каждая программная компонента связана с некоторым узлом и представляется на диаграмме в виде прямоугольника с двойной петлей в верхнем левом углу. Отдельным значком (кружок) выделен интерфейс – набор сервисных функций (возможностей поддержки) предоставляемых соотвествующимим системами клиенту.
Концептуальное понимание термина прозрачно. Клиент не может знать сложное внутренное устройство систем (хотя и должен знать, что оно сложно и потому ценить труд разработчиков). Больше того. Не будучи высоквалифицированным специалистом, он не должен вмешиваться в их функционирование – причем даже тогда, когда для этого есть физическая возможность . Это дает косвенное определение моральных ограничений, честного клиента и попросту – культурного человека . Не хакера.
Однако, для нормального функционирования всей системы он вправе получить доступ к интерфейсу – описание которого ему, скорее всего, известно лишь в форме инструкции пользователя в неформальном текстовом или графическом виде, т.е. на обычном человеческом языке. Проще говоря, кто-то все-таки должен ему обяснить азы - «что, как и почему».
По сути единственным существенным нововедением здесь является специальное обозначение символа для интерфейса , рассматриваемого отдельно от его программной или физической реализации (см. обсуждение выше). По всей видимости, Unified Modelling Language еще нуждается в дальнейшей унификации. Что ж, все люди – люди, в том числе и создатели языков моделирования.
Но закончить наш обзор UML я хотел бы не этим – но обращением к читателю.
1. Концептуализация системы: идея приложения – игра на развитие памяти.
2. Аналитическая модель – это точное, четкое представление задачи, позволяющее отвечать на вопросы и строить решения.
3. Проектная модель – это реализация решений задач, понятых на этапе анализа.
Краткое описание игры : на экране появляются фигуры различной формы и цвета, игрок щелкает по последней появившейся фигуре, если выбор сделан правильно, то появляется новая фигура. Суть игры - в том, что чем больше фигур на экране, тем труднее определиться с выбором.
Сложность. Игра должна поддерживать стандартные варианты сложности (например, легкий, средний, трудный). Пользователь должен иметь возможность настроить свою сложность игры.
Уровни. Вне зависимости от типа сложности игра должна поддерживать уровни. Уровень определяет максимальное количество фигур на экране. Т.е. количество фигур – это функция от уровня.
Подсказки. В случае затруднения выбора фигуры игрок может выбрать подсказку.
База данных. По возможности в системе должна храниться информация об игроках.
Дополнительные требования. Необходимо все делать так, чтобы игра была масштабируемой, т.е. пользователь мог подключать к своей игре различные варианты сложности.
Воспользуемся итерационным подходом по разработке приложения. На первой итерации реализуем только небольшую часть требований, так как это обеспечит наиболее раннюю обратную связь.
Модель вариантов использования, прецедентов
Рассмотрим прецеденты Игра и Настройка сложности.
Основными артефактами при моделировании прецедентов являются диаграммы прецедентов, прецеденты, диаграммы последовательностей прецедентов. Многие новички в области ООА/П при моделировании прецедентов делают акцент лишь на диаграммах прецедентов, что по своей сути не приносит существенной пользы. Необходимо понимать, что диаграммы отображают лишь имена , названия прецедентов , а не сами прецеденты.
Рисунок 1. Диаграмма прецедентов
Напомним, что прецедент – это рассказ об использовании системы действующим лицом, который в дальнейшем можно для большей наглядности спроектировать в диаграммы последовательностей прецедентов.
Идентификация действующих лиц. Единственным действующим лицо является Игрок. Игрок не является частью системы, потому как система не может управлять его действиями, мы может ожидать только некоторую последовательность действий от игрока.
Идентификация начальных событий. Определим, какие события инициируют прецеденты Игра и Настройка сложности . В данном случае начальным событием является запрос соответствующих услуг, предоставляемых системой.
Идентификация конечных событий. Также следует определить конечные события. Для прецедента Настройка сложности таковым будет установка параметров сложности игры, здесь все понятно. Для прецедента Игра ситуация иная: вариант использования Игра может продолжаться до тех пор, пока игра не будет выиграна или проиграна. Конечным событием прецедента Игра выберем событие, когда игроку надоест данный сервис, т.е. выход из игры.
Предварительные рекомендации : в качестве прецедентов следует выбирать только полные транзакции, несущие смысл для пользователя системы. Хотя ведущие методологи уже определили стиль написания прецедентов, это вовсе не означает, что мы должны строго следовать ему (или не следовать лишь по причине несогласия). Не забудем, что прецеденты отвечают на вопрос “что”, а не на вопрос “как”, т.е. не надо в прецеденте описывать каким образом достигается тот или иной результат.
Прецедент Игра.
Прецедент Настройка сложности.
Многим коллегам может показаться абсурдность моделирования такой маленькой задачи. Но в том-то и прелесть, что маленький пример лишь иллюстрирует принципы, не отвлекая нас от самих принципов, рассматриваемого в данном пособии. Иначе, увлекшись самой игрой (предметной областью) можно забыть, то зачем мы здесь сегодня собрались.
Теперь спроектируем прецеденты в диаграммы последовательностей прецедентов. Хотя в UML и нет такого понятия, оно позволит нам воссоздать некое логическое звено в рассуждениях по построению моделей.
Рисунок 2. Диаграмма последовательностей прецедента Игра
Рисунок 3. Диаграмма последовательностей прецедента Настройка сложности
Анализ приложения
В анализе предметной области нет необходимости, потому как, приложение не имеет аналогов в реальном мире. Проведем анализ приложения: выделим аспекты программного приложения, видимые пользователю и отражающие его точку зрения. Но анализ предметной области можно провести по аналогичной схеме.
Модель классов приложения.
Одним из артефактов анализа приложения являются диаграммы классов приложения. Это означает, что в моделях нежелательно отображать классы, относящиеся к уровню реализации (списки, деревья и т.п. абстрактные типы данных).
Классы. В качестве источника потенциальных классов выделим прецеденты, но это не единственный источник. Обычно классы соответствуют существительным. Например, из предложения – система (экран) отображает фигуру, можно отобрать потенциальные классы Система (экран), Фигура.
Проблема: одна часть речи может плавно перетекать в другую. Не стоит долго мучиться над вопросом соотношения ключевых слов со списком потенциальных классов. Модели классов будут уточняться со временем, и абсолютно корректную модель построить сразу, чаще всего, невозможно. Хотя это и не означает, что это бесполезное занятие.
Выбираем потенциальные классы для нашего примера: игрок, игра, фигура, сложность, уровень, эллипс, прямоугольник.
Замечание: вообще говоря, для каждого прецедента обычно приходится строить свою модель классов. Но так как приложение небольшое, то построим единую модель классов для обоих прецедентов.
Свойства. Определим свойства классов. Свойства – это такие концепции, которые не обладают собственной индивидуальностью. В данном случае, например, цвет фигуры (но если бы мы строили графический редактор, то цвет, скорее всего, обладал бы такой индивидуальностью). Такие свойства можно найти в списке потенциальных классов.
Типичной ошибкой при выделении свойств является запись в свойства классов объектов, которые представляют собой сложные объекты. Например, можно в качестве свойства класса игра указать сложность, но класс сложность обладает своим уникальным поведением, для него важна индивидуальность, поэтому эти два класса лучше связать между собой посредством ассоциации.
Замечание : если вы строите модель приложения или предметной области, то также не стоит указывать в качестве свойств внутренний идентификатор. Такого рода атрибут не имеет значения в реальном мире, а приносит лишь удобство для реализации.
Ассоциации. Далее между выбранными классами установим связи – ассоциации. Связи можно извлечь из тех же прецедентов, глаголы – это потенциальные связи. Иначе говоря – как и ранее - проблема понимания слов естественного языка в том или ином качестве остается.
Например, игра определяется сложностью.
Рисунок 4. Диаграмма классов приложения
На диаграмме присутствуют две ассоциации - игра определяется сложностью , фигура определяется сложностью .
Зная шаблон проектирования Низкое связывание , вижу потенциальную ошибку, что одна из этих ассоциаций лишняя, но какая именно - решу на этапе проектирования.
Операции. При моделировании классов сразу можно выделить наиболее очевидные операции. Например, фигуру можно прорисовать.
Рекомендация: вообще говоря, диаграмма классов строится параллельно с диаграммой взаимодействия, на диаграмме взаимодействия отображаются сообщения, посылаемые между объектами. Сообщение – это вызов функции класса. Так что операции классов лучше брать из диаграмм взаимодействия.
Обобщения. Далее организуем структуру иерархии классов по наследованию путем выявления общей структуры. Общую структуру можно выделить у классов Эллипс, Прямоугольник и т.д. в класс Фигура . К такому обобщению можно прийти из двух соображений. Обобщение снизу вверх: в суперклассе Фигура должны быть определены общие черты для классов Эллипс, Прямоугольник (координаты, цвет, время жизни). Конкретизация сверху вниз: выделим из описания игры именные группы, состоящие из различных обстоятельств с указанным существительным. Например, «фигура прямоугольник» или «фигура эллипс».
Рисунок 5. Диаграмма классов приложения с обобщением
Замечание: возможно, это обобщение даст в дальнейшем точку расширения типов фигур, отображаемых на экране.
Резюме: модели классов полезны не только для определения структур данных. Прослеживание моделей классов позволяет выразить некоторые виды поведения, т.е. прецеденты.
Модель состояний приложения
Еще одним артефактом этапа анализа приложения являются диаграммы состояний. Диаграммы состояний требуются для объектов предметной области, которые имеют нетривиальное, в том числе циклическое поведение. Большинство же классов в нашем случае не требует использования диаграмм состояний, для их описания достаточно списка операций. Например, таковым является класс Фигура - для данного приложения неважно, в каком состоянии находиться фигура.
Выделим классы, обладающие разными состояниями. Таковым, например, является класс Игра . Этот класс может находиться в состояниях Игры, Победы и т.д.
Выделим состояния класса Игры . Для этого мысленно представим себе объект класса Игра, пытаясь понять различия этого объекта в состояниях Игра, Победа, Проигрыш . В состоянии Игра объект прорисовывает фигуру, а в остальных состояниях – нет. Иначе говоря, ассоциация между классами Игра и Фигура присутствует в состоянии Игра , а в состояниях Победа и Проигрыш эта ассоциация отсутствует (тем самым состояния Победа и Проигрыш для меня неотличимы).
По причине маленького масштаба примера, может показаться, что нет необходимости в данных моделях. На практике в таком случае можно отнести их к программной реализации, но здесь возникает желание привести пример моделирования диаграммы состояний.
Выделение событий. После выделения состояний необходимо выделить события, которые вызывают переход между состояниями.
· Событие сигнала – это событие получения или отправки сигнала.
· Событие изменения – это событие, вызванное выполнением логического выражения.
· Событие времени – это событие, вызванное достижения момента абсолютного времени или истечением временного интервала.
Событие изменения Выполнение условий игры переводит объект класса Игра из состояния Игры в состояние Победа . Событие изменения Невыполнение условий игры переводит объект класса Игра из состояния Игры в состояние Проигрыш . Тем самым разные события приводят объект в разные состояния.
Событие – это точки на линии времени, а состояния – это интервалы.
Рисунок 6. Диаграмма состояний для класса Игра
Внутри состояний также могут происходить события, но эти события не вызывают переходов между состояниями. Например, в состоянии Игра происходят события прорисовки фигур, события выбора игроком фигуры.
Диаграмма состояний объекта – это автомат (граф), вершинами которого являются состояния, а ребрами – события.
Резюме: на этом мы заканчиваем процесс проведения анализа предметной области приложения. После этого следует еще раз пересмотреть полученные модели, подкорректировать при необходимости. Основная цель анализа – определение проблемы, не давая особых преимуществ какому-либо варианту реализации.
Проектирование приложения
Проектирование системы – это выбор высокоуровневой стратегии решения задач.
Модель взаимодействий приложения
Вернемся к прецедентам, потому как модели взаимодействий строятся на модели прецедентов. Артефакт диаграммы последовательностей прецедентов отвечали на вопрос “что”, в данном разделе построим диаграммы последовательностей, отвечающие на вопрос “как” при решении задач варианта использования Игра.
Обратимся к сценарию прецедента Игра, инициализация которого происходит после события запуска этого сервиса Игроком.
Инициализация игры. Согласно шаблонам проектирования необходим класс-контроллер, который будет принимать на себя “огонь” событий от пользователя. Пусть класс Игра отвечает за запуск игры.
Создание фигуры включает в себя последовательность действий: случайное определение параметров будущей фигуры и создание фигуры согласно параметрам.
Определение значений атрибутов будущей фигуры. Так как фигура определяется атрибутами (тип, цвет, положение), а значения атрибутов должны быть случайны, то необходим класс, который будет отвечать за случайное образование значений атрибутов – класс Алгоритм . Значения атрибутов зависят от сложности игры. Иначе говоря, здесь мы замечаем связывание классов Алгоритм и Сложность - т.е. значения атрибутов есть функция от Сложности. Тем самым Сложность передается классу Алгоритм в качестве параметра. Значит, Сложность надо передать в качестве параметра при запуске игры.
Создание фигуры. Параметры будущей фигуры определены, но какой класс будет отвечать за создание фигуры? Здесь применим шаблон проектирования Creator, согласно которому создавать будет тот класс, который обладает большей информацией об объекте, таковым является класс Алгоритм. Класс Алгоритм возвратит классу Игра положение новой фигуры. После создания фигуры класс переходит в режим ожидания выбора пользователем фигуры.
Выбор фигуры. Обработку этого события примет на себя класс-контроллер Игра. Проверку верности выбора фигуры игроком производи сам класс-контроллер, так как он обладает всей информацией для этого. Если Игрок сделал верный выбор, то система опять прорисовывает новую фигуру, иначе игра переходит в состояние Проигрыша.
Рисунок 7. Диаграмма последовательностей прецедента Игра
Резюме: не все со мной могут согласиться при принятом здесь подходе к анализу и проектированию данной конкретной системы. Вообще говоря, он отражает достаточно субъективный взгляд на вещи.
ПОСЛЕСЛОВИЕ ДЛЯ ХАКЕРОВ. ОСНОВНОЙ РЕСУРС.
Конечно, не все из сказанного выше было для тебя на 100% ясно и на 100% полезно - в смысле 100% готовности завтра же приступить к разработке сложных программных систем 100% надежности. Вроде так актуальных сегодня систем задач 100% защиты информации «от где-то спрятавшихся злобных хакеров». Я не верю, что стопроцентные гарантии здесь возможны - и нужны вообще. Во всяком случае, эта скромная методичка не ставила перед собой недостижимых целей. Это всего лишь инструкция для еще не квалифицированного пользователя (клиента) языка UML . Написанная, по мере возможности, «по-человечески».
Никто не совершенен – ни ты, «клиент образования», ни я, твой «сервер». Ты недоучился или я недоучил, теперь уже поздно искать виноватых. Здесь мы сделали лишь первую итерацию в процессе подготовки. Конечно, для достаточно надежного программирования сложных систем нужно еще углубляться, специализироваться, еще многое знать и уметь. Это ясно. Но данное пособие – о другом. Здесь я хотел сделать не шаг вперед, но шаг назад – показать тебе, что сначала нужно суметь заново понять уже пройденное . Зачастую – недопонятое, пройденное мимо.
Хакер – вовсе не злобный преступник. По крайней мере – изначально. Напротив, хакером называют и энтузиаста программирования. Тогда хакеры - это ты и я. Что ж, без интереса к работе – жизнь скучна. Мы же все-таки люди, не роботы. Все не идеальны, все индивидуальны.
Но все мы поначалу беремся сделать 1) все 2) сразу 3) идеально. И это нормально – пока не сильно касается других, близких и дальних. Момент истины наступает, когда наш идеальный сценарий заканчивается неудачей. Тогда одни начинают учиться работать всерьез, а те, что покруче - искать виноватых. «Недоучили, не так и не тому учили» – в общем, недодали ресурсов. Милый, а ты сам – сильно вкладывался? Не скрыты ли за твоей непоколебимой верой в безграничную мощь собственной интуиции надежда на авось и… обычная лень, нежелание трудиться?
Hack-work – это поденщина, рутинная и халтурная работа, а «крутой хакер» – человек крайне ненадежный. Бесплатно или за хорошие деньги, но если такой возьмется за разработку уже не игрушечных систем – реального вреда будет не меньше, чем от любого «злобного хакера» (как правило – виртуального). Расплачиваться же тогда будут все. Реально. И интересно тогда уже точно никому не будет.
Дело тут не в самих деньгах, договорах и иных артефактах. Это лишь обозначения общественного договора, знаки доверия и договоренностей между людьми. Просто на будущее вещи приходиться фиксировать – чтобы не забыть прошлого. Основной ресурс – ресурс человеческих взаимоотношений. Если не приумножать его, тогда действительно – кому нужна вся эта математика? It’s a deal -договорились?
Я надеюсь, теперь ты лучше понимаешь то, на что и кого именно я делал свой расчет. Вот такая математика…
СПИСОК ЛИТЕРАТУРЫ
1. Гради Буч, Джеймс Рамбо, Ивар Джекобсон – Язык UML. Руководство пользователя. Издательство ДМК Пресс, 2007 г., 496 с. Классика от создателей UML.
2. Крэг Ларман – Применение UML 2.0 и шаблонов проектирования. Издательство Вильямс, 2008 г., 736 с. Отражает доминирующий сегодня инженерный подход к ОО АП.
3. Дж. Рамбо, М. Блаха - UML 2.O. Объектно-ориентированное моделирование и разработка. 2-е изд. - СПб.: Питер, 2007. - 544 с. То же, с чуть более практическим уклоном.
4. Rational University – материалы академической программы корпорации IBM (см. http://www.ibm.com/ru/software/info/students/): Essentials of visual modeling, Fundamentals of Rational Rose. Сокровищница примеров, тестов и лабораторных работ.
Дополнительная литература.
1. Мартин Фаулер. UML. Основы. Издательство Символ-Плюс, 2006 г., 192 с. Краткий справочник.
2. Rational University – материалы академической программы корпорации IBM (см. http://www.ibm.com/ru/software/info/students/): Mastering Object-Oriented Analysis and Design, Managing the Management of Iterative Development и другие.
3. Бертран Мейер. Объектно-ориентирование конструирование программных систем . Издательство Русская редакция 2005 г., 1204 с. Отражает более классический взгляд на современную ситуацию. Требует хорошей математической подготовки.
Дополнительная литература - для преподавателей.
Ф.А. Новиков. Описание практической работы студентов (ЛП) по дисциплине «Анализ и проектирование на UML» - кафедра «Технологии программирования», Санкт‐Петербургский государственный университет информационных технологий, механики и оптики, Санкт‐Петербург, 2007
Выше автор ориентировался на индивидуальную подготовку. Но единственный надежный способ практической проверки понимания изложенных выше концепций ОО АП – особенно, «критерия 36.6» - коллективная, командная разработка . Методическая разработка Ф. Новикова дает здесь хороший старт - в виде схемы проведения соответствующих лабораторных работ. Хотя автор лично рекомендовал бы для их выполнения задания игрового характера, не претендующие на серьезность. Например - шахматы, шашки, иные настольные игры.
Впрочем, стоит перечитать Ромео и Джульетту , чтобы понять, что истинный смысл цитаты относиться не к собственно розам. Даже - рациональным или виртуальным. Главная тема трагедии обозначается в самом ее начале: Две равно уважаемых семьи в Вероне, где встречают нас события…
Слушателям данного курса доступны лицензионные программные продукты компаний IBM и Microsoft – для этого достаточно обратиться к преподавателю курса (автору данного пособия)
В рамках, определяемых популярной шуткой. Преподаватель – преподавателю: «Ну и глупые же студенты попались. Объяснял, объяснял – уже сам все понял, а они все никак не поймут!»
Говорят, что Ньютон произнес эту знаменитую фразу в связи с обсуждением распределения академических часов на занятия иностранными языками и математикой.
Согласно учебной программе:(- но смотри послесловие J
Русскоязычная терминология, относящая к рассматриваемым проблемам, еще не вполне устоялась. В случае затруднений с переводом автор – во избежание неоднозначного понимания - использует «кальку». Неточный перевод чужих реалий в свои собственные порождает крайне тяжелые проблемы.
Collaboration – сотрудничество. В русском языке слово коллаборационист имеет негативный смысл, потому чаще говорят о диаграммах коопераций.
Автор главы – Анастасия Сабирзянова. Я внес лишь несущественные стилистические правки – поскольку мне нравиться ее живой и честный стиль изложения процесса разработки. Понятно, при желании она могла бы слукавить… Ведь Анастасия отлично закончила факультет ВМК КГУ и имеет уже достаточно большой опыт практического разработки коммерческих приложений. Впрочем - наверное, именно поэтому и не смогла… Н.Б.
Что верно – при учете необходимости трактовать в таких случаях иные части речи как существительные. Вспомним пример «Авторизация», где мы трактуем операцию авторизовать как процесс. Н.Б.
Ключевые слова : имеется в виду глоссарий – компактный список основных терминов, описывающих предметную область. В остальном - мнение Анастасии хорошо ложиться в концепцию ОО АП. Модель – не только и не столько конечный результат разработки. Это текущий результат понимания проблем, с ней связанных. Отсюда – необходимость и полезность проб. Н.Б.
Не всегда, не абсолютно. Описание предметной области имеет приоритет – по умолчанию , при прочих равных условиях. Но напомним, главной задачей итеративного метода является (более-менее) равномерное продвижение всех видов работ. Внутренний идентификатор – например, первичный ключ таблицы БД - также может быть выбран далеко не случайно, но исходя из задач программной реализации. Можно представить себе крайнюю исключительную ситуацию, когда из-за проблем реализации приходиться ограничивать описание предметной области. Разница – в том, что обоснования требуют единичные исключения, а не общие правила. Н.Б.
Мы не затрагивали в данном пособии крайне полезное понятие шаблона проектирования (к тому же, если честно - я не помню такого шаблона). Пока – до знакомства с ним по литературе (см. например ) читатель здесь и далее может читать его так: «ведущие разработчики с большим опытом рекомендуют создать в данной ситуации следующий класс». Н.Б.
В простых случаях. В общем случае, сообщение ссылается на вызов, и соотношение сообщений и операций приходиться задавать особо. Н.Б.
Равно как и желание предупредить возможные ошибки на более ранней стадии. Н.Б.
Я не случайно выделил выше субъекты действий. В главном, я солидарен с Анастасией в ее понимания сути подхода, выраженном ранее и во введении к примеру. Все разработчики – субъекты, или попросту – люди. Не боги, но и не роботы. А каждый человек имеет свой личный подход к решению проблем, зависящий от теоретической квалификации, практического опыта и многих иных вещей – крайне полезных для понимания проблем, но не предопределяющих однозначно решения. Жизнь сложна – языки просты.
Болезни современного программирования, которую и пытается лечить UML – идут от обратного. Не разобравшись в проблемах, мы часто заранее уверены в однозначности решения. Каждый – своего собственного. Оттого-то зачастую температура «в среднем по больнице» поднимается выше нормальной 36.6 - Н.Б.
Лекция 6:
Диаграммы прецедентов: крупным планом
Несколько слов о требованиях
Итак, поговорим о требованиях. Что это такое, мы, в общем, понимаем - когда заказчик описывает нам, чего же именно он хочет, мы всегда слышим фразы типа "хотелось бы, чтобы проверка обновлений проводилась автоматически, как в антивирусах", "хочу большую зеленую кнопку в центре окна, которая начинает процесс", "программа должна позволять просматривать и печатать отчеты", "и чтоб красивенько все было, с полупрозрачностями, как в Висте", "при выходе должно выводиться подтверждение" и т. д. и т. п. Конечно, как настоящие разработчики, мы понимаем и то, что заказчик никогда не знает, что именно ему нужно, а если понимает, то объяснить не может. Но ведь фразы-то всегда, по сути, одинаковы! Они описывают, как заказчик представляет себе систему, чего заказчик хочет от системы, функциональность, которой он от нее ожидает, требования, которые к ней предъявляет.
Если обратиться к классикам, например, к той же "банде трех" (Якобсон, Буч, Рамбо), мы узнаем, что требование - это желаемая функциональность, свойство или поведение системы . Именно со сбора требований начинается процесс разработки ПО . Если изобразить процесс разработки ПО в виде " черного ящика " (уверены, читатель знает, что это такое, если нет - "Википедия" к вашим услугам), на выходе которого мы получаем программный продукт , то на вход этого "черного ящика" будет подаваться именно набор требований к программному продукту (рис. 6.1 )!
Рис. 6.1.
Кстати, какую диаграмму напоминает этот рисунок? Правильно, диаграмму активностей . И выбор именно этой диаграммы тут абсолютно оправдан - помните, мы говорили, что диаграммы активностей часто используют для описания бизнес-процессов? Единственный нюанс: обычно процесс разработки не заканчивается с выпуском программного продукта - грядет новая итерация , новые, уточненные требования, новая версия и т. д.
Кстати, вернемся к требованиям. Да, мы сказали, что на вход нашего "черного ящика" подается набор требований. Но в какой форме? Как их документируют, эти требования? Думаю, большинство читателей помнит, что такое техническое задание - основной документ, без составления которого не начинался в советские времена ни один проект. Документ это был большой, многостраничный, с четкой структурой, определяемой ГОСТами (государственными отраслевыми стандартами). И описывал он, по сути, не что иное, как требования к создаваемой системе!
Техническое задание - вещь по -своему хорошая. Но время шло, менялись стандарты, нотации, способы описания требований. И вот постепенно техническое задание уступило место набору артефактов, состоящему из документов двух видов:
· диаграммы прецедентов ;
· нефункциональные требования.
Диаграммы прецедентов составляют модель прецедентов (вариантов использования, use-cases). Прецедент - это функциональность системы, позволяющая пользователю получить некий значимый для него, ощутимый и измеримый результат. Каждый прецедент соответствует отдельному сервису, предоставляемому моделируемой системой в ответ на запрос пользователя, т. е. определяет способ использования этой системы. Именно по этой причине use cases, или прецеденты, часто в русской терминологии фигурируют как варианты использования . Варианты использования чаще всего применяются для спецификации внешних требований к проектируемой системе или для спецификации функционального поведения уже существующей системы. Кроме этого, варианты использования неявно описывают типичные способы взаимодействия пользователя с системой, позволяющие корректно работать с предоставляемыми системой сервисами.
Нефункциональные требования - это описание таких свойств системы, как особенности среды и реализации, производительность ,расширяемость , надежность и т. д. Часто нефункциональные требования не привязаны к конкретному варианту использования и потому выносятся в отдельный список дополнительных требований к системе (рис. 6.2 ).
Рис. 6.2.
Но вернемся же к прецедентам (вариантам использования). Идентифицировать прецеденты и действующие лица - обязанность системного аналитика. И делает он это для того, чтобы:
· четко разграничить систему и ее окружение;
· определить, какие действующие лица и как именно взаимодействуют с системой, какой функционал (варианты использования) ожидается от системы;
· определить и описать в словаре предметной области (глоссарии) общие понятия, которые необходимы для детального описания функционала системы (прецедентов).
Подобный вид деятельности обычно выполняется в такой последовательности:
1. Определение действующих лиц.
2. Определение прецедентов.
3. Составление описания каждого прецедента.
4. Описание модели прецедентов в целом (этот этап включает в себя создание словаря предметной области).
Вначале требования оформляются в виде обычного текстового документа, который создается или самим пользователем, или пользователем и разработчиком вместе. Далее требования оформляют в виде таблицы. В левую колонку помещают прецеденты, а в правую - действующих лиц, участвующих в прецеденте.
Рассмотрим пример. Секретарь размещает на сервере меню обеденных блюд на неделю. Сотрудники должны иметь возможность ознакомиться с меню и сделать заказ, выбрав блюда на каждый день следующей недели. Офис -менеджер должен иметь возможность сформировать счет и оплатить его. Система должна быть написана на ASP .NET . Такое вот нехитрое интернет-приложение для автоматизации заказов обедов в офис .
Думаем, здесь все понятно. Таблица с описанием требований может быть, например, такой:
Прецедент | Действующее лицо |
разместить меню | секретарь |
ознакомиться с меню | |
сделать заказ | сотрудник, секретарь, офис-менеджер |
сформировать счет | офис-менеджер |
оплатить счет | офис-менеджер |
Здесь нигде не сказано о том, что система должна быть написана на ASP .NET . Почему - понятно: это ведь нефункциональное требование! И еще, очевидно, что секретарь и офис -менеджер тоже являются сотрудниками. Читатель, внимательно прочитавший предыдущие лекции, заподозрит, что в данном случае, создавая модель прецедентов, говоря о действующих лицах, можно бы применить генерализацию. Действительно, диаграмма прецедентов , построенная на основе этой таблицы, может быть, например, такой (рис. 6.3 ):
Рис. 6.3.
Диаграммы прецедентов и их нотация
Что ж, у нас есть пример диаграммы. Итак, какие же элементы мы на ней видим? Первое, что бросается в глаза, - большойпрямоугольник , внутри которого размещаются эллипсы, обозначающие, как мы уже поняли, прецеденты. В верхней части прямоугольника указано название моделируемой системы, а называют его рамками системы (system boundary , subject boundary ),контекстом или просто системой . Этот элемент диаграммы показывает границу между тем, что вы как аналитик показали в виде прецедентов (внутри этих рамок), и тем, что вы изобразили как действующие лица (вне их). Чаще всего таким прямоугольником показывают границы самой моделируемой системы . То есть внутри границы находятся прецеденты - тот функционал, который реализует система (и в этом смысле прецеденты могут рассматриваться как представления подсистем и классов модели), а снаружи - действующие лица : пользователи и другие внешние сущности , взаимодействующие с моделируемой системой.
Следует сказать, что рамки системы на диаграммах прецедентов изображают довольно редко, т. к. они неявно подразумеваются самой диаграммой. По сути, этот элемент не привносит в диаграмму какой-либо дополнительной значимой информации, так что его использование - дело вкуса аналитика. Появление рамок системы на диаграмме прецедентов чаще всего диктуется особенностями персонального стиля проектирования.
Кроме рамок системы или ее контекста на диаграмме мы видим еще два вида связанных с ней сущностей - это действующие лица (экторы, actors) и прецеденты . Начнем с экторов. Довольно часто в русскоязычной литературе по UML для обозначения действующих лиц можно встретить термин "актер ". В принципе, смысл его более-менее понятен и оригинальному английскому термину он созвучен. Более того, есть еще одна причина такого перевода. Какое слово первым приходит к вам в голову, когда вы слышите слово "актер "? Да, конечно же - слово "роль"! Именно о ролях мы вскоре и поговорим, когда будем пытаться разобраться, что скрывается за понятием "действующее лицо". А пока, да простит нас читатель, далее мы все же будем пользоваться словом "эктор" - транскрипцией оригинального термина. Помнится, мы уже как-то писали о нашем отношении к буквальному переводу терминологии...
Итак, какой же смысл вкладывают в понятие эктора? Эктор - это набор ролей, которые исполняет пользователь в ходе взаимодействия с некоторой сущностью (системой, подсистемой, классом). Эктор может быть человеком, другой системой, подсистемой или классом, которые представляют нечто за пределами рассматриваемой сущности. Экторы "общаются" с системой путем обмена сообщениями. Четко выделив экторов, вы тем самым ясно определяете границу между тем, что внутри системы, и тем, что снаружи, - рамки системы.
Возможно, слова "роли, исполняемые пользователем" в определении эктора звучат не очень понятно. Очень забавно это понятие объясняется в Zicom Mentor:
роль - это не конкретный пользователь, а подобие шляпы, которую человек надевает, когда взаимодействует с сущностью.
Действительно, наденьте шляпу пирата - и вы капитан Джек Воробей, а наденьте цилиндр и вы - Джек-потрошитель! Шутка... "Физический" пользователь может играть роль одного или даже нескольких экторов, выполняя их функции в ходе взаимодействия с системой. И наоборот, роль одного и того же эктора может выполняться несколькими пользователями.
На диаграммах UML экторы изображаются в виде стилизованных человечков, ведь, как вы, конечно, помните, идея была в создании нотации, любой символ которой легко может быть изображен от руки (рис. 6.4 ):
Рис. 6.4.
Несмотря на "человеческий" вид этого обозначения, не следует забывать, что экторы - это не обязательно люди. Эктором, как мы уже говорили ранее, может быть внешняя система, подсистема, класс
и т. д. Кстати, человечек ("stick-person"
) - это не единственное обозначение эктора, используемое в UML
. На диаграммах прецедентов обычно применяется именно "человекоподобная" форма эктора, но на других диаграммах, и особенно в случаях, когда эктор имеет атрибуты
, которые важно показать, используется изображение эктора как класса со стереотипом
<
Рис. 6.5.
С системой экторы, как мы уже сказали, общаются через сообщения, но если говорить на более высоком уровне абстракции, в терминах модели прецедентов, то взаимодействуют они с системой через прецеденты. Один и тот же эктор может быть связан с несколькими прецедентами, и наоборот, один прецедент может быть связан с несколькими разными экторами. Ассоциации между эктором и прецедентом всегда бинарные - т. е. представляют отношения типа "один к одному", использование кратности недопустимо. Это не противоречит сказанному выше: действительно, один эктор может быть связан с несколькими прецедентами, но только с помощью отдельных ассоциаций - по одной на каждый прецедент . Мы видели это в нашем примере. Кстати, там мы видели ассоциации, изображенные не просто в виде линий, а стрелками. Думаем, смысл этого обозначения вполне понятен: этонаправленная ассоциация и стрелка (как и на других диаграммах) всегда направлена в сторону той сущности, от которой что-то требуют, чьим сервисом пользуются и т. д.
И еще - экторы не могут быть связаны друг с другом. Единственное допустимое отношение между экторами - генерализация (наследование ). Опять-таки, в нашем примере с заказом обедов в офис , вы могли увидеть именно такой вид отношений между экторами. Это не значит, что в реальной жизни офис -менеджер и секретарь (да и вообще любые два сотрудника) не могут общаться: просто при создании модели прецедентов такое общение не попадает в область наших интересов, считается несущественным.
Еще один тип элементов, встречающийся на диаграммах прецедентов, более того, давший им название, - это собственнопрецеденты , или варианты использования. Прецедент - это описание набора последовательных событий (включая возможные варианты), выполняемых системой, которые приводят к наблюдаемому эктором результату. Прецеденты описывают сервисы, предоставляемые системой экторам, с которыми она взаимодействует. Причем прецедент никогда не объясняет, "как" работает сервис, а только описывает, "что" делается.
Изображаются прецеденты в виде эллипса, внутрь контура которого помещается имя (описание) прецедента. Имя прецедента обычно намного длиннее имен других элементов модели. Почему это так, в принципе, понятно: имя прецедента описывает взаимодействие эктора с системой, говорит о том, какими сообщениями они обмениваются между собой. В нашем примере с заказом обедов мы видели несколько прецедентов и наверняка читатель заметил, что имя прецедента - это, скорее, название сценария, воспроизводящегося в ходе взаимодействия эктора с системой. Причем это всегда описание с точки зрения эктора , описание услуг, предоставляемых системой пользователю. Приведем пример простейшей диаграммы, иллюстрирующей сказанное нами об обозначениях прецедента (рис. 6.6 ).
Рис. 6.6.
В этом примере пассажир может купить в сервисной кассе билет на некоторый вид транспорта. Покупка билета - это название сценария, по которому эктор (пассажир) может взаимодействовать с системой (кассой). Заметьте, это не описание сценария, а именно название - оно говорит нам, что делает эктор в процессе взаимодействия, но не говорит, как именно! И еще - прецеденты определяют непересекающиеся сценарии поведения. Выполнение одного прецедента не может быть прервано в результате работы другого прецедента. Другими словами, выполнение одного прецедента не может быть прервано в результате событий или действий, вызванных выполнением другого прецедента. Прецеденты выступают как атомарные транзакции , выполнение которых не может быть прервано.
Внимательный читатель, возможно, отметил то, как незаметно мы ввели в употребление слово " сценарий ". Что же такоесценарий и как понятие сценария связано с понятием прецедента? На первый вопрос хорошо отвечают классики (Г. Буч):
Сценарий - это конкретная последовательность действий, иллюстрирующая поведение.
Сценарий - это повествовательный рассказ о совершаемых эктором действиях, история, эпизод, происходящий в данных временных рамках и данном контексте взаимодействия. Сценарии (в различных формах представления) широко применяются в процессе разработки программного обеспечения. Как мы уже только что отметили, написание сценария напоминает написание художественного рассказа, и этим объясняется тот факт, что использование сценариев широко распространено среди аналитиков, которые часто обладают художественными или литературными способностями. Несмотря на непрерывный повествовательный характер, сценарии можно рассматривать как последовательности действий (делать раскадровку ). При разработке пользовательского интерфейса сценарии описывают взаимодействие между пользователем (или категорией пользователей, например, администраторами системы, конечными пользователями) и системой. Такой сценарий состоит из последовательного описания комбинаций отдельных действий и задач (например, нажатий клавиш, щелчков по элементам управления, ввода данных в соответствующие поля и т. д.). Вспомните, к примеру, описания последовательностей действий пользователя (предназначенных для достижения определенных результатов, решения определенных задач), которые вы находите в справке к малознакомой программе. То же самое можно сказать о модных сейчас "how-to videos", в которых такие последовательности отображаются визуально, на конкретных примерах. В любом случае, цель подобных справочных материалов - предоставить описание типичных сценариев использования системы, сценариев взаимодействия между пользователем и системой.
Сценарии также иногда можно увидеть на диаграмме прецедентов. Иногда их изображают в виде " листа бумаги ", на котором написано имя файла , - прямоугольника с загнутым нижним левым уголком. В этом случае указанный файл содержит в себе описание данного сценария. А иногда сценарий записывается в комментарий. Как вы, наверное, помните, комментарии (ноутсы, notes) изображаются прямоугольниками с загнутым верхним правым углом и соединяются с элементом, который они поясняют, пунктирной линией (рис. 6.7 ).
Рис. 6.7.
Как мы уже упоминали, сценарии могут быть записаны в различных формах. Это может быть структурированный, но неформализованный текст, формализованный структурированный текст, псевдокод , таблица , диаграмма активностей , наконец! Каждый сценарий описывает в повествовательной форме завершенное, конкретное взаимодействие, имеющее с точки зрения пользователя определенную цель. Если рассматривать табличную форму представления сценария, то линия, разделяющая левый и правый столбцы таблицы, символизируют собой границу, отделяющую действия пользователя от ответных действий системы. Табличная форма особо подчеркивает участие пользователя, что является очень важным аспектом при разработке пользовательского интерфейса.
Вот пример простого (неформализованного) текстового описания сценария.
Пользователь вводит логин, пароль, адрес электронной почты и код подтверждения и нажимает кнопку "Далее". Система запрашивает ввод проверочного кода. Пользователь вводит код и нажимает кнопку "Далее". Система проверяет соответствие кода изображенному на картинке .
Не правда ли, знакомая процедура? Да, это описание регистрации пользователя на некотором сайте. Правда, не совсем полное: не рассмотрены случаи, когда выбранный пользователем логин уже занят, адрес электронной почты введен неправильно, пароль не удовлетворяет требованиям или код не соответствует изображенному на картинке. О таких случаях - альтернативных сценариях - мы поговорим чуть позже.
А вот тот же сценарий в табличном представлении:
Вы, конечно, заметили, что этот сценарий можно детализировать - например, прежде чем попросить ввести проверочный код, система отображает картинку, на которой этот самый код изображен. Т. е. запрос на ввод кода включает в себя вывод картинки с упомянутым кодом. Об этом мы тоже еще поговорим.
А пока попробуем ответить на второй вопрос, а именно: как связаны понятия сценария и прецедента . Прецеденты, как мы уже говорили, рождаются из требований к системе. Но говорят они о том, что делает система. Как система это делает, говорят сценарии. Таким образом, прецедент можно специфицировать путем описания потока действий или событий в текстовой форме - в виде, понятном для "постороннего" (не занятого в непосредственной разработке системы) читателя. А ведь такое описание - это и есть сценарий ! Таким образом, сценарии специфицируют прецеденты . И еще. Поскольку сценарии - это, по сути, рассказы, они являются весьма эффективным средством извлечения информации из бесед с заказчиком и предоставляют превосходное, понятное непрофессионалу описание создаваемого приложения. Сценарии, да и вообще диаграммы прецедентов (дополненные сценариями) являются отличным средством общения между разработчиками и заказчиком , причем, в силу простоты нотации, - средством, понятным обеим сторонам. В конечном итоге, взаимосвязь между требованиями, прецедентами и сценариями можно изобразить такой "псевдодиаграммой" (рис. 6.8 ).
Рис. 6.8.
Как видите, для каждой ассоциации на диаграмме проставлена кратность и ее смысл вполне понятен, но все же о кратности следует поговорить отдельно. Один прецедент определяет несколько сценариев, каждый из которых представляет один из возможных вариантов определяемого прецедентом потока событий. Сценарии так же соотносятся с прецедентами, как экземпляры класса, т.е. сценарий - это экземпляр прецедента , как объект - экземпляр класса. Система может содержать, например, несколько десятков прецедентов, каждый из которых, в свою очередь , может разворачиваться в десятки сценариев. Как правило, прецедент описывает не одну последовательность действий, а множество, и выразить все детали рассматриваемого прецедента с помощью одной последовательности действий обычно не получается. Практически для любого прецедента можно выделить основной сценарий , описывающий "нормальную" последовательность действия, и вспомогательные , описывающиеальтернативные последовательности, которые инициируются в случае возникновения определенных условий.
Другой вопрос: требуется ли такое уточнение модели прецедентов, оправдано ли оно для данного уровня приближения, или "подразумевающиеся" альтернативные сценарии можно опустить? Например, в предыдущем примере с покупкой билета в сервисной кассе мы не изобразили сценарии (и, соответственно, прецеденты), соответствующие вариантам, когда билетов на выбранный пассажиром рейс уже не осталось, пассажир изменил свое решение и хочет взять билет на другой рейс, когда оплата идет наличными или по кредитной карте и т. д.
"Хватит ходить вокруг да около!" - воскликнет нетерпеливый читатель. Уже заканчиваем. Мы просто хотели мягко подвести читателя к вопросу об отношениях между прецедентами. А отношения эти весьма многообразны. Начнем со старого знакомого - отношения обобщения (наследования, генерализации). О генерализации мы уже говорили не раз, когда рассматривали диаграммы классов . Но все же напомним суть этого понятия. Как говорят классики, обобщение - это отношение специализации (обобщения), в котором объекты специализированного элемента (потомка) могут быть подставлены вместо объектов обобщенного элемента (родителя, или предка).
Точно так же, как мы обычно поступаем с классами, после того как мы выделили и описали каждый прецедент , мы должны просмотреть их все на предмет наличия одинаковых действий - поискать, а не выполняются ли (используются) некоторые действия совместно несколькими вариантами использования. Этот совместно используемый фрагмент лучше описать в отдельном прецеденте. Таким образом мы уменьшим избыточность модели за счет применения обобщения прецедентов (иногда, правда, говорят не об обобщении, а об использовании прецедентов; почему - сейчас поймете). Как это и "положено" при наследовании, экземпляры обобщенных прецедентов (потомков) сохраняют поведение, присущее обобщающему прецеденту (предку). Другими словами, наличие (использование) в варианте использования X обобщенного варианта использования Y говорит нам о том, что экземпляр прецедента X включает в себя поведение прецедента Y . Обобщения применяются, чтобы упростить понимание модели вариантов использования за счет многократного задействования "заготовок" прецедентов для создания прецедентов, необходимых заказчику (помните, как мы рассматривали вопрос о том, всегда ли необходимо создавать новый класс , или лучше воспользоваться готовым решением, чувствуете аналогию?). Такие "полные" прецеденты называются конкретными прецедентами . "Заготовки" прецедентов, созданные лишь для многократного использования в других прецедентах, называют абстрактными прецедентами. Абстрактный прецедент (как и абстрактный класс ) не существует сам по себе, но экземпляр конкретного прецедента демонстрирует поведение, описываемое абстрактными прецедентами, которые он (повторно) использует. Прецедент , который экторы наблюдают при взаимодействии с системой ("полный" прецедент , как мы называли его ранее), часто называют еще " реальным " прецедентом.
Как мы уже говорили выше, обобщение (наследование ) чаще всего используют между классами и интерфейсами. Однако другие элементы модели также могут находиться между собой в отношении наследования - например, пакеты (о которых мы тут не говорим), экторы, прецеденты...
Изображается обобщение , как, конечно, помнит внимательный читатель, линией с "незакрашенной" треугольной стрелкой на конце. Обобщение - это отношение между предком и потомком, и стрелка всегда указывает на предка. Если вспомнить, что потомки наследуют (используют) свойства предка, то вполне логично вспоминается наше утверждение о том, что стрелки в UML всегда направлены в сторону того, от кого что-то требуют, чьими сервисами пользуются (рис. 6.9 ):
Рис. 6.9.
Как мы уже говорили ранее и видели в нашем первом примере диаграммы прецедентов , обобщение может использоваться для создания различных разновидностей экторов. Экторы-потомки наследуют от предка базовые характеристики и дополняют их своей спецификой. Точно так же прецедент -потомок наследует поведение и семантику прецедента-родителя и дополняет его поведение.
Следующий вид отношений между прецедентами - включение. Отношение включения означает, что в некоторой точке базового прецедента содержится поведение другого прецедента . Включаемый прецедент не существует сам по себе, а является всего лишь частью объемлющего прецедента. Таким образом, базовый прецедент как бы заимствует поведение включаемых, раскладываясь на более простые прецеденты. Например, когда мы покупаем в магазине некоторую вещь, в момент считывания кассиром штрих-кода обновляется состояние базы данных товаров, имеющихся в наличии, - количество наличных единиц купленного товара уменьшается. То же самое действие выполняется и в том случае, если купленный товар оказался бракованным, непригодным к использованию или попросту нам не понравился: состояние упомянутой базы данных вновь обновляется - но теперь уже в сторону увеличения количества наличных единиц определенного товара. Т. е. оба этих действия - и покупка, и возврат - содержат (включают в себя) такое действие, как обновление содержимого БД .
А как же изображается включение? Да очень просто - как зависимость (пунктирная линия со стрелкой, помните?) со стереотипом
<
увеличить изображение
Рис. 6.10.
Как хорошо видно из этого примера, использование включения позволяет избежать многократного описания одного и того же набора действий - общее поведение можно просто описать в виде прецедента, включаемого в базовые.
На очереди - отношение расширения . Чтобы уяснить себе смысл расширения, представим себе, что мы говорим об оплате некоторого купленного нами товара. Мы можем оплатить товар наличными, если сумма не превышает $ 100. Или оплатить кредитной картой, если сумма находится в пределах от $ 100 до $ 1000. Если же сумма превышает $ 1000, нам придется братькредит . Таким образом мы расширили понимание операции оплаты купленного товара и на случаи, когда используются другие средства оплаты, нежели наличные. Но сами эти случаи возникают только при строго определенных условиях: когда цена товара попадает в определенные рамки.
Расширение дополняет прецедент другими прецедентами, "срабатывающими" при некоторых условиях, - просто добавляет в исходный прецедент последовательность действий, содержащуюся в другом прецеденте. Отношение расширения прецедента А к прецеденту В означает, что экземпляр прецедента В может включать в себя (при определенных условиях, которые могут быть описаны в расширении; как именно описаны, мы скажем чуть позже) поведение, описанное в прецеденте А. Пример показан на следующей диаграмме (рис. 6.11 ):
Рис. 6.11.
Однако в приведенном примере не видно, при каких именно условиях человек использует каждый конкретный способ оплаты. В то же время, при моделировании с использованием расширения можно указать как условия осуществления расширенного поведения, так и место - точку расширения прецедента, в которой подключаются действия из расширяющих прецедентов. Вспомните оператор безусловного перехода , который вы, надеемся, использовали в своих программах не слишком часто. Как только интерпретатор доходит до этого оператора, он передает управление на строку, которая помечена меткой, указанной в этом операторе. Правда, в случае расширения речь идет скорее об операторе условного перехода - когда исходный прецедент (а именно, последовательность действий, содержащаяся в нем) приходит в точку расширения, происходит оценка условий расширения. Если условия выполняются, прецедент включает в себя последовательность действий из расширяющего прецедента.
Точка расширения описывается в дополнительном разделе прецедента, отделенном от его названия горизонтальной линией - точно так же, как в отдельных разделах перечисляются атрибуты класса и его операции . Ниже показан пример описания точки расширения, позаимствованный нами из Zicom Mentor (рис. 6.12 ).
Рис. 6.12.
В этом примере регистрация пассажиров авиарейса включает в себя контроль службы безопасности, а при условии (указанном в примечании после служебного слова "Condition :"), что человек часто летает и салон переполнен (обратите внимание на операторAND , говорящий об одновременности выполнения условий), класс билета может быть повышен, например, с "эконом" до "бизнес-класса". Причем такой апгрейд может произойти только после того, как билет предъявлен на стойку регистрации - это и есть точка расширения. Она описана (ее имя указано) в дополнительном разделе прецедента после служебной фразы "Extension points:". Предваряя вопрос читателя, скажем, что прецедент может иметь сколь угодно много точек расширения. А сопоставить конкретный расширяющий прецедент с определенной точкой расширения можно, прочитав условия расширения, указанные в комментариях, - само условие записывается после служебного слова "Condition :" в фигурных скобках, за которыми идет служебная фраза "Extension point :", и после нее указывается имя точки расширения. Посмотрите еще раз на наш пример с регистрацией пассажиров в аэропорту и убедитесь сами, что все это очень просто!
Некоторое недоумение может вызвать то, что стрелка направлена всегда в сторону расширяемого прецедента. Но и это легко объяснить с точки зрения нашего тезиса, что "стрелка всегда указывает на того, от которого что-то требуют": ведь для того, чтобы прецедент был расширен, нужно, чтобы он попал в точку расширения и проверилась истинность условий - только тогда действия, содержащиеся в расширяющем прецеденте, смогут быть добавлены в последовательность действий исходного прецедента. Так что все правильно - от расширяемого прецедента требуется точка расширения и проверка условий, потому и стрелка направлена к нему.
Подытоживая все вышесказанное, можно сказать, что расширение позволяет моделировать необязательное поведение системы (был бы класс билета повышен, если бы пассажир не налетал нужного количества миль, а салон был бы почти пуст?). Сам факт расширения зависит от выполнения условий - расширения ведь может и не произойти! Это просто отдельные последовательности действий, выполняемые лишь при определенных обстоятельствах и включаемые в определенных точках сценария (обычно в результате явного взаимодействия с эктором).
Организация прецедентов с помощью выделения общего поведения (включение) и различных вариантов поведения (расширение) - важная составляющая часть процесса разработки простого, сбалансированного и понятного набора прецедентов. Можно сказать даже, что использование включения и расширения - признак хорошего стиля в моделировании прецедентов.
На этом разговор о нотации диаграмм прецедентов можно было бы и завершить. Хотелось бы только сказать еще пару слов о соотношении между понятиями прецедента и кооперации . О кооперации мы уже говорили ранее (помните диаграммы взаимодействия ?) как о множестве ролей, работающих вместе, чтобы обеспечить некоторое поведение системы. Мы также упоминали о том, что прецеденты отвечают на вопрос "что делает система?", но не говорят, как именно она это делает. На этапе анализа понимать, как именно система реализует свое поведение, действительно не нужно. Но при переходе к реализации неплохо бы знать, какие именно классы (или другие элементы модели), совместно работая, обеспечивают нужное поведение . То есть мы логично перешли от разговора о прецедентах к разговору о кооперации! Недаром обозначения кооперации и прецедента очень похожи (читатель, конечно, помнит, что кооперация обозначается пунктирным эллипсом) (рис. 6.13 ).
Рис. 6.13.
Так в каком же отношении находятся прецедент и кооперация ? Из предыдущего абзаца логично следует, что это отношение реализации. Каждый прецедент реализуется одной или несколькими кооперациями. Это, конечно, не означает, что классы жестко распределены по кооперациям: классы, принимающие участие в кооперации, реализующей определенный прецедент , будут участвовать и в других кооперациях.
Моделирование при помощи диаграмм прецедентов
Модель прецедентов, по сути, является концептуальной моделью системы. В ней, как мы уже не раз отмечали, в общих чертах описывается только поведение (функциональность) системы, а о деталях реализации речь не идет - на данном этапе реализация не важна, гораздо важнее собрать требования к системе и оформить их в наглядном виде, понятном и разработчикам, и заказчику.
Итак, подводя итоги, мы можем сформулировать три причины использования прецедентов. Или, вернее, три способа использования прецедентов (не случайно в русском переводе частенько можно встретить словосочетание "вариант использования "!) в ходе работы над системой:
· Прецеденты дают возможность аналитикам, пользователям и разработчикам говорить на одном языке : используя прецеденты, аналитики (эксперты в предметной области) могут на основе пожеланий заказчика описать поведение системы с точки зрения пользователя с такой степенью детализации, что разработчики смогут без труда сконструировать "внутренности" системы. В то же время, нотация диаграмм прецедентов настолько проста, что даже неподготовленный пользователь (заказчик) способен понять их смысл и помочь в их уточнении - ведь картинки (а тем более комиксы, каковыми, по сути, являются диаграммы UML) воспринимаются намного легче, чем текст!
· Прецеденты позволяют разработчикам понять назначение элемента : система, подсистема или даже класс могут быть сложными образованиями, состоящими из большого числа составных частей и имеющими большое число атрибутов и операций. Моделирование прецедентов позволяет лучше представить себе поведение системы, понять, какие элементы модели играют какие роли в реализации этого поведения, в какие кооперации входят, и какой именно прецедент (функционал системы) реализуют.
· Прецеденты являются основой для тестирования элемента в течение всей разработки : модель прецедентов описывает желаемое поведение системы (ее функционал) с точки зрения пользователя. Так что, постоянно сопоставляя предоставляемый элементом (фактический) функционал с имеющимися прецедентами, можно надежно контролировать корректность реализации элемента. Вот вам и надежный источник регрессионных тестов. Кроме этого, появление нового прецедента зачастую заставляет пересмотреть реализацию элемента, дабы убедиться, что она обладает достаточной гибкостью, изменяемостью и масштабируемостью.
Прецеденты полезны и для прямого, и для обратного проектирования. При прямом проектировании мы, по сути, осуществляем "перевод" с UML на некий язык программирования . И тестировать созданное приложение следует, основываясь именно на потоках событий, описываемых прецедентами. Обратное проектирование предполагает перевод с языка программирования на язык UML -диаграмм. Такими вещами приходится заниматься в силу ряда причин:
· С целью поиска ошибок и чтобы убедиться в адекватности дизайна :
отличная идея после первого перевода с UML на язык программирования сделать обратный перевод и сравнить исходные и восстановленные UML-модели (желательно, чтобы эти переводы выполнялись разными командами). Это позволит убедиться в том, что дизайн системы соответствует модели, никакая информация в ходе перевода не была утеряна, да и попросту выловить некоторые "баги". Такой подход называется обратной семантической трассировкой (или RST - Reverse SemanticTraceability ) и разрабатывается компанией INTSPEI (http://www.intspei.com ) как одна из базовых техник методологии INTSPEI P-Modeling Framework, краткие сведения о которой вы можете найти в приложении к этому курсу.
· Когда отсутствует документация : иногда стоит задача модификации существующей системы, код которой плохо документирован. В таком случае перевод с языка программирования на язык UML-диаграмм - отличный способ понять назначение системы и ее частей, функционал, предоставляемый ею, и т. д.
И наконец, следует отметить, что, конечно, только диаграмм прецедентов, как и сценариев, ими определяемых, недостаточно, чтобы создать модель поведения системы. Как мы уже не раз упоминали, прецеденты говорят, что делает система, но не говорят, как. Об этом говорят сценарии, но в текстовой форме, что делает их довольно сложными для восприятия. На помощь приходят диаграммы взаимодействий, которые визуализируют сценарии . Таким образом, мы теперь можем дополнить нашу старую "псевдодиаграмму" и на этом успокоиться (рис. 6.14 ):
Рис. 6.14.
В заключение приведем пару примеров законченных диаграмм прецедентов. Первый пример (смысл которого понятен и без дополнительных пояснений) демонстрирует включение, расширение и наследование прецедентов. Обратите внимание на стрелки, которые направлены к экторам, изображающим шлюзы. Все правильно - ведь система пользуется их услугами при отправке сообщений, в то время как маркетолог, наоборот, пользуется услугами системы, и потому стрелки направлены от него (рис. 6.15
Рис. 6.16.
Вторая диаграмма , тоже неплохо оформленная, говорит нам о том, что утки очень не любят платить за пиво, предпочитая пить в долг (рис. 6.17 ).
Рис. 6.17.
Кстати, обратите внимание на рамки диаграммы, показанные на этом примере, - прямоугольник , отделяющий область содержимого диаграммы и имеющий в верхней части специальный раздел для ее имени.
И наконец, третья картинка, которая не является хорошим примером диаграммы прецедентов , но просто забавна. Это рассказ о способах поведения, позволяющих гарантированно (!) провалить любой экзамен (рис. 6.18 ):
Рис. 6.18.
Выводы
· Модель прецедентов позволяет описать систему на концептуальном уровне.
· Диаграммы прецедентов - отличное средство коммуникаций между экспертами, пользователями и разработчиками, а также основа для тестирования создаваемой системы.
· Прецедент - это описание набора последовательных событий (включая возможные варианты), выполняемых системой, которые приводят к наблюдаемому эктором результату.
· Эктор - это набор ролей, которые исполняет пользователь в ходе взаимодействия с некоторой сущностью.
· Прецеденты (как и экторы) могут быть генерализованы, т. е. наследовать и дополнять свойства своих предков.
· Прецеденты также могут вступать между собой в отношения включения и расширения, что позволяет разложить прецеденты на более простые составляющие и выделить необязательное поведение.
· Каждый прецедент реализуется одной или несколькими кооперациями.
· Сценарии специфицируют прецеденты, а диаграммы взаимодействий визуализируют сценарии.
Контрольные вопросы
· Что такое нефункциональные требования? Как они отображаются на диаграммах прецедентов?
· Какие способы изображения экторов вы знаете?
· В какие отношения могут вступать экторы между собой?
· В чем состоит смысл отношений включения и расширения?
· Что такое точка расширения?
· Перечислите известные вам причины использования прецедентов.
· Как прецеденты применяют в прямом и обратном проектировании?
Следующие заметки будут полезны начинающим бизнес аналитикам, системным аналитикам, а также студентам.
Что такое Use Case
На собеседовании порой можно услышать следующее определение «Это такая UML-диаграмма с человечками и овалами». Давайте разберемся, что это такое, и рассмотрим несколько простых примеров.
Use Case описывает сценарий взаимодействия участников (как правило - пользователя и системы). Участников может быть 2 и больше. Пользователем может выступать как человек, так и другая система.
Мне нравится определение из книги Коберна (советую, ее, кстати, всем аналитикам): «Вариант использования фиксирует соглашение между участниками системы о ее поведении. Вариант использования описывает поведение системы при ее ответах на запрос одного из участников, называемого основным действующим лицом, в различных условиях».
В жизни встречала такие названия: варианты использования, юзкейс, сценарий, прецедент, сценарий использования.
Текст vs диаграмма/схема
Какое описание лучше: текстовое или диаграмма? Выбор за вами и вашей командой. В первые годы работы я использовала диаграммы либо диаграммы + текстовое описание к ним. Сейчас я предпочитаю текстовое описание сценариев, и объясню почему:
- Такой формат более понятен заказчикам (а они тоже предпочитают читать и согласовывать варианты использования).
- Текст проще и быстрее отредактировать, чем диаграммы и текст.
Конечно, если в вашем проекте очевидны дополнительные преимущества от использования диаграмм - надо их использовать.
Кому и в каких случаях нужны сценарии
- Разработчикам. Очень удобно, когда ветвистое требование описано при помощи основного и альтернативного потока событий. Все четко и понятно: кто, когда и что вызывает, и что получается в результате. В моем последнем проекте менеджер исповедовал подход: минимум описаний, максимум общения. Но для нескольких сложных сценариев разработчики сами просили сделать подробное описание, и юзкейсы отлично подошли.
- Заказчикам. Описано человеческим языком, заказчик своевременно может подтвердить, что это именно то, чего он ждет, или поправить.
- Тестировщику. Почти готовый тест-кейс:-)
- Всей проектной команде. Если сценарий нужно согласовать, а на каждом совещании пара-тройка альтернативных вариантов сценария звучит иначе, поможет строго описанный поток событий.
А также другим участникам процесса.
В каких случаях они нужны:
Если вам нужна качественная, полная спецификация требований - юзкейсы прекрасно в этом помогут. Есть такие системы, для разработки и поддержки которых спецификация требований, содержащая модель данных, описание интерфейса, интеграции с другими системами и юзкейсы - очень хороший вариант.
Для поддержки системы. Чтоб выявить ошибку, разобраться, на каком шаге что пошло не так.
Если вам нужно описать какую-то часть функциональности, работы пользователя с интерфейсом, etc. в виде сценария. Тогда вы можете взять шаблон юзкейса за основу и использовать его для описания сценария. Например, основу требований к вашему мобильному приложению составляет описание пользовательского интерфейса. Но выполнение некоторых функций имеет много нюансов, которые нужно дополнительно описать при помощи таблички: «действие - отклик системы», или даже совместить такую табличку со сценарием.
Как их описывать
Давайте рассмотрим пару примеров, они говорят сами за себя.
Пример 1. Разблокировать учетную запись пользователя (простой короткий пример, без альтернативного потока событий):
Действующие лица | Пользователь, Система |
Цели | Пользователь: авторизоваться в системе и начать работать; Система: идентифицировать пользователя и его права. |
Успешный сценарий:
|
|
Результат | Пользователь успешно авторизирован и может работать с системой. |
Расширения: | |
*а | Нет доступа к БД. Система выдает сообщение (ссылка на сообщение ). Результат: пользователь не может войти. |
1а | В настройках безопасности для данного IP адреса существует запрет на вход в систему. Результат: форма логина не предоставляется, система выдает сообщение пользователю (ссылка на сообщение ). |
2а | Пользователь выбирает: «Напомнить пароль». Вызывается сценарий «Напомнить пароль». |
3а | Пользователь с введенными логином и паролем не найден. Результат: отказ в авторизации. Система выдает сообщение (ссылка на сообщение ). Переход на шаг 2. |
3б | Количество неудачных попыток авторизоваться достигло максимального, установленного в настройках. Результат: пользователь не может войти. Выдается сообщение: (ссылка на сообщение ). Вход с IP адреса Пользователя заблокирован на время, установленное в настройках. |
Важные моменты
Очевидно, что если Пример 1 можно было безболезненно описать простым текстом, то Пример 2 намного лучше воспринимается в виде сценария. Но если у вас вся функциональность описана в виде юзкейсов, то лучше описывать юзкейсами даже очень простые сценарии, из пары шагов. Пусть ваша спецификация будет в едином стиле.
Используйте минимальное количество слов и пунктов, необходимых для однозначного понимания сценария. Если юзкейс получается слишком длинный, возможно, лучше будет разбить его на несколько. С очень длинными сценариями, с большим количеством расширений, работать крайне неудобно.
Если в двух и более сценариях повторяется одинаковый набор шагов, есть смысл вынести эти шаги в отдельный сценарий, и ссылаться на них. Документ будет легче. А если что-то в этих шагах поменяется, то достаточно будет изменить в одном месте.
Список сообщений, которые система выдает пользователю, стандартные тексты электронных писем и т.п. удобно расположить в едином месте в документе, и ссылаться на нужный пункт из разных юзкейсов, т.к. сообщения в сценариях часто дублируются.
Перечитайте документ со сценариями, перед тем, как отдавать его разработчикам или заказчикам. Лучше даже несколько раз. Всегда находятся моменты, которые можно описать лаконичнее, или выявляются какие-то несоответствия. Или случайные «копипасты». Уважайте время и головы других людей.
Кстати, про «копипасты». Незаполненную табличку для описания юзкейса есть смысл «копипастить».
Как видно из примеров выше, расширение к шагу номер 1 указывается в разделе «Расширение» как 1а, 1б, и т.д. Расширение *а - это общее расширение к сценарию, не к конкретному.
Правильных и полезных вам сценариев! Вопросы, примеры, предложения, комментарии приветствуются. Спасибо за внимание.
При написании статьи я использовала материалы из книги Алистера Коберна «Современные методы описания функциональных требований к системам».