Files
rust-otus/smart-house/README.md
2026-01-20 21:48:24 +03:00

110 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Учебная библиотека "Умный дом"
Демонстрационная библиотека для выполнения домашних заданий.
## ДЗ 2025-12-16
Заготовка для библиотеки "Умный дом".
### Цель:
Создать заготовку для библиотеки «Умный дом» и напишите пример, демонстрирующий её функционал.
### Срок:
Сдать до: **2026-01-19**
### Описание/Пошаговая инструкция выполнения домашнего задания:
Библиотека и пример использования реализованы в одном package.
Для библиотеки:
- [x] Реализована в виде lib крейта.
- [x] Опишите тип: умный термометр. Тип должен предоставлять следующий функционал:
- [x] Конструктор, принимающий значения полей.
- [x] Возвращать значение текущей температуры (произвольное число).
- [x] Опишите тип: умная розетка. Тип должен предоставлять следующий функционал:
- [x] Конструктор, принимающий значения полей.
- [x] Включение/выключение + возможность узнать текущее состояние.
- [x] Возвращать текущую мощность: если выключено — ноль, иначе произвольное число.
- [x] Опишите тип: умное устройство. Тип должен содержать одно из устройств (умный термометр или розетку) и предоставлять следующий функционал:
- [x] Выводить в стандартный вывод сообщение о состоянии устройства.
- [x] Опишите тип: комната, содержащая массив умных устройств. Тип должен предоставлять следующий функционал:
- [x] Конструктор, принимающий массив устройств.
- [x] Можно получить ссылку на устройство по указанному индексу.
- [x] Можно получить мутабельную ссылку на устройство по указанному индексу.
- [x] Выводить в стандартный вывод отчёт о всех устройствах в комнате.
- [x] Опишите тип: умный дом, содержащий массив комнат. Тип должен предоставлять следующий функционал:
- [x] Конструктор, принимающий массив комнат.
- [x] Можно получить ссылку на комнату по указанному индексу.
- [x] Можно получить мутабельную ссылку на комнату по указанному индексу.
- [x] Выводить в стандартный вывод отчёт о всех комнатах.
- Размеры массивов можно выбрать произвольно.
- В случае, если указан индекс, выходящий за пределы массива, приложение должно аварийно завершаться (макрос `panic!()`).
Для примера использования:
- [x] Реализована в виде bin крейта.
- [x] Создайте экземпляр умного дома и выведете отчёт о его содержимом.
- [x] Для уже созданного экземпляра дома выключите умную розетку в одной из комнат. Снова выведите отчёт.
**Критерии оценки**:
- Package успешно собирается.
- Приложение-пример успешно выполняется и выводит отчёт о доме.
- Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений.
- Присутствуют и успешно выполняются модульные тесты.
## ДЗ 2026-01-20
Дорабатываем умный дом
### Цель:
Дорабатываем функционал умного дома, используя возможности стандартной библиотеки.
### Срок:
Сдать до: **2026-02-11**
### Описание/Пошаговая инструкция выполнения домашнего задания:
Добавить обработку ошибок:
- [ ] Заменить паники на возврат Option в методах получения комнаты по ключу.
- [ ] Заменить паники на возврат Option в методах получения устройства по ключу.
Доработать хранение объектов:
- [ ] Заменить массивы устройств и комнат на ассоциативные коллекции из std. В качестве ключей использовать строки.
- [ ] Реализовать трейт Debug на всех типах.
- [ ] Добавить возможность динамически добавлять/удалять устройства в комнату.
- [ ] Добавить возможность динамически добавлять/удалять комнату в дом.
- [ ] Добавить в тип умного дома метод, позволяющий сразу получить ссылку на умное устройство. Метод принимает имя комнаты
и имя устройства. В случае, если устройство или комната не найдены, возвращать тип ошибки, сообщающий, что именно
произошло. Тип ошибки должен реализовывать трейт `std::error::Error`.
- [ ] Добавить реализации трейта `From`, позволяющие преобразовывать объекты умной розетки и умного термометра в объект
умного устройства.
- [ ] Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ,
объект умного термометра) и возвращающий объект комнаты, содержащей все перечисленные устройства с
соответствующими ключами.
Доработать формирование отчёта:
- [ ] Вынести метод формирования отчёта в трейт и реализовать его на всех типах, которые возвращают отчёт: умное устройство,
комната, дом.
Привести тесты в соответствие с новым функционалом.
Доработать приложение-пример:
- [ ] Продемонстрировать возможность динамического добавления/удаления комнат.
- [ ] Продемонстрировать возможность динамического добавления/удаления устройств.
- [ ] Добавить функцию, которая принимает любой объект, умеющий выводить отчёт. Вывести с её помощью отчёты о доме,
отдельной комнате, отдельном устройстве.
- [ ] Продемонстрировать возможность обработки ошибок.
**Критерии оценки**:
- Package успешно собирается.
- Приложение-пример успешно выполняется и выводит отчёт о доме.
- Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений.
- Присутствуют и успешно выполняются модульные тесты.