Язык: Python 3.8+ (рекомендую 3.10+)
Автор: <Сатторов Амирджон>
Консольное приложение для учёта животных и вещей зоопарка. Реализовано с вниманием к принципам SOLID и с простым DI-контейнером. Приложение позволяет:
- принимать животных (с проверкой здоровья ветеринарной клиникой),
- регистрировать вещи (Table, Computer, Thing),
- получать отчёты: количество животных, суммарный расход корма в сутки,
- формировать список животных, пригодных для контактного зоопарка (травоядные с kindness > 5),
- показывать инвентари (вещи + животные) и подробные списки.
-
Клонировать репозиторий и перейти в папку проекта
-
Запускаем src/main.py
-
Приложение откроет интерактивное консольное меню. Примеры команд, которые появляются в меню:
- 1 — Добавить животное
- 2 — Добавить вещь (Table / Computer / другое)
- 3 — Показать количество животных и общий расход корма
- 4 — Список животных, пригодных для контактного зоопарка
- 5 — Показать инвентарь (вещи + животные)
- 6 — Показать подробный список животных
- 0 — Выход
Примеры запуска и ввода:
Выберите пункт: 1
Выберите вид животного:
- Monkey
- Rabbit
- Tiger
- Wolf
Введите номер вида: 1
Имя животного: Momo
Сколько кг еды в сутки (целое): 3
Уровень доброты (0-10): 7
Ветеринарная проверка: животное Monkey 'Momo'. Здорово? (да/нет): y
Животное принято и зарегистрировано с номером 1.
-
Добавление новых животных
- Метод:
Zoo.add_animal(animal, simulated_health=None). - Перед добавлением вызывается
VeterinaryClinic.inspect(animal, simulated_health). В интерактивном режиме клиника спрашиваетда/нету пользователя; в тестах можно передатьsimulated_healthдля автоматизации.
- Метод:
-
Проверка здоровья (ветеринарная клиника)
- Файл:
clinic.py, классVeterinaryClinic. - Метод
inspectвозвращаетTrue(принимаем) илиFalse(отказываем). Для тестов и автоматизации есть параметрsimulated_health.
- Файл:
-
Учет количества килограммов еды
- Каждое животное хранит поле
food(целое — кг в сутки). Zoo.total_food_per_day()суммирует полеfoodдля всех животных и возвращает число кг/сутки.
- Каждое животное хранит поле
-
Список животных для контактного зоопарка
- Правило: травоядные (
Herbo) сkindness > 5. - Реализация:
Zoo.contact_zoo_candidates()возвращает список таких животных (типHerboиkindness > 5).
- Правило: травоядные (
-
Инвентаризация вещей и животных
- Интерфейс:
IInventory(number,name) — в проекте через структурную типизацию (Protocol) или свойства. Zooхранит коллекции_animalsи_things.Zoo.inventory_list()возвращает единый список пар(наименование, инв. номер)для вещей и животных.- Инвентарный номер присваивается автоматически через внутренний счётчик
Zoo._next_inventory_number, либо может быть указан вручную (при ручном указании счётчик корректируется, чтобы избежать конфликтов номера).
- Интерфейс:
-
DI-контейнер
- Файл:
container.py. - Функции:
register_singleton,register_factory,resolve. main.pyсобирает контейнер: регистрируетVeterinaryClinicкак singleton иZooкак фабрику (lambda: Zoo(clinic)), затем получаетzoo = container.resolve("zoo").- Это даёт гибкость и упрощает подмену реализаций при тестировании.
- Файл:
-
Принципы SOLID
- S (Single Responsibility): разделение по файлам:
models.py(данные),clinic.py(ветклиника),zoo.py(логику хранения и отчётов),main.py(UI),container.py(DI). - O (Open/Closed): добавление нового вида животного — создать новый подкласс
Animal/Herbo/Predator;Zooне требует изменений. - L (Liskov Substitution): подклассы животных (Monkey, Rabbit, Tiger, Wolf) можно подставлять вместо
Animalвезде в коде. - I (Interface Segregation): мелкие контракты/протоколы
IAlive(полеfood) иIInventory(поляnumber,name). - D (Dependency Inversion & Injection):
ZooполучаетVeterinaryClinicизвне через DI; тесты могут подставлятьFakeClinic.
- S (Single Responsibility): разделение по файлам:
-
Unit-тесты
- Файл:
tests/test.py(pytest). - Тесты покрывают критичные кейсы: прием животного, отказ, добавление вещей и проверка инвентаря.
- Для запуска тестов надо использовать:
pytest.
- Файл:
-
Понятный ввод/вывод
- В
main.pyреализовано текстовое меню, проверка корректности ввода (целые числа), повтор запроса на неверный ввод.
- В