Pull to refresh
23
0
Виктор Лова @nsinreal

Пользователь

Send message
В typescript например, все не так радужно с ООП. Реюз возможен через HoC, а он порождает огромные проблемы с типизацией. Реюз возможен через миксины, но миксины заставляют дублировать интерфейс.
Да, действительно, будет каждый рендер создаваться новая функция в замыкании — это лишняя нагрузка на GC, что совсем не радует.
НО! То, что функция создается — еще не значит, что именно она будет использоваться. Здесь useCallback используется для мемоизации. И поэтому дочерние компоненты не будут зазря перерендериваться.
Ну вот примеры для redux-react-hook. Без прямых сравнений, увы. Просто, чтобы вы могли понять как это примерно выглядит.

Выдергивание стейта:
const Component = (props) => {
   const state = useMappedState(getStateWithMySelector);

   return (<></>)
}


Выдергивание стейта по параметризированному селектору:
const Component = (props) => {
   const todo = useMappedState(useCallback(
     state => state.todos.get(props.id),
     [props.id],
   ));

   return (<></>)
}


Диспатчинг:
const Component = (props) => {
  const dispatch = useDispatch();

  const handleClose = useCallback((event) => {
    dispatch(tryHideSnackBar({ snackId: props.id }));
  }, [props.id]);

   return (<></>)
}

Потому что хуки заменяют в том числе и connect.

Смешно это ваше "формализм", "матан".
REST скорее ближе к натуральным языкам — убогое, сирое, но в некоторых вещах работает лучше остального (stateless), а еще его все понимают (индустриальный стандарт).
Не стоит натягивать REST везде

Нет, он даёт использовать. Просто авторенейма нет

Не совсем. При компиляции вы точно получите ошибку, а авто-ренейм пока не реализован скорее специально, но его можно реализовать. Это конечно же доступно, только если вы не балуетесь форсированными кастами.

В typescript для этого есть keyof

Простите, я дилетант в этой теме и меня волнует один момент.

Весьма понятно с тем, как машина может победить в задании распознавания дорожных знаков — есть идеальная модель знаков и их расстановки.

Но в случае с болезнями все довольно трудно. Ведь нет никакой идеальной модели и только малое количество болезней могут подвергнуты однозначной классификации «болен / не болен». А реально нейросеть может обучаться только подражанию — т.е. некоторые варианты пневмонии она может пропустить из-за их отсутствия в базе. Также о многих болезнях мы можем судить только впоследствии (сначала скан, потом через полгода узнали реальную причину смерти) — это уменьшает количество доступных данных.

Как подобные трудности решаются? Или текущий статус подобных проектов — это фаза прототипа?
  • Обновлений практически нет — пример: всякие редакторы (редактор слайдов, графиков и т.д.) — необходимые ресурсы загружаются при инициализации; Перезагрузка не нужна.
  • Обновления происходят редко — пример: многие новостные порталы. Обновление делегируется браузеру (F5)
  • Предполагается короткое время жизни UI — пример: данные подгружаются в попапе, который будет закрыт через 10-30 секунд (попап сохранения в Google Drive). Перезагрузка не нужна.
  • Загрузка происходит слишком долго — пример: генерация контента на лету. Нужно не debounce делать, а показывать, что что-то грузится очень долго и блочить возможность повторных попыток. Натягивать это на стрим — можно, но не нужно
  • Общая несовместимость концепта с перезагрузкой данных — опять же, какой угодно редактор, который не предполагает shared editing.


Вы знаете, существует потрясно много задач, в которых не нужен debounce.
И блин, если вам нужны обновления, то вместо pull семантики многие используют push-семантику, где не нужен debounce
Омг, вам говорят про только одно значение, а вы говорите — а вот там извне будет много значений. Не, не будет. Потому что инструмент выбран соответственно задаче и нет соблаза изменить задачу под инструмент.
Не нужны большинство из них.
Ну или вам придется просветить меня: зачем debounce/throttle в семантике одного отложенного значения? Они же заточены под «множество» значений
Из диалога с вами ретируюсь, дальше без меня.
Вы слились, но я все же напишу, почему натягивать на Observable семантику Promise/Future — плохая идея. Остальным может быть полезно.

В вашем примере сломается и Фьюча, а вот Обсервабл как раз легко расширить на такой в ариант
Есть разница между «код, который не компилируется» и «код, который притворяется, что он работает».

