Django signály

Nemám v úmyslu zde podrobně popisovat, jak signály fungují. Od toho tu je dokumentace. Chci pouze upozornit, že existují, lze je šikovně využít, ale taky si s nimi lze nadrobit na problémy.

K čemu signály jsou? Jednoduše k decoupling. Zrušení závislostí v kódu. Představme si to na ukázce, třeba typu e-shopu:

E-shop se skládá ze spoustu menších aplikací a každá dělá jednu svou věc. Jedna z těchto aplikací jistě bude napojení na platební bránu. Po zaplacení platby ale určitě nebude stačit pouze upravit v databázi stav platby, ale bude chtít také změnit stav objednávky, poslat zákazníkovi informaci o stavu, odeslat informace na sklad, … a spoustu dalších věcí záležící dle konkrétního e-shopu.

Klasicky by v appce payment musel být kód, který bude importovat ostatní appky e-shopu a volat jejich metody. Co se právě stalo? Appka payment není univerzální. Nejde ji dát do odděleného repozitáře a využít jinde. Je navždy spojena s konkrétním kódem e-shopu.

Jak by to vypadalo se signály? V payment appce se definuje signál, který se bude vyvolávat při změně platby. Ostatní appky budou na tento signál pouze vyčkávat. Tím bude platební modul přenositelný i do jiných aplikací. Sice je pravda, že nyní je situace opačná – ostatní appky jsou závislé. Ale… tak je to přeci správně, ne? :-)

Pro inspiraci – na BOObook.cz o produktech, krom základních atributů jako název či cena, žádná jiná appka nic neví. Nemusím tak nikde natvrdo psát, aby se po zaplacení zákazníkovi knihy zapsaly do knihovničky či poslaly mailem. Jednoduše se v appce ebook čeká na spuštění signálu o zaplacenosti a poté se zde zařídí vše potřebné.

Tím jsem docílil toho, že mohu vzít kód e-shopu krom produktů, napsat novou definici produktů třeba na zubní pasty a vše mi bude fungovat. Aniž bych musel cokoliv jiného měnit. Skvělé!

Podobně s fakturačním modulem. Nikde nevolám invoice.create_invoice(...), místo toho fakturační modul čeká na ten správný signál. Tím mohu mít dva fakturační moduly (jeden velmi základní a jeden komplexní s napojením do účetnictví) a zaměnit je dle libosti bez úpravy kódu. Dle toho, o který si zákazník řekne.

Než se ale vrhnete do zkoušení – signály nejsou řešením pro všechno. Je potřeba se zamyslet, zda využití signálu bude opravdu užitkem. Aspoň určitě se budete důkladně zamýšlet, až začnete hledat první bugy v těchto úsecích kódu. Není to zábava. :-) Nadměrné použití signálů také ztíží čitelnost kódu, protože už nebude jasné, kdy se co volá. Takže opatrně s nimi!