Monday, December 21, 2020

Saturday, December 5, 2020

Async Blazor

 While making quick dirty things in Blazor server-side app, don't drown with EventCallback<> for controls and calls of (awaited async) methods in markup like

@foreach (var item in GetItems())

. This causes UI to stop reacting to events and updating . Lamer's attempts of ConfigureAwait() didn't solve problems. Use props bound to markup and OnChanged Action<> as control property. Making event handler async or using GetAwaiter().GetResult() will hang:

<AccountSearch OnAccountSelected="OnAccountSelected" />

    private async void OnAccountSelected(int accountId)

    {

        _accountId = accountId;

        _bans = await DbUtils.LoadAccountBans(_sqlProvider, _accountId, _all);

        StateHasChanged();

    }


Tuesday, October 6, 2020

И вот опять (FlashCards)

   В мире 100500 афуенных вебфреймворков и доступного каждому девелопмента наблюдается отсутствие нормальных продуктов и броуновское движение бесполезного малоюзабельного треша. В своё время по какому-то обзору я наткнулся на FluxCards 1.x, которые работали ещё на 2м ведроиде. Меня устраивало почти всё, кроме того, что поиск сета для импорта из Quizlet давал очень непонятные результаты, но с горем пополам, сделав новый эккаунт на Quizlet, я накидал свежих сетов в FluxCards и был доволен. 

    Что сейчас? Захожу на Quizlet - какие-то непонятки уже и намеки о платном эккаунте. Ну, хоть импорт-экспорт сета по-старому пока доступен. 

    А вот приложения на ведре... FluxCards версии 2.4 - неюзабельный треш. Кто ща билдит пекедж с этим же лео*-именем, непонятно. UI другой, нихера не работает, нихера нет. А в гугли плее старая иконка и демки. Только апп вот "новый". Нам такого нового не надо, старое верните.

    AnkiDroid - смотрел ещё давно. ППЦ как был, так и остался. Сайт - да пофиг, на чём вы всё это делаете, вы импорт-экспорт дайте, батчи. Ваще тошно смотреть, первоклассник в плане юзабилити лучше бы сделал. Апп ни на 1й платформе, в т.ч. на PC, так и не заставил сет импортировать.

    Flashcards App - где-где там работа с Quizlet? В платной версии? Нафиг-нафиг.

    Ну, хоть само Quizlet-приложение ещё ладно, кое-как можно работать с ним примерно как со старым FluxCards, и сеты свои доступны.

    "Верной дорогой идёте, товарищи". В идиократию. Горе от ума какое-то сплошное.

Friday, June 5, 2020

И вот наконец

Я юзаю VS 2019 (Community Edition), ибо "так получилось". Правда, скачан свежий пиратский решарпер, но не главное. Что с ходу видно? Стало чего-то нового больше и лучше? Пока не заметил. А вот анимация в строке статуса (это как в MS Office версии с 2016й, наверное, буковки так плааааааавненько печатаются, прямо слева направо) и очень похожий на старый, но какой-то искривленный в плане usability для кейбордистов Find Dialog - это да, заметно. Хипстота, блеать! Дешевка.
P.S. С очередным апдейтом диалог поиска стал ещё глючнее в области комбика с проектами-путями!

Wednesday, April 22, 2020

Если (друг) EntityFramework оказался вдруг

           выполняющим операции на клиенте, подумайте, где явно и неявно используется IEnumerable<>. Компилятор не скажет вам, где использует LINQ extension methods для IEnumerable<>. И optionsBuilder.ConfigureWarnings(w => w.Throw(RelationalEventId. QueryClientEvaluationWarning)) ничего вам не скажет. Используйте IQueryable<>, и ваши ентити-операции типа Take(), Skip(), Count() лягут на DBMS,а не на backend app.

Thursday, April 9, 2020

"И тут я понял", как надо формочки лепить

        Только спустя много лет и проектов появилась идея, как нормальнее делать логику взаимосвязей значений для больших списков Use Cases, для фреймворков, где нет похожего. Долой дергающие друг друга мелкие обработчики OnChange контролов, сбинженых с пропертями business entity. Они, вместе с прочими мелкими методами, поналепленными для code reuse, приводят к непоняткам:
- не прослеживаются связи с конкретными Use Cases из спецификации
- maintainability отстой - давно думаю, что длинный метод и портянка на 1-2 экрана плотного кода, хоть на Domain Specific Language, лучше, чем куча коротких методов, длинные стеки вызовов и необходимость слегка повышенных способностей, чтобы охватить код в достаточном объёме.

        OnChange обработчик может быть 1 для всех контролов, и это вполне может быть единственный метод, содержащий всю калькуляционную или валидирующую логику entity. В цикле с ограниченно разумным числом повторений и бросанием ошибки при превышении, что позволит что-то поменять. Флаг(и) для отключения повторного вхождения через OnChange, равно как и рестарт вычислений как через OnChange, так и через break - этого может быть достаточно для всех случаев. Чем-то напоминает Angular(JS) с его рекалькуляцией пропертей модели?..

            Всё, что относится к бизнес-логике, должно быть плотно собрано в 1 место, и Use Cases должны чётко прослеживаться. Как это будет уживаться с вспомогательными операциями типа загрузки дочерних данных по OnChange какого-нибудь ChildObjectId navigation property, дело другое. Тут уже можно мелкие методы подергать из портянки. А рассовывание той же установки Enabled по разным методам - как сверять с Use Cases будем? Тесты писать?..

            Вышесказанное относится, скорее, к десктопным проектам, к тем же .NET WinForms. И так же относится к каким-нибудь MVP Presenter or any business logic class, куда вы вынесете логику из "View" (UI). Даешь сосредоточение логики в портянке на 1-2 экранах плотного кода. Долой мелкие методы