de_DEen_USes_ESfa_IRfr_FRhi_INid_IDjapl_PLpt_PTru_RUvizh_CNzh_TW

Освоение объектно-ориентированного проектирования с помощью карточек CRC: пример для начинающих

Table of Contents hide

«Лучший способ изучить объектно-ориентированное проектирование — не заучивать шаблоны, а играть роли.»

В этой статье мы пройдёмся попошаговому введению в карточки CRC (класс — ответственность — сотрудничество), используя реальный пример для начинающих: системабиблиотечной системы выдачи книг. Независимо от того, начинаете ли вы путь в проектировании программного обеспечения или руководите рабочей группой, карточки CRC предлагают простой, мощный и совместный способ моделирования объектно-ориентированных систем.


🎯 Что такое карточки CRC?

Карточки CRC — это лёгкая, физическая (или цифровая) методика моделирования, используемая при объектно-ориентированном проектировании. Каждая карточка представляеткласси содержит три ключевых элемента:

Поле Описание
Класс Название класса (например,Книга)
Ответственности Что классзнаетилиделает
Сотрудники Другие классы, с которыми этот класс должен взаимодействовать

Они особенно эффективны примозговом штурмепроектировании, ипроверкаструктуры классов на ранних этапах разработки — до написания первой строки кода.


📚 Кейс-стади: система выдачи книг в библиотеке

Представим небольшую публичную библиотеку, где члены могут:

  • Искать книги по названию

  • Брать доступные книги (до определенного предела)

  • Возвращать книги после использования

Система должна отслеживать:

  • Какие книги взяты в аренду

  • Кем

  • Когда они должны быть возвращены

Мы будем использовать методметод карточек CRCдля выявления и уточнения классов в этой системе — пошагово.


✅ Шаг 1: Поиск кандидатов на классы (мозговой штурм существительных)

Начните с прочтения сценария и выделениясуществительных— это потенциальные классы.

Из описания мы определяем:

  • Библиотека

  • Член (или посетитель)

  • Книга

  • Аренда (или выдача)

  • Дата возврата (возможно, слишком мелкая)

  • Библиотечная карта (может быть частью Члена)

Мы фильтруем и оставляем только наиболее значимые:

✅ ЧленКнигаЗайм

⚠️ Примечание: Не переживайте, если сначала не получится правильно определить все классы — именно это и является преимуществом карточек CRC. Вы обнаружите недостающие классы, участвуя в ролевых играх!


✏️ Шаг 2: Создание начальных карточек CRC

Теперь мы назначаемответственностиисотрудникикаждому классу.

📘 Класс: Книга

Ответственности Сотрудники
Знать название
Знать автора
Знать ISBN
Знать, доступна ли она в данный момент Займ
Быть взятым в долг Займ
Быть возвращённым Займ

💬 Книга не «знает», кто её взял — она знает только, есть ли у неё активный займ.


👤 Класс: Член

Ответственность Сотрудники
Знать имя
Знать идентификатор члена
Знать, сколько книг в настоящее время взято в аренду Аренда
Взять книгу (если разрешено) Книга, аренда
Вернуть книгу Книга, аренда
Проверить, достигнут ли лимит аренды Аренда

💬 Член управляет собственным поведением аренды и проверяет лимиты через класс аренды.


📅 Класс: Аренда

Ответственность Сотрудники
Записать, какая книга была взята в аренду Книга
Записать, какой член взял ее в аренду Член
Записать дату аренды
Рассчитать дату возврата
Знать, просрочена ли она
Отметить как возвращённое Книга

💬 Класс Loan хранит связь между участником и книгой, включая детали времени.


🎭 Шаг 3: Ролевая игра сценария — «Взять книгу напрокат»

Теперь самое интересное: ролевая игра сценарий, будто карты — это реальные предметы.

📖 Сценарий: Куртис хочет взять напрокат «Чистый код», которая доступна.

Давайте пройдёмся по этому пошагово:

  1. Участник (Куртис) говорит: «Я хочу взять напрокат «Чистый код»».
    → Первое проверяет: «У меня меньше трёх книг уже?»
    → Спрашивает Займ«Сколько у меня активных займов?»

  2. Займ отвечает: «У вас один активный займ → вы можете взять напрокат.»

  3. Участник ищет книгу: «Где «Чистый код»?»
    → Спрашивает Книга«Вы доступны?»

  4. Книга проверяет: «У меня есть активный (не возвращённый) займ?»
    → Спрашивает Заем«Есть ли у меня активный займ?»

  5. Заем отвечает: «Нет — вы доступны!»

  6. Член создаёт новый Заем объект:

    • Ссылается на этот Книга и Член

    • Устанавливает дату получения = сегодня

    • Рассчитывает дату возврата = сегодня + 14 дней

  7. Книга обновлена: «Теперь у меня активный займ → я больше недоступен.»

