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!