Использование системы типов
Система типов Rust выразительна: с помощью типов и трейтов можно строить абстракции, которые затрудняют неправильное использование кода.
В некоторых случаях можно зайти так далеко, что корректность будет обеспечиваться во время компиляции без накладных расходов во время выполнения.
Типы и трейты могут моделировать понятия и ограничения вашей предметной области. При продуманном проектировании можно повысить ясность и сопровождаемость всей кодовой базы.
Дополнительные моменты, которые может упомянуть докладчик:
-
Система типов Rust во многом заимствует идеи из языков функционального программирования.
Например, перечисления Rust в языках вроде Haskell и OCaml известны как «алгебраические типы данных». При поиске руководства по проектированию с помощью типов можно черпать вдохновение в материалах для функциональных языков. «Domain Modeling Made Functional» — отличный ресурс по этой теме с примерами на F#.
-
Несмотря на функциональные корни Rust, не все шаблоны функционального проектирования легко переносятся на Rust.
Например, чтобы проектировать API с использованием функций высшего порядка и типов высшего рода в Rust, нужно твёрдо владеть широким набором продвинутых тем.
Оценивайте в каждом случае, будет ли более императивный подход проще в реализации. Рассмотрите изменение данных на месте, полагаясь на анализатор заимствований и систему типов Rust в контроле того, что и где можно изменять.
-
Такая же осторожность должна применяться и к объектно-ориентированным шаблонам проектирования. Rust не поддерживает наследование, и декомпозиция объектов должна учитывать ограничения, которые вносит анализатор заимствований.
-
Упомяните, что программирование на уровне типов часто можно использовать для создания «абстракций с нулевой стоимостью», хотя этот ярлык может вводить в заблуждение: влияние на время компиляции и сложность кода может быть значительным.
Этот сегмент займёт около 7 часов 30 минут. Он включает:
| Слайд | Длительность |
|---|---|
| Использование системы типов | 5 минут |
| Паттерн newtype | 20 минут |
| RAII | 1 час 50 минут |
| Трейты-расширения | 1 час 5 минут |
| Паттерн typestate | 1 час 5 минут |
| Инварианты анализатора заимствований | 1 час 30 минут |
| Типы-токены | 1 час 35 минут |