Rectangle
type Rectangle =
inherit Control
val memory@atom = (width@atom, height@atom)
|> to_atom
|> map { w, h ->
let quad = Quad.create
up_left = Vector3 0 0 0
up_right = Vector3 w.as<f32> 0 0
down_left = Vector3 0 h.as<f32> 0
down_right = Vector3 w.as<f32> h.as<f32> 0
MeshMemory.from_quad quad }
Прямоугольник хранит в себе геометрическую форму, созданную исходя из его ширины и высоты.
type Control
var maybe_drawable : Option<Drawable> = None
Единица упаковки кода называется ящик.
Тип Rectangle
определён в ящике control
, отвечающем за внутреннюю логику элементов управления. Последний же фрагмент кода находится в ящике drawer
, который выводит пользовательский интерфейс на экран и зависит от конкретного отрисовщика, частью которого является Drawable
.
type Rectangle
let ui_material : Material @auto
val drawable = Drawable
mesh = Mesh.from_memory memory@atom
material = ui_material
maybe_drawable = drawable
Поле ui_material
получает значение автоматически благодаря атрибуту @auto
.
let ui_material @publish = app.drawer.materials.ui
let rectangle = Rectangle.new
Значение опубликованной привязки ui_material
будет передано в конструктор Rectangle
.
Именно неявная передача значений это не только вопрос снижения сложности. В других ящиках может находиться код, создающий Rectangle
, но ничего не знающий о зависимостях, которые он получил в ящике drawer
. Весь этот код продолжит работать, но теперь при вызове будет требовать предварительно опубликованную ui_material
.