Redux a asynchronní akce: jak si zjednodušit stav aplikace

From IT-Core
Jump to navigation Jump to search

Častým problémem, na který narazíte, je asynchronní kód. Promise a async/await se chovají jinak než běžné funkce. Když nastavíte breakpoint uvnitř asynchronní funkce, mějte na paměti, že zásobník volání nemusí odpovídat tomu, co byste čekali v době, kdy se kód spustil. V takových případech pomáhá použít breakpoint přímo na řádku s await nebo využít funkci pro zpracování promise rejection v konzoli. Nikdy neignorujte červené chybové hlášky v konzoli – kliknutím na ně se dostanete přímo na místo v kódu, kde chyba vznikla.

Indexy: základ, který se vyplácí Nejčastější příčinou pomalých dotazů je chybějící index. Pokud ve WHERE klauzuli filtrujete podle sloupce, který není indexovaný, databáze musí projít celou tabulku. To je u velkých tabulek zničující. Vždy si ověřte, zda index odpovídá skutečným podmínkám. Například dotaz `SELECT * FROM objednavky WHERE zakaznik_id = 42 AND datum >'2024-01-01'` potřebuje složený index na oba sloupce, ne dva samostatné. Složený index funguje efektivně, pokud jsou sloupce v něm seřazené podle toho, jak je používáte v podmínce.

Shrnutě: testovací pyramida není dogma, ale vodítko. Přizpůsobte ji svému projektu – mikroslužby, monolit, nebo aplikace s bohatým UI budou mít jiné poměry. Klíčové je, aby testy byly rychlé, spolehlivé a dávaly smysl. Začněte s malou sadou, která pokrývá hlavní rizika, a postupně ji rozšiřujte. Uvidíte, že údržba testů bude snazší a chyby se začnou objevovat tam, kde je čekáte – a ne v produkci.

Nejčastější chyby v praxi a jak se jim vyhnout První chybou je psát jednotkové testy, které testují implementaci, ne chování. Když pak změníte vnitřní strukturu metody, testy se zbytečně rozpadnou. Zaměřte se na vstupy a výstupy, ne na to, jak je funkce napsaná. Druhým problémem je přehnané používání mocků – pokud mockujete vše, test pak neověřuje skutečnou spolupráci, ale jen vaše předpoklady. Používejte mocky jen pro hranice systému, jako je databáze nebo externí API.

Doporučuji zavést si pravidlo pro číslování verzí, které bude jasné všem členům týmu. Například hlavní číslo pro nekompatibilní změny, vedlejší pro přidání funkce a číslo opravy pro opravy chyb. Toto pravidlo by mělo platit pro všechny knihovny jednotně. Pokud máte více knihoven, které na sobě závisí, sledujte i jejich vzájemnou kompatibilitu. Vytvořte si jednoduchý seznam, který ukazuje, které verze knihoven spolu fungují. Tento seznam pak aktualizujte při každém novém vydání.

Druhým častým problémem je použití funkce na indexovaném sloupci. Když napíšete `WHERE UPPER(jmeno) = 'NOVAK'`, databáze nemůže index využít, protože musí nejprve transformovat hodnotu. Řešení je jednoduché: ukládejte data v normalizovaném tvaru (např. malými písmeny) nebo použijte funkční index, pokud to databáze podporuje.

Nakonec se vyplatí investovat čas do automatizace testů, které ověří, že projekt funguje s novou verzí knihovny. Před uvolněním nové verze knihovny spusťte testy všech projektů, které ji používají. Tím odhalíte případné problémy dříve, než se dostanou k uživatelům. Když se přesto stane, že nová verze knihovny rozbije projekt, mějte připravený postup pro rychlé vrácení zpět – ideálně pomocí reverze commitu. S tímto přístupem bude vaše verzování přehledné a projekty bez zbytečného chaosu.

Pozor na typické úskalí: pokud používáte middleware jako Redux Thunk, nezapomeňte, že akce typu pending, fulfilled a rejected jsou jen doporučené konvence. Můžete si je libovolně pojmenovat, ale musíte je důsledně používat. Častou chybou je míchání více stylů – někde přímo měníte stav, jinde spoléháte na middleware. To vede k nepředvídatelnému chování a stavu, který není deterministický.

Při práci na projektu, který využívá více vlastních nebo třetích stran knihoven, se dříve či později setkáte s problémem, jak správně verzovat kód. Nejde jen o to, že každá knihovna má vlastní číslo verze. Jde hlavně o to, aby se vzájemně neblokovaly a aby bylo možné se kdykoli vrátit k funkčnímu stavu. Základním pravidlem je oddělit verze knihoven od verze hlavního projektu. Pak můžete aktualizovat jednu knihovnu bez toho, abyste museli měnit celý projekt.

Pokročilé techniky, které vám ušetří čas Kromě klasických breakpointů vyzkoušejte podmíněné breakpointy – stačí kliknout pravým tlačítkem na číslo řádku a zvolit možnost přidat podmínku. Breakpoint se pak aktivuje pouze tehdy, když je splněna vámi zadaná podmínka, například když proměnná dosáhne určité hodnoty. To je neocenitelné při ladění cyklů nebo častých funkcí. Dalším užitečným nástrojem je watch expression – v panelu Watch si můžete přidat libovolný výraz, jehož hodnota se průběžně aktualizuje při každém kroku. Tím sledujete klíčové hodnoty bez nutnosti vypisovat je do konzole.