October 11, 2022

Избавление от null

Что такое Null по своей природе? Мне нужно перейти из Nullable мира в мир "чистых идей".

Как это сделать? Очевидно есть путь успешных исходов, когда все состояния консистентные. Это и есть, так называемый desired-путь.

Но что делать с путями, которые "неполучились", там где есть null? Это на самом деле, отслеживается легко в некоторых случаях. IDE почти всегда сам указывает когда ты пытаешься запихать nullable в non-nullable. Тут надо посмотреть, потому-что ты пытаешься трехмерный объект засунуть в двумерный. При этом в какой-то момент объект может просто исчезнуть, так как ушел в z-плоскость.

Ну, давай посмотрим пример...

assets_bloc.dart.

Первый пример, это assets может быть null. Ну, тут проблема в том, что Map может вернуть null, если переданный key не задан в мапе. Решается тем, что я создаю AssetRepository, который не может вернуть null;

Второй, asset может быть null. Значит был выбран "нулевой" изначально, и при выходе он вернул текущее состояние. Значит нужно чтобы Dropdown не мог вернуть null. Это разве возможно, чтобы был выбран нулевой? Да, когда asset еще не выбран, и я закрываю popup menu.

Значит тут уже две проблемы. Решаем их последовательно. Во-первых, asset не может прийти нулевым. Все. Делай...

Nullable зависимость внутри Dropdown виджета

В общем, рефакторим Dropdown... Отрефакторил. Теперь вместо одного сложного nullable класса на все state, мы имеем несколько null-safe калссов. Каждый только для своего случая. Все они наследованы от абстрактного родителя, к super-конструктору, которого мы передаем наши "всегда конситсентные данные".

Таким образом, мы расщепили трехмерный объект на несколько двумерных форм, которые он в принципе может принять во время пересечения нашей двумерной плоскости.

При всем этом, самая главная идея в том, что мы научились жить, когда трехмерный объект совсем не пересакает нашу плоскоть. Это значит ,что наша двумерная вселенная может существовать без пересечения с трехмерным объектом совсем. И появление этого странного объекта, в двумерной вселенной мы объяснили в терминах двумерного мира, используя только логику двумерного мира. Это как будто чего-то никогда не было, и тут он появился. И это стало возможным. В этих размышлениях, для нас первичное состояние - это состояние мира, где не существует пересечения с трехмерным объектом.

Зависимость от состояния другого блока

У нас есть блок, который может существовать только в некоторых состояниях другого блока. И более того оно имеет прямую зависимость от него, в виде аргумента, который приходит из этого внешнего блока.

При этом визуально наш блок, как будто существует всегда. Так ли это? На самом деле - не всегда. Существует состояние в виде Placeholder, который не имеет зависимости. Его связь с другими состояниями, которые имеют зависимость, только лишь в том, что они наследуются от одного абстрактного состояния.

Итак, у нас есть блок, который существует только с зависимостью, при этом одна из его состояний существует без этой зависимости. Так может быть это состояние вовсе не принадлежит этому блоку? Тогда к чему принадлежит?

Оно замещает как раз весь блок. И скорее относится к состояниям родительского блока. Чтож делаем... Но как? Попробуем селектор...

Обошелся без селектора, просто вложенными bloc. Получилось неплохо, но партянка в tracker_page очень длинная.

Как перевести вложенную структуру в параллельную? Был миг, короткий, когда мне показалось что все это дело можно посмотреть с точки зрения не вложенных структур а блока кода, со множеством функций.

Как перевести вложенную структуру в параллельную?

А зачем мне нужна параллельная структура? Так понятнее будет по коду, что мы собираемся отрисовывать. Но структура не постоянная, ведь, чтобы один раз нарисовать и все понятно стало. Разве? Ну, в ней есть постоянные свойства, с точки зрения UI и даже, кажется, что она полностью постоянна, с учетом пустого состояния price.

Price мы можем в двух состояниях сделать наглядно. Market всегда в одном состоянии, а asset имеет дополнительное состояние disabled, с точки зрения UI.

По факту, мы имеем очень простой UI компонент, без всяких вложений. Это бизнес логика имеет вложенную структуру. Мне нужно придумать как забиндить в UI разные по своей природе и расположению state.