157 lines
12 KiB
Markdown
157 lines
12 KiB
Markdown
# Учебная библиотека "Умный дом"
|
||
|
||
Демонстрационная библиотека для выполнения домашних заданий.
|
||
|
||
## ДЗ 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**
|
||
|
||
### Описание/Пошаговая инструкция выполнения домашнего задания:
|
||
|
||
Добавить обработку ошибок:
|
||
- [x] Заменить паники на возврат Option в методах получения комнаты по ключу.
|
||
- [x] Заменить паники на возврат Option в методах получения устройства по ключу.
|
||
|
||
Доработать хранение объектов:
|
||
- [x] Заменить массивы устройств и комнат на ассоциативные коллекции из std. В качестве ключей использовать строки.
|
||
- [x] Реализовать трейт Debug на всех типах.
|
||
- [x] Добавить возможность динамически добавлять/удалять устройства в комнату.
|
||
- [x] Добавить возможность динамически добавлять/удалять комнату в дом.
|
||
- [x] Добавить в тип умного дома метод, позволяющий сразу получить ссылку на умное устройство. Метод принимает имя комнаты
|
||
и имя устройства. В случае, если устройство или комната не найдены, возвращать тип ошибки, сообщающий, что именно
|
||
произошло. Тип ошибки должен реализовывать трейт `std::error::Error`.
|
||
- [x] Добавить реализации трейта `From`, позволяющие преобразовывать объекты умной розетки и умного термометра в объект
|
||
умного устройства.
|
||
- [x] Написать макрос для упрощенного создания комнаты, принимающий пары вида (ключ, объект умной розетки) или (ключ,
|
||
объект умного термометра) и возвращающий объект комнаты, содержащей все перечисленные устройства с
|
||
соответствующими ключами.
|
||
|
||
Доработать формирование отчёта:
|
||
- [x] Вынести метод формирования отчёта в трейт и реализовать его на всех типах, которые возвращают отчёт: умное устройство,
|
||
комната, дом.
|
||
|
||
Привести тесты в соответствие с новым функционалом.
|
||
|
||
Доработать приложение-пример:
|
||
- [x] Продемонстрировать возможность динамического добавления/удаления комнат.
|
||
- [x] Продемонстрировать возможность динамического добавления/удаления устройств.
|
||
- [x] Добавить функцию, которая принимает любой объект, умеющий выводить отчёт. Вывести с её помощью отчёты о доме,
|
||
отдельной комнате, отдельном устройстве.
|
||
- [x] Продемонстрировать возможность обработки ошибок.
|
||
|
||
**Критерии оценки:**
|
||
- Package успешно собирается.
|
||
- Приложение-пример успешно выполняется и выводит отчёт о доме.
|
||
- Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений.
|
||
- Присутствуют и успешно выполняются модульные тесты.
|
||
|
||
## ДЗ 2026-02-12
|
||
|
||
Дорабатываем умные устройства
|
||
|
||
### Цель:
|
||
|
||
Описать для умной розетки и умного термометра логику взаимодействия с удалённым устройством и написать имитаторы устройств для тестирования.
|
||
|
||
### Срок:
|
||
|
||
Сдать до: **2026-03-04**
|
||
|
||
### Описание/Пошаговая инструкция выполнения домашнего задания:
|
||
|
||
Для типа умной розетки:
|
||
- [ ] Функционал не изменяется: включение/выключение + запрос мощности.
|
||
- [ ] Взаимодействие организовано синхронно, через TCP.
|
||
- [ ] Розетка может использовать как реальный TCP-обмен, так и имитировать реальную работу (для тестов).
|
||
|
||
Для имитатора умной розетки:
|
||
- [ ] Читает адрес для приёма TCP-соединений из аргументов командной строки.
|
||
- [ ] Реализован с использованием неблокирующего сетевого взаимодействия.
|
||
- [ ] Хранит состояние розетки.
|
||
- [ ] Позволяет управлять розеткой множеству клиентов одновременно.
|
||
|
||
Для умного термометра:
|
||
- [ ] Функционал не изменяется: возвращает температуру.
|
||
- [ ] Получает значения температуры в виде UDP-пакетов в параллельном потоке.
|
||
- [ ] Параллельный поток запускается при создании объекта термометра и завершается при уничтожении этого объекта.
|
||
- [ ] Объект термометра возвращает последнее полученное значение температуры.
|
||
- [ ] Термометр может имитировать удалённое получение данных о температуре (для тестов).
|
||
|
||
Для имитатора умного термометра:
|
||
- [ ] Реализован с использованием неблокирующего сетевого взаимодействия.
|
||
- [ ] Читает адрес для отправки UDP-пакетов и временной период отправки из файла.
|
||
- [ ] Отправляет произвольное значение температуры на указанный адрес с указанной периодичностью.
|
||
|
||
Добавлен дополнительный пример умного дома с розетками и термометрами, которые работают с имитаторами. Данный пример должен запускаться и:
|
||
- [ ] Выводить отчёт о состоянии дома, если имитаторы запущены.
|
||
- [ ] Сообщать об ошибке, если устройству не удалось получить данные.
|
||
|
||
**Критерии оценки:**
|
||
|
||
- Package успешно собирается.
|
||
- Приложение-пример успешно выполняется.
|
||
- Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений.
|
||
- Присутствуют и успешно выполняются модульные тесты.
|