✅ Результат: Процесс получения книги кажется естественным, распределённым и логичным.


🔄 Шаг 4: Другая сценария — «Вернуть книгу»

📖 Сценарий: Кертис возвращает «Чистый код»

  1. Член (Кертис) говорит:«Я хочу вернуть «Чистый код»».

  2. Член находит соответствующийЗайм (скорее всего, выполняя запрос)Займ с книгой и членом).

  3. Займ отмечает себя каквозвращённый.

  4. Займ говоритКнига«Теперь вы снова доступны.»

✅ Чистый, ясный и цельный — ни один класс не выполняет работу за пределами своей ответственности.


🔍 Шаг 5: Уточнить и добавить отсутствующие классы

После ролевой игры мы замечаем, чтопробел:

❓ Кто находит книгу по названию?

В настоящее времяЧлен спрашиваетКнига напрямую — но Книга не знает, как искать!
Нам нужен центральный координатор.

➕ Новый класс: Библиотека

Ответственность Сотрудники
Добавить новую книгу в коллекцию Книга
Найти книгу по названию Книга
Зарегистрировать нового члена Член
Обработать запрос на выдачу книги Член, Книга, Заем
Обработать возврат книги Член, Книга, Заем
Знать все текущие займы Заем

💬 Библиотека выступает в качестве центрального узла — она знает все книги, всех членов и все займы.


✨ Обновленный процесс: «Взять книгу» с библиотекой

  1. Член → Библиотека«Найти книгу с названием «Чистый код»».

  2. Библиотека ищет в своей коллекции и возвращает Книга (или null если не найдена).

  3. Член теперь знает, что книга существует → спрашивает Библиотека«Могу ли я взять эту книгу?»

  4. Библиотека проверяет:

    • Доступна ли книга? (через Book.isAvailable())

    • Находится ли член в пределах лимита выдачи? (через Loan.countActiveLoans(member))

  5. Если да → Библиотека создает новую Ссуду и обновляет как Книга так и Ссуду.

  6. Книга становится недоступным; Заем отслеживает связь.

✅ Теперь поток имеет смысл — это Библиотека обслуживает обнаружение и координацию.


🧩 Итоговое резюме карточек CRC (упрощённо для новичков)

Класс Ключевые обязанности Ключевые соучастники
Библиотека Управляет книгами, членами, займами; обрабатывает выдачу/возврат Книга, Член, Заем
Член Знает личную информацию; инициирует выдачу/возврат Библиотека, Заем
Книга Хранит метаданные; отслеживает доступность Библиотека, Заем
Заем Отслеживает историю выдачи; рассчитывает даты возврата; управляет статусом возврата Член, Книга, Библиотека

✅ Принцип проектирования: Каждый класс имеет одну чёткую цель, и обязанности являются согласованными и хорошо распределёнными.


🌟 Почему карточки CRC работают так хорошо (ключевые моменты для новичков)

Выгода Объяснение
Проектирование, ориентированное на ответственность Заставляет думать: «Что это класс знает или делает?» а не просто хранения данных.
Естественное обнаружение отсутствующих классов Ролевая игра выявляет пробелы (например, отсутствующий Библиотека) — никаких догадок не требуется.
Мгновенная обратная связь через ролевую игру Если поток кажется неудобным, вы понимаете, что ответственность находится не на своем месте.
Минимальные формальности и совместная работа Нет сложных инструментов — только карточки, стикеры или доска. Отлично подходит для команд.
Связывает требования с кодом Преобразует пользовательские истории в реальные взаимодействия классов.

🛠️ Быстрые советы для вашей первой сессии CRC

  1. Используйте физические карточки (карточки 3×5 или стикеры) — это более увлекательно.

  2. Один класс на карточку — оставайтесь простыми.

  3. Пишите крупно и разборчиво — другие должны легко его читать.

  4. Играйте вслух — передавайте карточки, как настоящие предметы.

  5. Начните с 3–6 основных сценариев (например, взять в долг, вернуть, поиск).

  6. Не стремитесь к совершенству — цель состоит в том, чтобыитерация, а не окончательный дизайн. Уточняйте по мере продвижения.

  7. Используйте простые, специфичные для предметной области имена — избегайте технической терминологии. Используйте «Член», а не «Посетитель», если ваша команда согласна.

  8. Пригласите всех принять участие — даже непрограммисты могут помочь выявить отсутствующие обязанности.

  9. Позже нарисуйте простую диаграмму классов — чтобы визуализировать отношения и подтвердить согласованность.

  10. Держите процесс веселым — относитесь к этому как к игре. Чем больше вовлечена ваша команда, тем лучше результаты.


