Přejít k navigační liště

Zdroják » Zprávičky » JSTraits – znovupoužití kódu bez dědičnosti v JavaScriptu

JSTraits – znovupoužití kódu bez dědičnosti v JavaScriptu

Zprávičky JavaScript, Různé

Pokud jste někdy tvořili složitější hierarchii tříd, možná jste zažili situaci, kdy se dostaly do sporu dva úkoly dědičnosti – vyznačení struktury objektů a využití již jednou napsaného kódu. Výsledkem byla pravděpodobně buď „pokřivená“ hierarchie, nebo opakování částí kódu na více místech.

Podobným situacím v JavaScriptu nyní můžete zabránit pomocí knihovny JSTraits. Ta umožňuje do tříd vkládat tzv. traits – znovupoužitelné soubory metod s popisem požadavků na objekt, do kterého jsou vkládány, a nabízené funkcionality. Traits tak ve výsledku umožňují využít jednou napsaný kód ve více třídách, aniž by bylo potřeba je propojovat pomocí dědičnosti.

Jednoduchý příklad použití knihovny najdete na Ajaxianu. Článek Traits: A Mechanism for Fine-grained Reuse pak nabízí podrobnější teoretický pohled na traits a porovnání tohoto mechanismu s dalšími způsoby znovupoužití kódu (jednoduchá/mno­honásobná dědičnost a mixins).

Komentáře

Odebírat
Upozornit na
guest
4 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
Zobrazit všechny komentáře
Ladislav Thon

Pokud vím, dědičnost jako prostředek znovupoužití kódu je nedoporučovaná praktika :-), a z vlastní zkušenosti můžu říct, že pokud se dědí kvůli znovupoužití přes víc než jednu úroveň, začne být kód hodně nepřehledný a dost obtížně rozšiřitelný.

Jinak ten článek si určitě přečtu, ale do té doby bych se zeptal: je nějaký rozdíl mezi mixiny a traity? Mixiny jsou třeba v Ruby a traity ve Scale, ale já žádný rozdíl nevidím.

David Majda

Pokud vím, dědičnost jako prostředek znovupoužití kódu je nedoporučovaná praktika :-)

Ano, to je. Hodně lidí ale myslí, že znovupoužití kódu je primárním účelem dědičnosti, a používá ji tak.

Jinak ten článek si určitě přečtu, ale do té doby bych se zeptal: je nějaký rozdíl mezi mixiny a traity? Mixiny jsou třeba v Ruby a traity ve Scale, ale já žádný rozdíl nevidím.

Různí lidé tím často míní různé věci, což dost mate. Sám jsem na to narazil při učení na státnice před pár měsíci. Podle článku je to takto:

Mixin je soubor metod. Ty mohou dělat všechno, jako normální metody třídy, tedy i přistupovat ke stavu objektu (k jeho atributům). Vložení mixnu do třídy znamená, že se jakoby (a v některých implementcích i doopravdy, byť většinou neviditelně) vytvoří nová třída, obsahující metody původní třídy a k nim metody mixinu. Jinak řečeno, mixins fungují přesně jako vkládání modulů v Ruby.

Problém nastane v situaci, kdy jsou vložené mixiny nějakým způsobem konfliktní (např. přepisují stejný atribut objektu nebo obsahují stejně nazvanou metodu). Tyto konflikty se řeší implicitně pomocí mechanismu dědičnosti – v případě atributů to znamená, že se neřeší nic; v případě metod to znamená, že platí pozdější definice. Díky dědičnosti může super v metodě mixinu odkazovat na metodu v nadtřídě, ale také na metodu definovanou ve dříve vloženém mixinu. Důsledkem toho všeho je kromě možných chyb také závislost na pořadí vložení mixinů.

Trait je také soubor metod, ale navíc je doplněn o seznam metod (a případně jejich signatur – to závisí především na tom, jak daný jazyk zachází s typy), které tyto metody potřebují od objektu, do kterého budou vloženy. Metody samy nemají přístup ke stavu objektu, ten mohou zjistit jen nepřímo pmocí metod ze seznamu. Vložení metod do objektu neprobíhá pomocí mechanismu dědičnosti. Konflikty (zde jen stejně nazvané metody) je možné řešit pomocí aliasů (např. „vlož mixin A, jeho metodu x zveřejni ve třídě jako metodu y a jako požadovanou metodu z mu podstrč metodu w původního objektu“).

Cena traits je hlavně v jejich větší striktnosti, což zabraňuje konfliktům, a nepoužití mechanismu dědičnosti k jejich vkládání a řešení konfliktů.

Ladislav Thon

Moc díky za detailní odpověď. Vás je radost číst :-)

David Majda

Ještě bych doplnil, že místo článku odkázaného ve zprávičce je pro hlubší pochopení problematiky asi lepší článek Traits: Composable Units of Behavior. Obsahuje méně zbytečné teorie a jde více „k věci“.

EmDash: Duchovní nástupce WordPressu, který řeší bezpečnost pluginů

Cloudflare přichází s ambiciózním projektem EmDash, který chce přepsat pravidla správy webového obsahu a nahradit dlouholetou dominanci WordPressu. Nový open source CMS, vytvořený za pouhé dva měsíce s pomocí AI, sází na moderní architekturu, důraz na bezpečnost i monetizaci a řeší klíčové problémy, které WordPress provázejí už desítky let.

Project Glasswing: Anthropic mění pravidla kybernetické bezpečnosti

AI
Komentáře: 0
Nový AI model Claude Mythos Preview dokáže autonomně nacházet bezpečnostní díry v každém hlavním operačním systému i prohlížeči – včetně zranitelností starých desítky let, které přežily miliony automatizovaných testů. Anthropic se rozhodl tuto schopnost nasadit jako nástroj obrany a svolal koalici dvanácti technologických gigantů – od Amazonu přes Microsoft až po JPMorganChase. Se závazkem 100 milionů dolarů a přístupem pro více než 40 organizací spravujících kritickou infrastrukturu je Project Glasswing závodem s časem: zajistit, aby obránci byli s těmito schopnostmi dřív než útočníci.

Git Worktree + Claude Code: paralelní vývoj a AI agenti ve více větvích najednou

Git worktree posouvá práci s větvemi na úplně jinou úroveň – místo neustálého přepínání a stashování nabízí paralelní pracovní prostředí nad jedním repozitářem. V kombinaci s nástroji jako Claude Code navíc otevírá dveře k běhu více AI agentů současně, každý izolovaně ve své větvi, bez kolizí a zbytečné režie.