Для использования Обсервабла в качестве Промиса/Фьючи никаких особых знаний о Скедулере иметь не нужно
А я ведь именно про скедулер вообще ничего не говорил. Я упомянул про hot/cold observables в контексте того, что Angular2+ явно проиллюстрировал проблему того, что никто не ожидал hot observables от HttpClient и не умел с ними работать.
примените оператор first (хоть прям по месту использования обсервабла).

Я об этом писал: «либо вы нарушаете семантику и рискуете в будущем получить неработоспособный код».
Для примера: иногда люди реализовывают для улучшения отзывчивости UI эмит закешированных данных + эмит настоящих данных с сервера. В таком случае ваш код с first будет работать некорректно. Особенно красиво это смотрится в развертке времени: сначал код с first, потом улучшение отзывчивости — кто виноват в неработспособности системы?

Используемый код получит Observable, который в случае возврата лишь одного значения эквивалентен Promise/Future. Не пишите чепухи, Observable — это обобщение любых асинхронных источников данных

В случае настоящего Observable вам резко становится интересно:
— а какая разница между switchMap и flatMap?
— а зачем нужны debounce и throttle?
— зачем в rxjs имеется 19 filtering-операторов, 23 transformation-операторов и 12 combination-операторов и что будет, если я не знаю каждый?
— что такое hot и cold Observables и как превратить hot в cold?
А код семантически получится эквивалентный Флутеру, никакой дополнительной когнитивной нагрузки rxJS от вас не потребует (если вам от неё нужно только то, что нужно от Флутера).

Это не так. Код, который продьюсит данные — он пожалуй, действительно, получится тем же самым. Но код, который использует данные — он получится совершенно другим.
В отличии от Promise/Future, Stream может содержать множество значений, даже бесконечность. И либо вы пишите код, который делает бесполезную работу (чтобы соблюсти семантику); либо вы нарушаете семантику и рискуете в будущем получить неработоспособный код.
Если вам не нужен FRP
Не то, чтобы мне не нужно было FRP. Мне не нужны текущие реализации FRP, потому что я не видел реализаций, совместимых с концепцией «понятно где и почему упало». К примеру, у промисов такая же проблема была долгое время, но в меньших масштабах. (Fluture тоже будет иметь такие же проблемы)

Помимо всего прочего, FRP выглядит просто на словах, но имеет дохрена тонкостей, которые раскрываются с каждым днем использования (сужу по rxjs). Мне кажется, что порог входа слишком высок, а область применения слишком мала.

не нужно пытаться убеждать себя, что и другим оно не нужно.
О, почти классика. Сначала вы обесценили опыт человека. Потом на едкое возражение «узкая область применения, чтобы это обесценивало чей-то опыт» вы выставляете виноватым опоннента в том, что он обесценивает FRP. Т.е. «все кто не используют FRP — дураки, а если кто не согласен, то он дурак». Прекрасная петля, почти как жопа Хэнка.
Вам явно не стоит хвастаться своей практикой.
Вы так говорите, как будто у FRP область применения шире, чем использование в академических статьях, pet-projectах и едких комментариях на хабре.

Если без шуток, то FRP преследует злой рок: даже там где он применяется, от него начинают потихоньку избавляться.
Я влезу со стороны, пожалуй:

  • Да, смартфон часто находится под рукой, но не у всех и не всегда;
  • На пульте ты кликаешь «увеличить громкость», а на смартфоне ты ждешь, пока прогрузится софтина для управления;
  • У некоторых людей нет смартфоно-зависимости и они не знают, где их смартфон (или он лежит в четко отведенном месте);
  • А еще смартфон может лежать на зарядке, которая может находиться вдали от пользователя;
  • Завязывать все на одно хрупкое устройство — ну так себе идея;
  • У многих смартфоны дешевого класса (ибо нах?) и они работают не очень хорошо для любых целей кроме «позвонить».
Именно поэтому при серьезном рефакторинге лучше сначала дописать недостающие unit-test'ы, а только потом вносить изменения способные все сломать
проверять значения нужно в другом тесте
Просто на фоне оригинального сообщения ваше сообщение интерпретируется так: вы хотите проверять еще что-то, чего нет в другом тесте. Извините за недопонимание.
Потом система поменяется и вместо эксепшена она будет возращать пустой конфиг, но все будут верить, что unit тестами она покрыта и более того tools, показывающие покрытие тестами будут утверждать, что все в порядке.

Ват? Вы тестами собираетесь проверять будущее поведение?

Information

Rating
Does not participate
Location
Харьков, Харьковская обл., Украина
Registered
Activity