«Лучший способ изучить объектно-ориентированное проектирование — не заучивать шаблоны, а играть роли.»
В этой статье мы пройдёмся попошаговому введению в карточки CRC (класс — ответственность — сотрудничество), используя реальный пример для начинающих: системабиблиотечной системы выдачи книг. Независимо от того, начинаете ли вы путь в проектировании программного обеспечения или руководите рабочей группой, карточки CRC предлагают простой, мощный и совместный способ моделирования объектно-ориентированных систем.
🎯 Что такое карточки CRC?
Карточки CRC — это лёгкая, физическая (или цифровая) методика моделирования, используемая при объектно-ориентированном проектировании. Каждая карточка представляеткласси содержит три ключевых элемента:
| Поле | Описание |
|---|---|
| Класс | Название класса (например,Книга) |
| Ответственности | Что классзнаетилиделает |
| Сотрудники | Другие классы, с которыми этот класс должен взаимодействовать |
Они особенно эффективны примозговом штурме, проектировании, ипроверкаструктуры классов на ранних этапах разработки — до написания первой строки кода.
📚 Кейс-стади: система выдачи книг в библиотеке
Представим небольшую публичную библиотеку, где члены могут:
-
Искать книги по названию
-
Брать доступные книги (до определенного предела)
-
Возвращать книги после использования
Система должна отслеживать:
-
Какие книги взяты в аренду
-
Кем
-
Когда они должны быть возвращены
Мы будем использовать методметод карточек CRCдля выявления и уточнения классов в этой системе — пошагово.
✅ Шаг 1: Поиск кандидатов на классы (мозговой штурм существительных)
Начните с прочтения сценария и выделениясуществительных— это потенциальные классы.
Из описания мы определяем:
-
Библиотека
-
Член (или посетитель)
-
Книга
-
Аренда (или выдача)
-
Дата возврата (возможно, слишком мелкая)
-
Библиотечная карта (может быть частью Члена)
Мы фильтруем и оставляем только наиболее значимые:
✅ Член, Книга, Займ
⚠️ Примечание: Не переживайте, если сначала не получится правильно определить все классы — именно это и является преимуществом карточек CRC. Вы обнаружите недостающие классы, участвуя в ролевых играх!
✏️ Шаг 2: Создание начальных карточек CRC
Теперь мы назначаемответственностиисотрудникикаждому классу.
📘 Класс: Книга
| Ответственности | Сотрудники |
|---|---|
| Знать название | — |
| Знать автора | — |
| Знать ISBN | — |
| Знать, доступна ли она в данный момент | Займ |
| Быть взятым в долг | Займ |
| Быть возвращённым | Займ |
💬 Книга не «знает», кто её взял — она знает только, есть ли у неё активный займ.
👤 Класс: Член
| Ответственность | Сотрудники |
|---|---|
| Знать имя | — |
| Знать идентификатор члена | — |
| Знать, сколько книг в настоящее время взято в аренду | Аренда |
| Взять книгу (если разрешено) | Книга, аренда |
| Вернуть книгу | Книга, аренда |
| Проверить, достигнут ли лимит аренды | Аренда |
💬 Член управляет собственным поведением аренды и проверяет лимиты через класс аренды.
📅 Класс: Аренда
| Ответственность | Сотрудники |
|---|---|
| Записать, какая книга была взята в аренду | Книга |
| Записать, какой член взял ее в аренду | Член |
| Записать дату аренды | — |
| Рассчитать дату возврата | — |
| Знать, просрочена ли она | — |
| Отметить как возвращённое | Книга |
💬 Класс Loan хранит связь между участником и книгой, включая детали времени.
🎭 Шаг 3: Ролевая игра сценария — «Взять книгу напрокат»
Теперь самое интересное: ролевая игра сценарий, будто карты — это реальные предметы.
📖 Сценарий: Куртис хочет взять напрокат «Чистый код», которая доступна.
Давайте пройдёмся по этому пошагово:
-
Участник (Куртис) говорит: «Я хочу взять напрокат «Чистый код»».
→ Первое проверяет: «У меня меньше трёх книг уже?»
→ Спрашивает Займ: «Сколько у меня активных займов?» -
Займ отвечает: «У вас один активный займ → вы можете взять напрокат.»
-
Участник ищет книгу: «Где «Чистый код»?»
→ Спрашивает Книга: «Вы доступны?» -
Книга проверяет: «У меня есть активный (не возвращённый) займ?»
→ Спрашивает Заем: «Есть ли у меня активный займ?» -
Заем отвечает: «Нет — вы доступны!»
-
Член создаёт новый Заем объект:
-
Ссылается на этот Книга и Член
-
Устанавливает дату получения = сегодня
-
Рассчитывает дату возврата = сегодня + 14 дней
-
-
Книга обновлена: «Теперь у меня активный займ → я больше недоступен.»
✅ Результат: Процесс получения книги кажется естественным, распределённым и логичным.
🔄 Шаг 4: Другая сценария — «Вернуть книгу»
📖 Сценарий: Кертис возвращает «Чистый код»
-
Член (Кертис) говорит:«Я хочу вернуть «Чистый код»».
-
Член находит соответствующийЗайм (скорее всего, выполняя запрос)Займ с книгой и членом).
-
Займ отмечает себя каквозвращённый.
-
Займ говоритКнига: «Теперь вы снова доступны.»
✅ Чистый, ясный и цельный — ни один класс не выполняет работу за пределами своей ответственности.
🔍 Шаг 5: Уточнить и добавить отсутствующие классы
После ролевой игры мы замечаем, чтопробел:
❓ Кто находит книгу по названию?
В настоящее времяЧлен спрашиваетКнига напрямую — но Книга не знает, как искать!
Нам нужен центральный координатор.
➕ Новый класс: Библиотека
| Ответственность | Сотрудники |
|---|---|
| Добавить новую книгу в коллекцию | Книга |
| Найти книгу по названию | Книга |
| Зарегистрировать нового члена | Член |
| Обработать запрос на выдачу книги | Член, Книга, Заем |
| Обработать возврат книги | Член, Книга, Заем |
| Знать все текущие займы | Заем |
💬 Библиотека выступает в качестве центрального узла — она знает все книги, всех членов и все займы.
✨ Обновленный процесс: «Взять книгу» с библиотекой
-
Член → Библиотека: «Найти книгу с названием «Чистый код»».
-
Библиотека ищет в своей коллекции и возвращает Книга (или
nullесли не найдена). -
Член теперь знает, что книга существует → спрашивает Библиотека: «Могу ли я взять эту книгу?»
-
Библиотека проверяет:
-
Доступна ли книга? (через
Book.isAvailable()) -
Находится ли член в пределах лимита выдачи? (через
Loan.countActiveLoans(member))
-
-
Если да → Библиотека создает новую Ссуду и обновляет как Книга так и Ссуду.
-
Книга становится недоступным; Заем отслеживает связь.
✅ Теперь поток имеет смысл — это Библиотека обслуживает обнаружение и координацию.
🧩 Итоговое резюме карточек CRC (упрощённо для новичков)
| Класс | Ключевые обязанности | Ключевые соучастники |
|---|---|---|
| Библиотека | Управляет книгами, членами, займами; обрабатывает выдачу/возврат | Книга, Член, Заем |
| Член | Знает личную информацию; инициирует выдачу/возврат | Библиотека, Заем |
| Книга | Хранит метаданные; отслеживает доступность | Библиотека, Заем |
| Заем | Отслеживает историю выдачи; рассчитывает даты возврата; управляет статусом возврата | Член, Книга, Библиотека |
✅ Принцип проектирования: Каждый класс имеет одну чёткую цель, и обязанности являются согласованными и хорошо распределёнными.
🌟 Почему карточки CRC работают так хорошо (ключевые моменты для новичков)
| Выгода | Объяснение |
|---|---|
| Проектирование, ориентированное на ответственность | Заставляет думать: «Что это класс знает или делает?» а не просто хранения данных. |
| Естественное обнаружение отсутствующих классов | Ролевая игра выявляет пробелы (например, отсутствующий Библиотека) — никаких догадок не требуется. |
| Мгновенная обратная связь через ролевую игру | Если поток кажется неудобным, вы понимаете, что ответственность находится не на своем месте. |
| Минимальные формальности и совместная работа | Нет сложных инструментов — только карточки, стикеры или доска. Отлично подходит для команд. |
| Связывает требования с кодом | Преобразует пользовательские истории в реальные взаимодействия классов. |
🛠️ Быстрые советы для вашей первой сессии CRC
-
Используйте физические карточки (карточки 3×5 или стикеры) — это более увлекательно.
-
Один класс на карточку — оставайтесь простыми.
-
Пишите крупно и разборчиво — другие должны легко его читать.
-
Играйте вслух — передавайте карточки, как настоящие предметы.
-
Начните с 3–6 основных сценариев (например, взять в долг, вернуть, поиск).
-
Не стремитесь к совершенству — цель состоит в том, чтобыитерация, а не окончательный дизайн. Уточняйте по мере продвижения.
-
Используйте простые, специфичные для предметной области имена — избегайте технической терминологии. Используйте «Член», а не «Посетитель», если ваша команда согласна.
-
Пригласите всех принять участие — даже непрограммисты могут помочь выявить отсутствующие обязанности.
-
Позже нарисуйте простую диаграмму классов — чтобы визуализировать отношения и подтвердить согласованность.
-
Держите процесс веселым — относитесь к этому как к игре. Чем больше вовлечена ваша команда, тем лучше результаты.
🔄 Попробуйте сами: следующие области для изучения
Как только вы освоите систему библиотеки, попробуйте применить карточки CRC к другим областям, подходящим для новичков:
☕ Система заказов в кофейне
-
Классы:
Покупатель,Заказ,Пункт меню,Бариста,Касса -
Сценарии: Сделать заказ → Добавить напиток → Применить скидку → Оплатить → Распечатать чек
🪙 Автомат с напитками
-
Классы:
Автомат с напитками,Товар,Монета,Выдача,Калькулятор сдачи -
Сценарии: Вставить монету → Выбрать товар → Выдать продукт → Вернуть сдачу
🎮 Игра в викторину
-
Классы:
Викторина,Вопрос,Игрок,Трекер очков,Сессия игры -
Сценарии: Начать викторину → Ответить на вопрос → Проверить правильность → Показать итоговый результат
🚗 Парковочный гараж
-
Классы:
Гараж,Машина,Место для парковки,Билет,Ворота -
Сценарии: Въезд в гараж → Парковка автомобиля → Выезд → Оплата платы → Получение билета
Каждая из этих систем основана на одних и тех же принципах:
-
Определите существительные → распределите обязанности → сыграйте роли → улучшите → повторите.
📌 Заключительные мысли: карточки CRC — это больше, чем методика — это настрой
Настоящая сила карточек CRC заключается не в самих карточках — а в том, что они вызываютразговорони вызывают.
Когда вы пишете карточку и говорите:«Кто это делает?»или«С кем ему нужно поговорить?», вы уже думаете, как объектно-ориентированный дизайнер.
🔥 Профессиональный совет: Используйте карточки CRC на планировании спринта, при технических исследованиях или даже на собеседованиях, чтобы продемонстрировать своё мышление в области проектирования.
Они не только для разработчиков — они длякаждогокого угодно, участвующего в создании программного обеспечения: менеджеров продуктов, дизайнеров, тестировщиков и студентов.
📎 Хотите больше?
👉 Скачайте шаблон карточек CRC для распечатки (PDF или цифровой) для использования на вашей следующей встрече.
👉 Попробуйте живую сессию карточек CRCс коллегой — распределите роли: «Ты — член», «Ты — книга» и т.д.
👉 Поделитесь своими результатами — опубликуйте свои карточки в социальных сетях с хэштегами #CRCcards или #OODesignJourney.
🏁 Заключение
ТеСистема выдачи библиотечных книгявляется одним из самых классических и эффективных примеров карточек CRC — не потому что он сложный, а потому что онпростой, понятный и проницательный.
Следуя всего лишьпяти шагам— мозговой штурм, создание карточек, ролевая игра, уточнение и итерации — вы можете:
-
Нaturally обнаруживать классы
-
Четко распределять ответственность
-
Выявлять недостатки в проектировании на ранней стадии
-
Формировать общую умственную модель как команда
И самое главное? Вам не нужно быть старшим разработчиком, чтобы это сделать.
Вам нужно лишь любопытство, несколько карточек и готовность поиграть.
✅ Теперь ваша очередь: Возьмите несколько стикеров, выберите простую систему (например, кофейню или автомат с напитками) и попробуйте метод CRC.
📌 Помните: Хороший дизайн — это не написание идеального кода — это задавание правильных вопросов.
А с карточками CRC вы уже задаете их.
📌 Дополнительно: Шаблон карточек CRC для печати (текстовая версия)
┌────────────────────┐
│ [ИМЯ КЛАССА] │
├────────────────────┤
│ Ответственность: │
│ - │
│ - │
│ - │
├────────────────────┤
│ Соисполнители: │
│ - │
│ - │
└────────────────────┘
Напечатайте это на карточках 3×5 или используйте в цифровом инструменте, таком как Miro, Figma или Google Slides.
📚 Следующий шаг?
Хотите подробный разбор системыСистемы заказов в кофейнес использованием того же стиля CRC?
👉 Просто скажите слово — я отправлю вам следующий кейс, пошагово, с карточками, сценариями и ролевой игрой!
Удачного проектирования! 🎮🧩💻
- Как создать карточки CRC в Visual Paradigm: Пошаговое руководство, в котором содержатся инструкции по созданию карточек CRC с использованием специализированных инструментов диаграммирования программного обеспечения.
- Понимание диаграмм карточек CRC в Visual Paradigm: Обзор, в котором объясняется, как используются эти диаграммы для моделирования объектно-ориентированных систем и их взаимодействий.
- Как создать диаграмму карточек CRC в Visual Paradigm: Подробное руководство, доступное в сообществе Community Circle, охватывающее создание и настройку диаграмм CRC.
- Введение в диаграммы CRC в Visual Paradigm: Комплексное руководство, посвященное использованию диаграмм CRC для объектно-ориентированного проектирования и более широкого моделирования систем.
- Генерация карточек CRC из диаграмм классов: Обсуждение в сообществе, в котором рассматриваются методы использования существующих диаграмм классов для автоматической генерации карточек с помощью обратного инжиниринга.
- Синхронизация карточек CRC с диаграммами классов: Технический ресурс, посвященный двунаправленному моделированию, чтобы обеспечить согласованность проектирования между карточками и моделями классов.
- Введение в диаграммы карточек CRC (руководство в формате PDF): Скачиваемый технический ресурс, в котором объясняются основные концепции и применение карточек CRC в анализе систем.
- Установление связей между карточками CRC и диаграммами классов: В этой статье рассматриваются методы обеспечения отслеживаемости и связности между различными уровнями моделирования.
- Шаблон карточек CRC в библиотеке Visual Paradigm: Ресурс, в котором представлен скачиваемый шаблон, предназначенный для поддержки проектирования на ранних этапах объектно-ориентированного проектирования.
- Перемещение карточек CRC между диаграммами: Руководство, в котором подробно описано, как переносить карточки между различными диаграммами, сохраняя согласованность данных.
Эта статья также доступна на Deutsch, English, Español, فارسی, Français, English, Bahasa Indonesia, 日本語, Polski, Portuguese, Việt Nam, 简体中文 and 繁體中文













