V dnešnom článku sa zameriame na osvedčené a užitočné tipy a triky pre tvorbu kvalitného kódu, ktoré aj u nás v msg life radi používame a ktoré ti pomôžu zlepšiť formátovanie, štruktúru, čitateľnosť aj funkčnosť tvojho Java kódu. Programovanie v Jave začne byť zábavné, keď už nebudeme musieť riešiť ako kód vyzerá, ale čo robí.
Programové knižnice používame preto, aby sme si nemuseli všetko vlastnoručne programovať.
Použi knižnice tretích strán iba ak je to nevyhnutné. Ak nie sú aktualizované, môžu byť v budúcnosti zdrojom zraniteľností kódu.
Používaj jeden testovací framework, nie viac. Napr. JUnit alebo TestNG.
Na simulovanie funkcionality v testoch odporúčame používať mockito.
Viaceré knižnice ponúkajú veľmi podobné metódy, vyber si jednu knižnicu a tú konzistentne používaj.
Formátovanie kódu
Správne formátovanie kódu je veľmi dôležité, lebo presné a konzistentné odsadenie spolu s vhodnými medzerami nám môže výrazne zjednodušiť čítanie a úpravu kódu.
Okolo operátorov píš vľavo aj vpravo jednu medzeru.
Nepoužívaj pre odsadenie tabulátory, ale medzery.
Dlhé riadky kódu rozdeľ do viacerých riadkov tak, že ďalší riadok začína operátorom.
Dodržiavaj konzistentne pravidlá formátovanie vo všetkých Java projektoch.
Využi vlastnosti moderných programovacích prostredí pri formátovaní kódu (napr. automatické formátovanie).
Balíčky (packages)
Packages sa používajú na organizovanie príbuzného a spolusúvisiaceho kódu.
Vždy používaj malé písmena v názvoch balíčkov.
Názov balíčka musí naznačovať jeho účel.
Balíčky organizuj logicky do hierarchickej štruktúry projekty.
Anotácie
Poskytujú dodatočné informácie je o kóde vo forme metadát.
Limitujeme používanie anotácií, aby bol kód čistejší.
Pri použití anotácie @Deprecated poskytni v javadoc komentári dôvod a aj alternatívu.
Anotácie @Nonnull a @Nullable používaj striedmo a podľa uváženia.
Anotáciu @VisibleForTesting používaj iba dočasne v testoch, keď potrebuješ rozšíriť prístupové práva z private na package private.
Komentáre
Majú zacieľ pomôcť vysvetliť kód, preto:
ak je kód písaný jednoduchým a zrozumiteľných štýlom, žiadne komentáre nie sú potrebné,
nepíš (ani negeneruj) žiadny javadoc pre getter(y) a setter(y),
pre (package) privátne metódy uprednostni implementačnú poznámku a vyhni sa písaniu javadoc.
Výnimky
Používame ich pri neočakávaných situáciách v kóde.
Používaj nekontrolované (unchecked) výnimky, aby bol kód flexibilnejší.
Používaj predpripravené typy výnimiek z JDK a vyhni sa vytváraniu vlastných.
Pomenovanie
Snažíme sa vyberať vhodné názvy, ktoré odzrkadľujú účel a význam jednotlivých častí programu.
Vo všeobecnosti sa vyhýbame skratkám a vyberáme zmysluplné mená.
Pre boolean premenné používame príslovky. Napr. disabled.
Pre ostatné typy a premenné používame podstatné mená. Napr. ArrayList (trieda), element (premenná).
Pre metódy používame slovesá. Napr. add, remove.
V názve sa snažíme naznačiť zámer metódy, napr. calculateSpeed.
Snažíme sa byť presný, napr. miesto všeobecnej premennej time pre ukladanie času v hodinách, lepšie je použiť timeInHours.
Vyhýbame sa akejkoľvek duplicite. Napr. miesto addElement(element), použijeme add(element).
Metódy
Metódy tvoria základnú jednotku kódu v Jave, a preto je dôležité dodržiavať osvedčené postupy pri ich písaní.
Metóda rieši iba jeden problém (dodržiavame Single Responsibility Principle), ale poriadne.
Každá metóda má jednoznačný jeden účel.
Dobre štruktúrovaný kód obsahuje krátke metódy a majú menej ako 15 riadkov. Ak je metóda dlhšia mal by na to byť dobrý dôvod.
Vyhýbame sa opakovaniu.
Vstup do metódy sa snažíme nemeniť a vypočítame výstup.
Ak musíme meniť aj vstupný parameter funkcie, naznačíme to v názve funkcie. Napr. funkcia začne prefixom update.
Využívame funkcionálne programovanie a moderné API.
Rozhrania
Rozhrania sú predpisy, ktoré treba implementovať v daných triedach, ktoré implementujú dané rozhranie.
Rozhrania nepoužívame, ak ich nepotrebujeme.
Ak rozhranie bude používať iba jedna trieda, použitie rozhrania stráca zmysel.
Pri rozhraniach používaj Interface Segregation Principle.
Rozhranie navrhujeme za istým špecifickým účelom, vyhýbame sa generickým rozhraniam.
Triedy
Triedy sú základné stavebné bloky každej aplikácie v Jave.
Každá trieda by mala spracovávať iba jeden špecifický koncept, alebo funkcionalitu.
Vyhýbame sa vytváraniu multifunkčných tried, ktoré robia všetko.
Rozhodni sa, či tvoja trieda bude zameraná na dáta, alebo na ich manipuláciu. Napr. dátová trieda udržiava stav (napr. Matrix). Trieda zameraná na prácu s dátami definuje správanie (napr. MultiplicationService).
Primárne používame privátne metódy. Public metódy iba v nevyhnutnej miere na interakciu objektu s vonkajším svetom.
V testoch nepoužívame protected prístup. Namiesto toho použijeme package private.
Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.