Skip to content

Latest commit

 

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Лабораторная работа №4. Симуляция с пользовательсĸими ĸоллеĸциями и псевдослучайной моделью

Ямалов Искандер Ильдарович, М8О-106БВ-25

Введение

Данное консольное приложение реализует систему управления библиотекой книг с использованием пользовательских коллекций, индексации и симуляции работы библиотеки. Проект демонстрирует применение объектно-ориентированного программирования, абстрактных классов, композиции и фасадного паттерна.

Структура проекта

lab4/
├── src/                                  # Исходный код
│   ├── __init__.py
│   ├── main.py                           # Точка входа в приложение
│   ├── models/                           # Модели данных
│   │   ├── __init__.py
│   │   ├── book.py                       # Модель книги (Book)
│   │   └── base_collections.py           # Базовый интерфейс коллекций (BaseCollection)
│   ├── collections/                      # Пользовательские коллекции
│   │   ├── __init__.py
│   │   ├── book_collection.py            # Списоковая коллекция книг (BookCollection)
│   │   └── index_dict.py                 # Индексированная коллекция (IndexDict)
│   ├── library/
│   │   ├── __init__.py
│   │   └── library.py                    # Класс Library
│   ├── simulation/                       # Симуляция работы
│   │   ├── __init__.py
│   │   ├── runner.py                     # Функции симуляции
│   │   └── constants.py                  # Константы для симуляции
│   └── common/                           # Общие компоненты
│       ├── __init__.py
│       └── config.py                     # Конфигурация логирования
│
├── tests/                                # Unit тесты
│   ├── __init__.py
│   ├── test_book.py                     # Тесты модели Book
│   ├── test_book_collection.py          # Тесты BookCollection
│   ├── test_index_dict.py               # Тесты IndexDict
│   ├── test_library.py                  # Тесты Library
│   └── test_runner.py                    # Тесты симуляции
│
├── uv.lock                               # Зависимости проекта
├── requirements.txt                      # Зависимости проекта
├── pyproject.toml                        # Конфигурация проекта
├── .gitignore                            # git ignore файл
└── README.md                             # Описание проекта

Описание реализованных команд

main - запуск симуляции библиотеки

Использование: main [--steps <число>] [--seed <число>]

Описание: Запускает симуляцию работы библиотеки с заданным количеством шагов. Симуляция демонстрирует различные операции с библиотекой: добавление, удаление, обновление книг, поиск по различным критериям и обновление индексов.

Параметры:

  • --steps или -st - количество шагов симуляции (по умолчанию: 20)
  • --seed или -se - seed для генератора случайных чисел (по умолчанию: -1, означает случайный seed)

Примеры:

python -m src.main --steps 20 --seed 42
python -m src.main -st 10 -se 123
python -m src.main

События симуляции:

  1. Добавление случайной книги - создает и добавляет новую книгу со случайными параметрами
  2. Удаление случайной книги - удаляет случайную книгу из библиотеки
  3. Обновление названия книги - изменяет название случайной книги
  4. Поиск книг - выполняет поиск по одному из критериев:
    • По автору
    • По жанру
    • По году издания
    • Комбинированный поиск (по автору, названию и году)
  5. Получение книги - получает книгу по ISBN или случайному ISBN
  6. Обновление индексов - пересоздает все индексы библиотеки

Основные компоненты

Book

Класс книги с валидацией всех полей:

  • title - название книги (не может быть пустым)
  • author - автор книги (не может быть пустым)
  • year - год издания (должен быть в диапазоне от 0 до текущего года)
  • genre - жанр (не может быть пустым)
  • isbn - уникальный идентификатор (не может быть пустым)

Валидация:

  • Все строковые поля проверяются на пустоту и тип
  • Год издания проверяется на допустимый диапазон
  • Все ошибки валидации вызывают соответствующие исключения (ValueError, TypeError)

BaseCollection

Абстрактный базовый класс, определяющий интерфейс для коллекций книг:

  • add(book) - добавление книги
  • remove(book_or_isbn) - удаление книги
  • __len__() - количество книг
  • __iter__() - итерация по книгам
  • __getitem__(key) - доступ по ключу
  • __contains__(item) - проверка наличия

BookCollection

Списковая коллекция книг, наследующая BaseCollection:

  • Хранит книги в виде списка
  • Позволяет доступ по индексу и срезу
  • Поддерживает все операции базового интерфейса

IndexDict

Индексированная коллекция с тремя индексами, наследующая BaseCollection:

  • По ISBN (_isbn_index) - быстрый поиск одной книги по уникальному идентификатору
  • По автору (_author_index) - поиск всех книг автора (возвращает множество)
  • По году (_year_index) - поиск всех книг года издания (возвращает множество)

Методы:

  • clear() - очистка всех индексов
  • get_by_author(author) - получение книг по автору (возвращает пустое множество, если нет)
  • get_by_year(year) - получение книг по году (возвращает пустое множество, если нет)

Library

Класс библиотеки, объединяющий BookCollection и IndexDict:

  • add_book(book) - добавление книги в библиотеку
  • remove_book_by_isbn(isbn) - удаление книги по ISBN
  • find_by_author(author) - поиск всех книг по автору
  • find_by_year(year) - поиск всех книг по году издания
  • find_by_genre(genre) - поиск всех книг по жанру (линейный поиск по коллекции)
  • find_by_isbn(isbn) - поиск книги по ISBN (вызывает KeyError, если не найдена)
  • get_book(isbn=None, author=None, title=None, year=None) - получение книги по ISBN или комбинации параметров
  • update_index() - обновление всех индексов на основе текущего состояния коллекции книг
  • __call__(isbn) - магический метод для вызова библиотеки как функции
  • __contains__(isbn) - магический метод для проверки наличия книги

Обработка ошибок

Все компоненты обрабатывают следующие типы ошибок:

  • ValueError - невалидные параметры (пустые строки, недопустимые годы, дублирующиеся ISBN)
  • TypeError - неверные типы данных (например, передача не-строки в строковое поле)
  • KeyError - попытка найти несуществующую книгу по ISBN через find_by_isbn

Логирование

Приложение использует структурированное логирование:

  • Файл логов: shell.log (в корне проекта)

  • Формат: %(asctime)s [%(levelname)s] %(name)s: %(message)s

  • Ротация: При достижении размера 5 МБ создается новый файл (до 5 резервных копий)

  • Вывод: Логи записываются только в файл, консольный вывод отделен (используется print)

Все события симуляции логируются:

  • Запуск и завершение симуляции
  • Добавление, удаление, обновление книг
  • Поиск и получение книг
  • Ошибки при выполнении операций

Особенности реализации

Детерминированность

При использовании одинакового seed симуляция полностью детерминирована:

  • Одинаковая последовательность событий
  • Одинаковые данные для книг
  • Идентичный вывод

Индексация

Библиотека использует тройную индексацию для быстрого поиска:

  • Поиск по ISBN: O(1)
  • Поиск по автору: O(1) для доступа к множеству книг
  • Поиск по году: O(1) для доступа к множеству книг
  • Поиск по жанру: O(n) - линейный поиск по коллекции

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages