выглядит так, что сортировки самому писать не стоит =) список 20к элементов (Ryzen3900x)
bubble sort time: 957 ms selection sort time: 421 ms default sort time: 16 ms
bin search index: 332 time: 567 mcs default search index: 332 time: 84 mcs
Подход с вынесением логики и данных выше по дереву ранее уже использовал, но не знал, что оно называется именно так
RIG-10391
./static/lifting_state.mp4
Вообще пример высосанный из пальца, самое крутое (на мой взгляд), что я делал используя такой подход - это на прошлом проекте, в мессенджер, для формирования вьюшки сообщения
у нас дано сообщение которое может иметь n типов:
- текстовое
- изображение
- видео
- аудио
- голосовое
- стикер и тд
я реализовал inherited widget MessageData в нем содержалось все необходимое для построения вьюшки + он был подписан на репозиторий для обновления своих данных и перестройки UI, если сообщение было удалено, отредактировано или, например, не отправилось...
Упрощение условий и вложенности, так же всегда использую, но не знал, правильное название этого подхода. В своей работе стараюсь применять 2 правила:
-
если больше 2 вложенных циклов или условий, скорее всего ты что-то делаешь не так.
-
используй else только тогда, когда точно понимаешь, что без него ни как
Плохо
bool get hasPrivileges{
if(type !== UserType.user){
if(type == UserType.admin){
return true;
} else if(type == UserType.moder){
return true;
} else {
return false;
}
} else {
return false;
}
}
Получше
bool get hasPrivileges{
if(type == UserType.user) return;
if(type == UserType.admin || type == UserType.moder){
return true;
}
return false;
}
Идеально
bool get hasPrivileges{
return type == UserType.admin || type == UserType.moder;
}
На проекте покрыл экраны авторизации, регистрации - пруф
Чиню юниты когда падает ci - пруф
покрыл алгоритмы юнитами - пруф
У меня вопрос был только по Error и Exception чем отличаются, почему одни обрабатываются другие нет.
Ответ оказался достаточно прост - Error нужно вообще избегать, а не обрабатывать. Например правильно использовать операторы ? | ! для nullable объектов или внимательно следить за привидением типов.
(пример обработки исключений)[https://github.com/surfstudio/rigla-flutter/blob/_deploy_2.0.28/lib/ui/screen/cart/elementory/cart/application/interactors/cart_interactor/features/error_wrapper.dart]
В целом, с приходом ci на проект я научился читать логи, детектить и исправлять ошибки.
Базова настраивать уже умел - пруф
Там моно реп, бек + мордочка на flutter
Тригерится по изменениям в соответствующей папке бек - пушится в отдельную ветку (мне так удобнее, чтобы всегда знать где актуальная версия) и от туда собирается в бинарь и деплоится на сервер
морда - собирается web, статика пушится в отдельную ветку, и от туда деплоится на сервер
Я не ответил на вопрос "можно ли прерывать операции Future"
Я почитал документации и пришел к выводу, что все-таки нет, нельзя...
Мне однажды нужно было похожее поведение, для этого я просто использовал метод порождающий стрим с async* и yield
(дефолтные методы стримов)[./streams]
Простая фабрика https://github.com/surfstudio/rigla-flutter/blob/_deploy_2.0.28/lib/ui/screen/products/presentation/screens/readout/cases/readout_loader.dart
Фабричный метод Абстрактная фабрика Строитель Прототип - https://github.com/surfstudio/rigla-flutter/blob/master-rigla/lib/ui/common/widgets/web/html/style/i_custom_style_builder.darti_cutom Одиночка - https://github.com/surfstudio/rigla-flutter/blob/master-rigla/lib/interactor/common/preferences/varioqub_config_holder.darti_cutom
Адаптер Мост Компоновщик Декоратор Фасад - https://github.com/surfstudio/rigla-flutter/blob/master-rigla/lib/interactor/navigation/navigation_interactor.dart Приспособленец Заместитель
Команда Итератор Посредник Хранитель Наблюдатель - https://github.com/surfstudio/rigla-flutter/blob/_deploy_2.0.28/lib/ui/screen/cart/elementory/cart/application/interactors/cart_interactor/features/manage_region.dart#L16 Посетитель Стратегия Состояние Шаблонный метод - https://github.com/surfstudio/rigla-flutter/blob/master-rigla/lib/ui/screen/products/presentation/screens/readout/cases/common/base_filtred_load.dart
Рефакторил корзину в ней очень много стримов, используется skip, merge, seeded, debounceTime, listen так же изучал основные методы в https://rxmarbles.com/_