🔄 Попробуйте сами: следующие области для изучения

Как только вы освоите систему библиотеки, попробуйте применить карточки CRC к другим областям, подходящим для новичков:

☕ Система заказов в кофейне

  • Классы:ПокупательЗаказПункт менюБаристаКасса

  • Сценарии: Сделать заказ → Добавить напиток → Применить скидку → Оплатить → Распечатать чек

🪙 Автомат с напитками

  • Классы:Автомат с напиткамиТоварМонетаВыдачаКалькулятор сдачи

  • Сценарии: Вставить монету → Выбрать товар → Выдать продукт → Вернуть сдачу

🎮 Игра в викторину

  • Классы: ВикторинаВопросИгрокТрекер очковСессия игры

  • Сценарии: Начать викторину → Ответить на вопрос → Проверить правильность → Показать итоговый результат

🚗 Парковочный гараж

  • Классы: ГаражМашинаМесто для парковкиБилетВорота

  • Сценарии: Въезд в гараж → Парковка автомобиля → Выезд → Оплата платы → Получение билета

Каждая из этих систем основана на одних и тех же принципах:

  • Определите существительные → распределите обязанности → сыграйте роли → улучшите → повторите.


📌 Заключительные мысли: карточки CRC — это больше, чем методика — это настрой

Настоящая сила карточек CRC заключается не в самих карточках — а в том, что они вызываютразговорони вызывают.

Когда вы пишете карточку и говорите:«Кто это делает?»или«С кем ему нужно поговорить?», вы уже думаете, как объектно-ориентированный дизайнер.

🔥 Профессиональный совет: Используйте карточки CRC на планировании спринта, при технических исследованиях или даже на собеседованиях, чтобы продемонстрировать своё мышление в области проектирования.

Они не только для разработчиков — они длякаждогокого угодно, участвующего в создании программного обеспечения: менеджеров продуктов, дизайнеров, тестировщиков и студентов.


📎 Хотите больше?

👉 Скачайте шаблон карточек CRC для распечатки (PDF или цифровой) для использования на вашей следующей встрече.
👉 Попробуйте живую сессию карточек CRCс коллегой — распределите роли: «Ты — член», «Ты — книга» и т.д.
👉 Поделитесь своими результатами — опубликуйте свои карточки в социальных сетях с хэштегами #CRCcards или #OODesignJourney.


🏁 Заключение

ТеСистема выдачи библиотечных книгявляется одним из самых классических и эффективных примеров карточек CRC — не потому что он сложный, а потому что онпростой, понятный и проницательный.

Следуя всего лишьпяти шагам— мозговой штурм, создание карточек, ролевая игра, уточнение и итерации — вы можете:

  • Нaturally обнаруживать классы

  • Четко распределять ответственность

  • Выявлять недостатки в проектировании на ранней стадии

  • Формировать общую умственную модель как команда

И самое главное? Вам не нужно быть старшим разработчиком, чтобы это сделать.
Вам нужно лишь любопытство, несколько карточек и готовность поиграть.


✅ Теперь ваша очередь: Возьмите несколько стикеров, выберите простую систему (например, кофейню или автомат с напитками) и попробуйте метод CRC.

📌 Помните: Хороший дизайн — это не написание идеального кода — это задавание правильных вопросов.

А с карточками CRC вы уже задаете их.


📌 Дополнительно: Шаблон карточек CRC для печати (текстовая версия)

┌────────────────────┐
│    [ИМЯ КЛАССА]    │
├────────────────────┤
│ Ответственность:   │
│ -                  │
│ -                  │
│ -                  │
├────────────────────┤
│ Соисполнители:     │
│ -                  │
│ -                  │
└────────────────────┘

Напечатайте это на карточках 3×5 или используйте в цифровом инструменте, таком как Miro, Figma или Google Slides.


📚 Следующий шаг?
Хотите подробный разбор системыСистемы заказов в кофейнес использованием того же стиля CRC?
👉 Просто скажите слово — я отправлю вам следующий кейс, пошагово, с карточками, сценариями и ролевой игрой!

Удачного проектирования! 🎮🧩💻

Эта статья также доступна на Deutsch, English, Español, فارسی, Français, English, Bahasa Indonesia, 日本語, Polski, Portuguese, Việt Nam, 简体中文 and 繁體中文