Kvalitní kód a jeho čitelnost
- více metriky pro “kvalitní kód” (musí splňovat, ale nestačí)
- dělá co má dělat
- je naprogramován rychle/levně
- splňuje emergentní vlastnosti
Vnější vlastnosti (od uživatele)
- korektnost … dělá co má
- použitelnost … jak rychle se uživatel naučí používat
- spolehlivost … jak často spadne
- integrita … zabránění neoprávněnému přístupu
- robustnost … chování při ztížených podmínkách
Vnitřní vlastnosti (od programátora)
- udržovatelnost … snadnost přidání nových funkcí
- flexibilita … úprava pro jiné než původně zamýšlené použití
- přenositelnost … běh v jiných prostředích
- znovupoužitelnost … kolik % můžeme použít i jinde
- čitelnost … čtení zdrojáků
- testovatelnost … nutné úsilí při tvorbě testů
- srozumitelnost … pochopení architektury
Formátování
- zkombinovat obojí je náročné (i drahé)
- vazba vlastností? vyžadují se navzájem? není nutné, požadavky se celkem doplňují
- př. špatný srozumitelnost → horší přidání funkcí → větší pravděpodobnost chybovosti
- software by měl být flexibilní (měnící se požadavky uživatelů), zároveň ale musí mít rozumnou míru, aby programátorům nedal moc zabrat
- čitelnost se nedá exaktně měřit a je subjektivní
- existují pouze doporučení
- nejvíce bychom se měli držet konzistentnosti (
tab
vsmezerník
, 2 vs 4,camelCase
vssnake_case
)- coding conventions
- celkově ovlivněno IDE
- zásadně ovlivňuje jazyk (jeho abstrakce atd.)
- to obvykle programátor neovlivní (dostane zadání)
- rozdělení metod (ty co se volají navzájem blízko u sebe)
- dělení do více souborů (co třída to soubor)
- délka řádku (do 80 dříve, do 120 dnes) - kvůli řetězení metod
- např. LINQ
Pojmenování
- jméno je nositelem informace
- krátké a výstižné (logicky to není easy vymyslet)
- dostatečně specifické
- jednoznačný (nemělo by jít vyložit 2 způsoby)
- mohou být i komplexní (pokud vyjádří přesně co mají)
- iterátory a zažitá jména (
i, j, k, it, iter
) - pracujeme-li s jednotkami (sekundy, dny, …) uvádíme je v názvu
public void Delay (int delaySec)
- vyhnout se magickým konstantám
- rozsahy - včetně obou, bez krajních hodnot, …
first, last
begin, end
Složité výrazy
- rozdělit na podproblémy ⇒ najdeme obecnejší, abstrakci
- De Morganovy zákony využít ke zjednodušení podmínek
Komentáře
- dvousečné
- pokud je kód dobře napsaný nepotřebuje moc komentovat
- naopak může vysvětlit optimlizační úpravy či jiné “hacky”
- dočasné komentáře (@TODO, @FIXME atd.), které zvýrazní IDE
Proměnné
- rozumné proměnné ⇒ zvýší čitelnost i udržitelnost
- rozsah platnosti
- oblast života (měla by být co nejkratší)
- každá deklarovaná by měla být použita
- do 16 znaků délky
- 1 proměnná = 1 účel
Techniky zvyšující kvalitu kódu
- v průběhu let ověřené metody jak psát kvalitní kód (jejich dodržení zaručí částečnou kvalitu)
- podstatná je sebekázeň
Defenzivní programování
- preventivní opatření před špatnými daty (všichni nám lžou, i my sobě)
- kontrola všeho z externích zdrojů (síť, UI, …)
- kontrola vstupních hodnot parametrů funkcí
- rozhodnutí co dělat při špatných datech
- zvýšení kvalita za cenu snížení čitelnosti
Info
Assertion
1 assert(delitel != 0);
2 assert(pocet <= MAXPOCET);
- součást pouze vývoje, nikoliv produkce
- minimalizace vzájemné závislosti komponent na sobě (ideálně žádná, ale v praxi nedosažitelné)
Info
KISS = keep it simple stupid
- obecně věci fungují dobře pokud jsou jednoduché
- komponenta by měla dělat 1 věc, ale pořádně