Files
rust-otus/smart-house
2026-03-07 00:07:48 +03:00
..
2026-03-07 00:07:48 +03:00
2025-12-15 13:48:49 +03:00
2026-02-25 23:13:59 +03:00
2026-02-25 23:13:59 +03:00
2026-03-07 00:07:48 +03:00
2025-12-15 13:48:49 +03:00

Учебная библиотека "Умный дом"

Демонстрационная библиотека для выполнения домашних заданий.

ДЗ 2025-12-16

Заготовка для библиотеки "Умный дом".

Цель:

Создать заготовку для библиотеки «Умный дом» и напишите пример, демонстрирующий её функционал.

Срок:

Сдать до: 2026-01-19

Описание/Пошаговая инструкция выполнения домашнего задания:

Библиотека и пример использования реализованы в одном package.

Для библиотеки:

  • Реализована в виде lib крейта.
  • Опишите тип: умный термометр. Тип должен предоставлять следующий функционал:
    • Конструктор, принимающий значения полей.
    • Возвращать значение текущей температуры (произвольное число).
  • Опишите тип: умная розетка. Тип должен предоставлять следующий функционал:
    • Конструктор, принимающий значения полей.
    • Включение/выключение + возможность узнать текущее состояние.
    • Возвращать текущую мощность: если выключено — ноль, иначе произвольное число.
  • Опишите тип: умное устройство. Тип должен содержать одно из устройств (умный термометр или розетку) и предоставлять следующий функционал:
    • Выводить в стандартный вывод сообщение о состоянии устройства.
  • Опишите тип: комната, содержащая массив умных устройств. Тип должен предоставлять следующий функционал:
    • Конструктор, принимающий массив устройств.
    • Можно получить ссылку на устройство по указанному индексу.
    • Можно получить мутабельную ссылку на устройство по указанному индексу.
    • Выводить в стандартный вывод отчёт о всех устройствах в комнате.
  • Опишите тип: умный дом, содержащий массив комнат. Тип должен предоставлять следующий функционал:
    • Конструктор, принимающий массив комнат.
    • Можно получить ссылку на комнату по указанному индексу.
    • Можно получить мутабельную ссылку на комнату по указанному индексу.
    • Выводить в стандартный вывод отчёт о всех комнатах.
  • Размеры массивов можно выбрать произвольно.
  • В случае, если указан индекс, выходящий за пределы массива, приложение должно аварийно завершаться (макрос panic!()).

Для примера использования:

  • Реализована в виде bin крейта.
  • Создайте экземпляр умного дома и выведете отчёт о его содержимом.
  • Для уже созданного экземпляра дома выключите умную розетку в одной из комнат. Снова выведите отчёт.

Критерии оценки:

  • 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 не выводят ошибок и предупреждений.
  • Присутствуют и успешно выполняются модульные тесты.

ДЗ 2026-02-12

Дорабатываем умные устройства

Цель:

Описать для умной розетки и умного термометра логику взаимодействия с удалённым устройством и написать имитаторы устройств для тестирования.

Срок:

Сдать до: 2026-03-04

Описание/Пошаговая инструкция выполнения домашнего задания:

Для типа умной розетки:

  • Функционал не изменяется: включение/выключение + запрос мощности.
  • Взаимодействие организовано синхронно, через TCP.
  • Розетка может использовать как реальный TCP-обмен, так и имитировать реальную работу (для тестов).

Для имитатора умной розетки:

  • Читает адрес для приёма TCP-соединений из аргументов командной строки.
  • Реализован с использованием неблокирующего сетевого взаимодействия.
  • Хранит состояние розетки.
  • Позволяет управлять розеткой множеству клиентов одновременно.

Для умного термометра:

  • Функционал не изменяется: возвращает температуру.
  • Получает значения температуры в виде UDP-пакетов в параллельном потоке.
  • Параллельный поток запускается при создании объекта термометра и завершается при уничтожении этого объекта.
  • Объект термометра возвращает последнее полученное значение температуры.
  • Термометр может имитировать удалённое получение данных о температуре (для тестов).

Для имитатора умного термометра:

  • Реализован с использованием неблокирующего сетевого взаимодействия.
  • Читает адрес для отправки UDP-пакетов и временной период отправки из файла.
  • Отправляет произвольное значение температуры на указанный адрес с указанной периодичностью.

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

  • Выводить отчёт о состоянии дома, если имитаторы запущены.
  • Сообщать об ошибке, если устройству не удалось получить данные.

Критерии оценки:

  • Package успешно собирается.
  • Приложение-пример успешно выполняется.
  • Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений.
  • Присутствуют и успешно выполняются модульные тесты.

Запуск примеров

Запуск имитатора умной розетки:

cargo run --bin power_socket_mock -- 127.0.0.1:10001

Запуск имитатора термометра:

cargo run --bin thermometer_mock

Запуск примера умного дома:

cargo run --bin mocks_example

ДЗ 2026-03-05

Паттерны в умном доме

Цель:

Делаем код умного дома более удобным с использованием различных паттернов.

Срок:

Сдать до: 2026-04-01

Описание/Пошаговая инструкция выполнения домашнего задания:

Реализовать билдер для умного дома, позволяющий инициализировать объект умного дома в таком стиле.

  • До добавления первой комнаты, билдер запрещает добавлять устройства. Это должно контролироваться компилятором.

Реализовать компоновщик для построения отчёта об объектах умного дома в таком стиле.

  • Использовать статический полиморфизм (дженерики).
  • Вызов метода report() должен выводить в терминал отчёт обо всех добавленных объектах.

Добавить возможность добавления callback-ов в объект комнаты, которые срабатывают при добавлении новых устройств в комнату (паттерн Observer).

  • Использовать динамический полиморфизм (трейт-объекты).
  • Можно передавать как объект-subscriber, так и замыкание.

Добавить example-ы, демонстрирующие новый функционал.

Критерии оценки:

  • Package успешно собирается.
  • Приложение-пример успешно выполняется.
  • Команды cargo clippy и cargo fmt --check не выводят ошибок и предупреждений.
  • Присутствуют и успешно выполняются модульные тесты.