CRC-карточки - повседневность проекта
17 Mar 2016Одним из методов мозгового штурма при анализе и проектировании задач с использованием ООП являются CRC карточки – это способ для определения классов и их взаимодействия.
Введение
CRC-карта (англ. Class-responsibility-collaboration card; рус. карта «Класс-Ответственность-Кооперация») - метод мозгового штурма, предназначенный для проектирования объектно-ориентированного программного обеспечения. CRC-карты были предложены Уордом Каннингемом и Кентом Беком. Как правило, CRC-карты используются в тех случаях, когда сначала в процессе проектирования ПО определяются классы и способы их взаимодействий. wikipedia.
Основным предназначением CRC карточек является концентрирование разработчиков на главных абстракциях задачи и предотвращение от зарывания в подробности и детали второго плана. Неверный уровень абстракции может стать серьезной проблемой для движения проекта, проект может двигаться не в том направлении или делать вид, что движется.
История создания
Создатели карт не могли представить разработчиков, как начинающих, так и опытных, способных представить объектно-ориентированное проектирование антропоморфным, как нечто живое и наделенное человеческими качествами. Введя CRC карты, которые характеризуют объекты по имени класса, обязанностям и взаимодействию, они получили способ дать учащимся представить концепции объектов.
Самой сложной проблемой в области преподавания объектно-ориентированного программирования оказался отказ обучаемого от общего знания управления с процедурными программами, чтобы полагаться на знания местных объектов для выполнения своих задач. Новички завалены регрессией к глобальному мышлению: беспричинными глобальными переменными, ненужными указателями и неподходящими зависимостями реализации объектов.
Данный подход оказался успешным в обучении начинающих программистов, а также при внедрении опытных программистов в сложные существующие проекты.
Поскольку изучение объектов требует определенного сдвига в общем подходе, обучение сводится к проектированию объектов. Создатели сфокусировались на дизайне, который обучает основным понятиям новичка или тонкостям сложной конструкции для опытных программистов.
Вместо попытки сделать дизайн объекта процедурным, насколько это возможно, было обнаружено, что наиболее эффективно преподавание способом идиоматического мышления с объектами, т.е. погружение ученика в предметность материала. Для этого необходимо удалить как можно больше знакомого материала, насколько это возможно, ожидая, что детали, такие как синтаксис и среда разработки будут подобраны достаточно быстро, как только основы будут тщательно изучены.
Использование CRC-карточек
CRC-карты используются для представления: Объектов, их ответственности и взаимодействия с другими объектами. Они создаются в процессе исследования сценария работы программы, основанной на моделировании поведения системы в целом.
Почему хорошо использовать CRC-карты: Они материальны их действительно можно потрогать, учитывая предложенный размер карточек создателями, их смело можно назвать портативными; можно пользоваться в любом месте, а также не требуется какого-либо оборудования - лишь карандаш и бумага. Карты позволяют разработчикам прочувствовать и видеть какие объекты живут в разных сценариях проекта. Об этом детально речь пойдет в “игре”.
CRC-карты в проектировании.
Задачи проектирования:
- Собрать необходимые данные для работы с User Story.
- Определить классы
- Определить ответственности
- Когда они взаимодействуют друг с другом
Карточка представляет собой три области: первая находится вверху, где пишется название объекта, две другие области равно разделяют карту в два столбца. Левый столбец заполняем сведениями, за что отвечает объект, правый - с кем взаимодействует.
Объект (Object) - сущность, которая что-то может делать, а также имеет некоторые состояния.
Важный момент в CRC-методике - это определить ответственность объекта. Ответственность (responsibility) – краткое описание того, что объект должен делать: операция, которую выполняет объект; некоторый объем знаний, который объект поддерживает или какие-либо важные решения, принимаемые объектом. Идея состоит в том, чтобы вы могли взять любой класс и сформулировать его разумно ограниченные обязанности. Такой образ действия поможет вам яснее представить себе архитектуру классов.
Часто существительные из сценариев взаимодействия выделяют в качестве названия объекта, а глаголы в ответственность.
Взаимодействие (Collaboration) - процесс, в котором несколько классов объединяются, чтобы обеспечить поведение более высокого уровня. Карточки можно раскладывать так, чтобы представить сотрудничество объектов. Это даст вам некоторое представление о связях между объектами.
С точки зрения динамики моделируемой задачи, расположение карточек показывает поток сообщений между объектами, а с точки зрения статики они представляют иерархии классов.
Перед игрой
Чтобы начать, используйте листы бумаги размера: B7 или A6, можно даже разноцветные для большей наглядности. Либо поделите на четыре части лист А4 и вы получите A6.
|---------------------------------------|
| Название |
|---------------------------------------|
| | |
| Ответственность | Взаимодействие |
| | |
|---------------------------------------|
Вы и ваши коллеги должны собраться за столом. Первым шагом в объектно-ориентированном проектировании является выделение классов в предметной области. Изучаем User Story или ТЗ и ищем существительные, так как именно существительные идентифицируют будущие классы, а затем записываем имя класса вверху наших карточек.
Далее User Story разделяется на отдельные сценарии. Прочитывая сценарий, поднимаем над столом карточку названного объекта. Пока разбирается сценарий, все участники определяют ответственность, новые классы и взаимодействия друг с другом; полученные данные записываются на карточке. И так продолжается со всеми сценариями из User Story.
Определяя ответственность, ищем глаголы в User Cases. Часть ответственности очевидна, но остальную ответственность определяем когда “играем” со сценариями. Не стоит сразу находить все ответственности до начало игры. Для начала достаточно нескольких.
В процессе игры становится ясным, что требуется супер-класс, подкласс, создаем карточки и добавляем их в нашу “колоду” карт. Атрибуты классов - это прилагательные из сценария, поиск атрибутов не является задачей CRC “игры” - это детали имплементации, но если нашли, следует записать на обратной стороне карточки.
Обнаружить взаимодействие объектов, с которыми работает рассматриваемый объект, достаточно просто. Когда подняты две и более карточки, ищем связь между этими классами и записываем. Крепкая связью - это когда карточки подняты вместе на одном шаге сценария.
Играем
Возьмите сценарии и поднимайте над столом те карточки, о которых идет речь в тексте, в процессе дописывайте недостающие данные.
Карточки способствуют живому обсуждению проектов разработчиками. Если требуется просмотреть разные варианты взаимодействий, рисование на доске, где каждый вариант необходимо нарисовать/стирать, может быть очень утомительным. А с помощью CRC-карточек можно моделировать взаимодействие, поднимая карточки и передавая их по кругу. Это позволяет быстро просчитать различные варианты.
В процессе “игры” вы создаете представление об ответственностях и записываете их на карточки. Размышления об ответственности важны, поскольку рассеивают представление о классах как о бессловесных хранителях данных и помогают членам команды лучше понять поведение каждого класса на высшем уровне. Ответственность может соответствовать операции, атрибуту или, что более точно, неограниченной группе атрибутов и операций.
Одной из распространенных ошибок разработчиков является создание длинных списков низкоуровневых ответственностей. Это уводит от сути. Ответственности должны свободно помещаться на одной карточке. Иначе спросите, следует ли разделить класс или лучше отрегулировать ответственности, переместив их на более высокий уровень операторов.
Для проверки достаточности или избыточности придуманных объектов, а также корректности их взаимодействия, строится диаграмма взаимодействия.
CRC-карты в рефакторинге
Требуется на основе кода собрать сценарии. Далее проводим подготовительную часть перед игрой. Затем эмулируем каждое поведение программы при помощи карточек и просчитываем варианты, лучшее фиксируем в диаграммах взаимодействия. И уделите особое внимание ответственности объектов.
Итого
Итого, чтобы провести инсценировку работы системы, следует раздать карточки с объектами участникам проекта. Затем провести игру по сценариям. Следуя сценарию, объект А совершает какое-то действие. Исходя из своих карточек, участник сообщает об ответной реакции другого объекта B. Если в какой-то момент реакции не последует, то это признак несовершенства проекта. Такая игра может подсказать и об избыточности проекта. Желаю вам отлично проводить время за “игрой”.
Литература
“A Laboratory For Teaching Object-Oriented Thinking” - Kent Beck, Apple Computer, Inc. Ward Cunningham, Wyatt Software Services, Inc. From the OOPSLA’89 Conference Proceedings October 1-6, 1989, New Orleans, Louisiana And the special issue of SIGPLAN Notices Volume 24, Number 10, October 1989.
Applyng UML and Patterns SE, Craig Larman, 2004.
CRC-карточки, Моргун Иван profit.me, 12-06-2008.
CRC cards, Alexander Nemanov, Minsk PHP User Group Meetup #8