UÄenà bez myÅ¡lenà je zbyteÄná práce; myÅ¡lenà bez uÄenà je nebezpeÄné.
Tyto triky použÃvali programátorÅ¡tà ninjové v minulosti, aby zostÅili mysl údržbáÅů kódu.
ZasvÄcenà recenzenti kódu je hledajà v testovacÃch úlohách.
ZaÄÃnajÃcà vývojáÅi je nÄkdy použÃvajà jeÅ¡tÄ lépe než programátorÅ¡tà ninjové.
PozornÄ si je pÅeÄtÄte a zjistÄte, kdo jste â ninja, zaÄáteÄnÃk, nebo snad recenzent kódu?
Mnozà lidé se snažà následovat cesty ninjů. Jen málokteÅà uspÄjÃ.
StruÄnost je dušà důvtipu
Snažte se napsat kód co nejkratÅ¡Ã. Ukažte vÅ¡em, jak jste chytÅÃ.
Nechte se vést jemnými prvky jazyka.
PodÃvejte se napÅÃklad na tento ternárnà operátor '?':
// pÅevzato z dobÅe známé JavaScriptové knihovny
i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
Hezké, ne? Budete-li takhle psát, zažije vývojáÅ, který narazà na tento Åádek a bude se snažit porozumÄt, jaká je hodnota i, veselé chvÃle. Pak pÅijde za vámi a bude žádat odpovÄÄ.
ÅeknÄte mu, že co je kratÅ¡Ã, to je vždy lepÅ¡Ã. ZasvÄÅ¥te ho do cest ninjů.
JednopÃsmenné promÄnné
Dao spoÄÃvá v bezeslovnosti. JedinÄ Dao správnÄ zaÄÃná a správnÄ konÄÃ.
Dalšà způsob, jak zkrátit kód, je vÅ¡ude použÃvat jednopÃsmenné názvy promÄnných, napÅ. a, b nebo c.
Krátká promÄnná se v kódu ztratà jako opravdový ninja v lese. Nikdo ji nebude moci najÃt pomocà funkce hledánà v editoru. A i kdyby ano, nedokáže ârozÅ¡ifrovatâ, co názvy a nebo b znamenajÃ.
â¦Je tady vÅ¡ak jedna výjimka. Opravdový ninja nikdy nepoužije i jako ÄÃtaÄ v cyklu âforâ. VÅ¡ude, jen ne tam. Jen se rozhlédnÄte kolem, existuje spousta exotiÄtÄjÅ¡Ãch pÃsmen, napÅ. x nebo y.
Exotická promÄnná jako ÄÃtaÄ v cyklu je obzvláštÄ půvabná, jestliže tÄlo cyklu zabÃrá 1-2 stránky (můžete-li, napiÅ¡te je co nejdelÅ¡Ã). Když se potom nÄkdo podÃvá hloubÄji do cyklu, nebude schopen rychle pÅijÃt na to, že promÄnná x je ÄÃtaÄ cyklu.
PoužÃvejte zkratky
Jestliže týmová pravidla zakazujà použÃvat jednopÃsmenné a vágnà názvy, zkracujte je. VytváÅejte zkratky.
TÅeba takto:
seznamâszn.uživatelskýAgentâua.prohlÞeÄâprhl.- â¦atd.
JedinÄ osoba s opravdu dobrou intuicà pak bude schopna takové názvy pochopit. Snažte se zkrátit vÅ¡echno. Jen úctyhodný ÄlovÄk pak bude moci podpoÅit vývoj vaÅ¡eho kódu.
Stoupejte vzhůru. BuÄte abstraktnÃ.
velký Ätverec nemá rohy
velkou nádobu neudÄláš hned
velký tón nenà slyšet
velká podoba je bez tvaru
Když volÃte název, snažte se použÃt co nejabstraktnÄjšà slovo. TÅeba obj, data, hodnota, prvek, element a podobnÄ.
-
Ideálnà název promÄnné je
data. PoužÃvejte jej vÅ¡ude, kde můžete. Každá promÄnná pÅece obsahuje nÄjaká data, ne?â¦Ale co když je název
datauž zabrán? Zkustehodnota, to je také univerzálnÃ. Koneckonců každá promÄnná nakonec bude mÃt nÄjakou hodnotu. -
Pojmenujte promÄnnou podle jejÃho typu:
ÅetÄzec,ÄÃsloâ¦Zkuste to. Mladý uÄednÃk se může divit â jsou takové názvy pro ninju opravdu užiteÄné? Ale ano, jsou!
JistÄ, takový název promÄnné stále nÄco znamená. ÅÃká, co promÄnná obsahuje: ÅetÄzec, ÄÃslo nebo nÄco jiného. Když se vÅ¡ak outsider pokusà porozumÄt kódu, bude pÅekvapen, že vidÃ, že název neobsahuje vlastnÄ vůbec žádnou informaci! A nakonec se mu nepodaÅà váš skvÄle promyÅ¡lený kód zmÄnit.
Datový typ promÄnné lze snadno odhalit pÅi ladÄnÃ. Ale jaký je význam promÄnné? Jaký ÅetÄzec nebo ÄÃslo je v nà uloženo?
Nenà způsob, jak to odhalit bez dobré meditace!
-
â¦Ale co když žádné dalšà takové názvy už nezbývajÃ? StaÄà pÅidat ÄÃslo:
data1, prvek2, element5â¦
Zkouška pozornosti
VaÅ¡emu kódu by mÄl porozumÄt jen skuteÄnÄ pozorný programátor. Ale jak to zajistit?
Jeden způsob â použÃvejte podobné názvy promÄnných, napÅ. datum a data.
SmÄÅ¡ujte je vÅ¡ude, kde je to možné.
Takový kód je pak nemožné rychle pÅeÄÃst. A když je nÄkde pÅeklep⦠Hmmm⦠Nadlouho nás to zdržÃ, udÄláme si pÅestávku na Äaj.
Chytrá synonyma
Tao, které se dá popsat slovy, nenà stálé Tao
jméno, které se dá jmenovat, nenà vÄÄné jméno
PoužÃvánà podobných názvů pro stejné vÄci Äinà život zajÃmavÄjÅ¡Ãm a ukáže publiku vaÅ¡i kreativitu.
Zvažte napÅÃklad prefixy funkcÃ. Jestliže funkce zobrazuje zprávu na obrazovce, zaÄnÄte jejà název zobrazâ¦, napÅ. zobrazZprávu. Pokud pak jiná funkce zobrazà na obrazovce nÄco jiného, tÅeba uživatelské jméno, zaÄnÄte jejà název vypiš⦠(napÅ. vypiÅ¡Jméno).
To naznaÄuje, že mezi tÄmito funkcemi je nÄjaký drobný rozdÃl, pÅestože ve skuteÄnosti žádný nenÃ.
DohodnÄte se s kolegy ninji z týmu: bude-li Honza pojmenovávat âzobrazovacÃâ funkce ve svém kódu zobraz..., pak Petr by mohl použÃvat vypiÅ¡... a Anna vykresli.... VÅ¡imnÄte si, nakolik se kód stane zajÃmavÄjÅ¡Ãm a rozmanitÄjÅ¡Ãm.
â¦A nynà pÅijde ten pravý trik!
Pro dvÄ funkce, mezi nimiž je důležitý rozdÃl, použijte stejný prefix!
NapÅÃklad funkce tiskniStránku(stránka) bude tisknout na tiskárnu. Ale funkce tiskniText(text) vypÃÅ¡e text na obrazovku. Nechte neznalého ÄtenáÅe, aby se zamyslel nad podobnÄ pojmenovanou funkcà tiskniZprávu: âKam tu zprávu vlastnÄ vytiskne? Na tiskárnu, nebo na obrazovku?â Aby to bylo opravdu úchvatné, tiskniZprávu(zpráva) by mÄla zobrazit zprávu v novém oknÄ!
PoužÃvejte opakovanÄ stejné názvy
když rozdÄlujeme jednotu,
objevujà se jména
pohromÄ se vyhneme,
jen když vÃme, kdy pÅestat
PÅidejte novou promÄnnou jen tehdy, když je to absolutnÄ nezbytné.
Jinak mÃsto toho opakovanÄ použÃvejte již existujÃcà názvy. Jen do nich zapisujte nové hodnoty.
Ve funkci se snažte použÃvat jedinÄ promÄnné, které byly pÅedány jako parametry.
DÃky tomu je opravdu tÄžké poznat, co vlastnÄ promÄnná obsahuje právÄ teÄ. A také, odkud to pÅiÅ¡lo. CÃlem je procviÄit intuici a pamÄÅ¥ ÄlovÄka, který Äte kód. Osoba se slabou intuicà bude muset analyzovat kód Åádek po Åádku a stopovat zmÄny v každé vÄtvi.
PokroÄilá varianta tohoto pÅÃstupu je utajenÄ (!) nahradit hodnotu nÄÄÃm podobným uvnitÅ cyklu nebo funkce.
NapÅÃklad:
function ninjovaFunkce(elem) {
// 20 Åádků kódu pracujÃcÃho s elem
elem = clone(elem);
// 20 dalÅ¡Ãch Åádků kódu, které nynà pracujà s klonem promÄnné elem!
}
Kolega, který bude chtÃt pracovat s promÄnnou elem ve druhé polovinÄ funkce, bude pÅekvapen⦠Teprve pÅi ladÄnà po prozkoumánà kódu pÅijde na to, že pracuje s klonem!
Toto je v kódu Äasto vidÄt. Je to hrozivÄ efektivnà i proti zkuÅ¡enému ninjovi.
Legrace s podtržÃtky
UmisÅ¥ujte pÅed názvy promÄnných podtržÃtka _ a __. NapÅÃklad _jméno nebo __hodnota. Bude to legrace, když budete jejich význam znát jenom vy. Nebo jeÅ¡tÄ lépe: pÅidávejte je jen pro legraci, aniž by mÄla nÄjaký konkrétnà význam. Nebo aÅ¥ majà na různých mÃstech různé významy.
Zabijete dvÄ mouchy jednou ranou. Za prvé, kód se prodloužà a stane se ménÄ Äitelným, a za druhé, kolega vývojáŠmůže strávit dlouhou dobu zjišťovánÃm, co vlastnÄ ta podtržÃtka znamenajÃ.
Elegantnà ninja na jednom mÃstÄ kódu podtržÃtka vkládá a na jiných se jim vyhýbá. DÃky tomu je kód jeÅ¡tÄ zranitelnÄjšà a zvyÅ¡uje se pravdÄpodobnost budoucÃch chyb.
Ukažte svou lásku
Dejte každému vÄdÄt, jak úžasné jsou vaÅ¡e entity! Názvy jako superElement, megaRámec nebo pÄknýPrvek ÄtenáÅe zaruÄenÄ osvÃtÃ.
JistÄ, na jednu stranu musÃte nÄco napsat: super.., mega.., pÄkný... Ale na druhou stranu to neposkytuje žádné detaily. ÄtenáŠse může rozhodnout hledat jejich skrytý význam a strávit meditacà hodinu nebo dvÄ své placené pracovnà doby.
Dejte každému vÄdÄt, jak úžasné jsou vaÅ¡e entity! Názvy jako superElement, megaRámec nebo pÄknýPrvek ÄtenáÅe zaruÄenÄ osvÃtÃ.
PÅekrývejte vnÄjšà promÄnné
Kdo je na svÄtle, nevidà nic, co je ve tmÄ.
Kdo je ve tmÄ, vidà vÅ¡echno, co je na svÄtle.
PoužÃvejte stejné názvy pro promÄnné vnÄ a uvnitÅ funkce. Je to jednoduché. Nenà tÅeba úsilà k vymýšlenà nových názvů.
let uživatel = autentikujUživatele();
function renderuj() {
let uživatel = jináHodnota();
...
...mnoho Åádků...
...
... // <-- programátor zde chce pracovat s uživatelem a...
...
}
Programátor, který skoÄà dovnitÅ funkce renderuj, si pravdÄpodobnÄ nevÅ¡imne, že v nà je lokálnà promÄnná uživatel, která zastiÅuje tu vnÄjÅ¡Ã.
Pak se pokusà pracovat s promÄnnou uživatel pÅedpokládaje, že je to externà promÄnná, která je výsledkem volánà autentikujUživatele()⦠A past sklapne! Nazdar, debuggereâ¦
Všude vedlejšà efekty!
Existujà funkce, které vypadajÃ, jako by nic nemÄnily. NapÅÃklad jePÅipraven(), ovÄÅOprávnÄnÃ(), najdiZnaÄky()⦠PÅedpokládá se, že provedou výpoÄty a najdou a vrátà data, aniž by mÄnily cokoli mimo nÄ. Jinými slovy, bez âvedlejÅ¡Ãch efektůâ.
Opravdu krásný trik je pÅidat do nich kromÄ hlavnÃho úkolu jeÅ¡tÄ nÄjakou âužiteÄnouâ akci navÃc.
Pohled na pÅekvapenou tváŠvaÅ¡eho kolegy, který zjistÃ, že funkce pojmenovaná je.., ovÄÅ.. nebo najdi.. nÄco mÄnÃ, zaruÄenÄ posune hranice vaÅ¡eho rozumu.
Dalšà cestou, jak pÅekvapit, je vrátit nestandardnà výsledek.
PÅedveÄte své originálnà myÅ¡lenÃ! Nechte funkci ovÄÅOprávnÄnà vrátit nikoli true/false, ale složitý objekt s výsledky ovÄÅenÃ.
VývojáÅi, kteÅà se pokusà napsat if (ovÄÅOprávnÄnÃ(..)), se budou divit, proÄ to nefunguje. ÅeknÄte jim: âPÅeÄtÄte si dokumentaci!â A dejte jim odkaz na tento Älánek.
Silné funkce!
Velké Tao se rozlévá, kam chce
Neomezujte funkci na to, co je uvedeno v jejÃm názvu. RozÅ¡iÅte se.
NapÅÃklad funkce zkontrolujEmail(email) by mohla (kromÄ kontroly, zda email je správnÄ) zobrazit chybovou zprávu a požádat uživatele, aby email zadal znovu.
PÅidané akce by nemÄly být zÅejmé z názvu funkce. Opravdový ninja je uÄinà nezÅejmými dokonce i z kódu.
Spojenà nÄkolika akcà do jedné ochránà váš kód pÅed opakovaným použitÃm.
PÅedstavte si, že jiný vývojáŠbude chtÃt jen zkontrolovat email a nevypisovat žádnou zprávu. VaÅ¡e funkce zkontrolujEmail(email), která dÄlá obojÃ, mu pak nebude vyhovovat. NepÅekazà tedy vaÅ¡i meditaci tÃm, že se na ni bude ptát.
ShrnutÃ
VÅ¡echny výše uvedené âradyâ pocházejà ze skuteÄného kódu⦠NÄkdy byl dokonce napsán zkuÅ¡enými vývojáÅi. Možná jeÅ¡tÄ zkuÅ¡enÄjÅ¡Ãmi, než vy ;)
- Když budete dodržovat nÄkteré z nich, bude váš kód plný pÅekvapenÃ.
- Když budete dodržovat mnohé z nich, bude váš kód opravdu jen váš a nikdo ho nebude chtÃt mÄnit.
- Když budete dodržovat vÅ¡echny, bude váš kód cennou lekcà pro mladé vývojáÅe toužÃcà po osvÃcenÃ.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)