Skip to content

Commit dde4632

Browse files
committed
di: improved text
1 parent ffe644b commit dde4632

1 file changed

Lines changed: 7 additions & 9 deletions

File tree

dependency-injection/cs/global-state.texy

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,29 +9,27 @@ Varování: Následující konstrukce jsou příznakem špatného návrhu kódu:
99
- `Article::setDb($db)`
1010
- `ClassName::$var` nebo `static::$var`
1111

12-
Vyskytují se některé z těchto konstrukcí ve vašem kódu? Pak máte příležitost k zlepšení. Možná si říkáte, že jde o běžné konstrukce, které vídáme i v ukázkových řešeních různých knihoven a frameworků.
13-
Bohužel, i přesto jsou jasným indikátorem špatného návrhu. Spojuje je jedno: používání globálního stavu.
12+
Vyskytují se některé z těchto konstrukcí ve vašem kódu? Pak máte příležitost k jeho zlepšení. Možná si říkáte, že jde o běžné konstrukce, které vídáte třeba i v ukázkových řešeních různých knihoven a frameworků. Bohužel, pak je jejich kód špatně navržený.
1413

15-
Nyní rozhodně nemluvíme o jakési akademické čistotě. Používání globálního stavu a singletonů má destruktivní dopady na kvalitu kódu. Jeho chování se stává nepředvídatelné, snižuje produktivitu vývojářů a nutí rozhraní tříd lhát o svých skutečných závislostech. Což mate programátory.
14+
Nyní rozhodně nemluvíme o jakési akademické čistotě. Tyto konstrukce spojuje jedno: používání globálního stavu. A ten má destruktivní dopad na kvalitu kódu. Třídy lžou o svých závislostech. Kód se stává nepředvídatelným. Což mate programátory a snižuje jejich produktivitu.
1615

17-
V této kapitole si ukážeme, jak je to možné.
16+
V této kapitole si vysvětlíme, proč tomu tak je a jak se globálnímu stavu vyhnout.
1817

1918

2019
Globální provázání
2120
------------------
2221

23-
Základní problém globálního stavu spočívá v tom, že je globálně přístupný. Díky tomu je třeba možné zapsat do databáze přes globální (statickou) metodu `DB::insert()`.
24-
V ideálním světě by měl být objekt schopen komunikovat pouze s jinými objekty, které mu byly [přímo předány |passing-dependencies].
25-
Pokud vytvořím dva objekty `A` a `B` a nikdy nepředám referenci z `A` na `B`, pak se ani `A`, ani `B` nemohou dostat k druhému objektu nebo změnit jeho stav.
26-
To je velmi žádoucí vlastnost kódu. Je to podobné, jako když máte baterii a žárovku; žárovka nebude svítit, dokud je nepropojíte drátem.
22+
V ideálním světě by měl být objekt schopen komunikovat pouze s objekty, které mu byly [přímo předány |passing-dependencies].
23+
Pokud vytvořím dva objekty `A` a `B` a nikdy nepředám referenci z `A` na `B`, pak se ani `A`, ani `B`, nemohou dostat k druhému objektu nebo změnit jeho stav.
24+
To je velmi žádoucí vlastnost kódu. Je to podobné, jako když máte baterii a žárovku; žárovka nebude svítit, dokud ji s baterií nepropojíte drátem.
2725

2826
To ale neplatí u globálních (statických) proměnných nebo singletonů. Objekt `A` by se mohl *bezdrátově* dostat k objektu `C` a modifikovat jej bez jakéhokoliv předání reference, tím, že zavolá `C::changeSomething()`.
2927
Pokud se objekt `B` také chopí globálního `C`, pak se `A` a `B` mohou navzájem ovlivňovat prostřednictvím `C`.
3028

3129
Použití globálních proměnných do systému vnáší novou formu *bezdrátové* provázanosti, která není zvenčí vidět.
3230
Vytváří kouřovou clonu komplikující pochopení a používání kódu.
3331
Aby vývojáři závislostem skutečně porozuměli, musí přečíst každý řádek zdrojového kódu. Místo pouhého seznámení se s rozhraním tříd.
34-
Jde navíc o provázanost zcela zbytečnou.
32+
Jde navíc o provázanost zcela zbytečnou. Globální stav se používá kvůli tomu, že je snadno odkudkoliv přístupný a umožňuje třeba zapsat do databáze přes globální (statickou) metodu `DB::insert()`. Ale jak si ukážeme, výhoda, kterou to přináší, je nepatrná, naopak komplikace to způsobuje fatální.
3533

3634
.[note]
3735
Z hlediska chování není rozdíl mezi globální a statickou proměnnou. Jsou stejně škodlivé.

0 commit comments

Comments
 (0)