Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

23. diel - Najčastejšie chyby Java nováčikov - Vieš pomenovať objekty?

V minulej lekcii, OOP v Jave naposledy - Boxing, balíčky a doplnenie, sme sa zaoberali balíčkami a ďalšími OOP konštrukciami.

V dnešnom Java tutoriále si ukážeme prvé dobré praktiky pre objektovo orientované programovanie v Jave. Pozri sa, či nerobíš jednu z najčastejších chýb.

Slovo senior programátora

David Čápka - Objektovo orientované programovanie v Jave

Gratulujem k zdolaniu základnej problematiky objektovo orientovaného programovania! 🏆 Dostal si sa k záchytnému bodu, v ktorom sa trochu vydýchame a ukážeme si, ako správne použiť nadobudnuté informácie, než sa pustíme do ďalších. Materiál pre dnešnú lekciu som zostavil na základe 20-ročných skúseností s programovaním a jej obsah bude mať zásadný vplyv na tvoje ohodnotenie na trhu práce.

Miliónové straty

O dobrých praktikách sme sa už bavili v kurze Základná konštrukcia jazyka Java a vieme, že neprehľadné programy nie sú žiadnou malichernosťou. Sú totiž:

  • Nezrozumiteľné pre ostatných - Keď tím 5 programátorov, každý s platom 5.000 € mesačne, strávi 20 % pracovnej doby lúštením kódu, stojí to ročne 60.000 €!
  • Náchylné k chybám - Tržby aj malých e-shopov sú mesačne obvykle v stovkách tisíc eur, 1 deň nefunkčnosti teda stojí majiteľa desiatky tisíc eur, dodávateľovi hrozia nemalé zmluvné pokuty.
  • Prakticky nerozšíriteľné - V súčasnej funkčnosti sa už nikto nevyzná a nemožno ju rozšíriť. Programátorský tím o niekoľkých ľuďoch musí vytvoriť aplikáciu znova, opäť sa pohybujeme v stovkách tisíc eur.
  • Netestovateľné, nezabezpečené a takto by sme mohli pokračovať.

Niet pochýb, že dobré praktiky sú pre vývoj softwaru v tíme úplne zásadné a následky ich porušenia potom úplne fatálne.

Ako správne pomenovávať triedy, atribúty a metódy?

Vieme vytvárať množstvo nových objektových konštrukcií, v programoch nám vzniká množstvo nových identifikátorov (mien). V dnešnej lekcii sa budeme zaoberať tým, ako "objektové súčiastky" našich aplikácií správne pomenovať, aby boli prehľadné.

Motivačný príklad

K doktorovi príde pacient a hovorí mu, že má problém so svojím orgánom Move. Nefunguje mu shoe. Pacient sa zdá byť nejaký popletený a doktorovi trvá pomerne dlho, kým z neho dostane, že ho pichá v päte a preto si nemôže obuť ani topánku. Keď konečne vypustí pacienta z ordinácie, zistí, že bol súčasťou skupiny a takých ich tam ešte čaká niekoľko desiatok.

Doktor - Objektovo orientované programovanie v Jave

Pozrime sa ešte na druhý príbeh. Programátorovi pridelí program, ktorý spadne s chybou v triede MoveData, metóda data(). Program sa zdá byť nejaký popletený a programátorovi trvá dlho, než zistí, že ide o triedu importujúcu dáta z externej zálohy a že sa prvýkrát musí ručne zavolať metóda work(), ktorá import vykoná. Keď chybu konečne opraví, objaví sa ďalšia a zistí, že v programe je niekoľko desiatok tried a metód, z ktorých názvu vôbec nezistí, čo robia.

Určite vidíme paralelu týchto dvoch príbehov. Zatiaľ čo u ľudského tela by nám asi nenapadlo hovoriť o orgáne "presúvať" a funkcii "topánka", v programoch bohužiaľ nie je taký problém naraziť na objekty pomenované ako deje a funkcie pomenované ako veci, aj keď je princíp úplne rovnaký. Niet divu, že si Indescriptive naming vyslúžilo svoje miesto v šestici najhorších programátorských praktík STUPID.

Pomenovanie tried

Triedy definujú objekty, z ktorých je aplikácia zložená. Z toho vyplýva niekoľko triviálnych pravidiel. Názvy tried:

  • sú podstatné mená! - Ide o jednotlivé počítateľné objekty bez ohľadu na to, koľko objektov od triedy potom vytvoríme.
  • nie sú názvy dejov - Ide o objekty (veci). Triedy teda nemôžeme nazvať napr. WorkWithFile alebo Printing, ale napr. FileManager alebo Printer (alebo ešte lepšie UserInterface, pretože málokedy tvoríme celú triedu len na vypísanie niečoho).
  • začínajú veľkým písmenom - Každé ďalšie slovo má veľké písmeno (notácia) PascalCase. Je tak vidieť, že ide o všeobecnú triedu a nie o jej konkrétnu inštanciu.
  • pomenované podľa toho, akú súčasť programu reprezentujú, čo nemusí byť vždy rovnaké, ako to, čo vo vnútri robia.

Ukážme si niekoľko príkladov:

✗ Nesprávne

class employee {
class Employees {
class Invoiceitem {
class WorkWithFile {
class Print {
class EnteringData {

✔ Správne

class Employee {
class EmployeeManager {
class InvoiceItem {
class FileDatabase {
class UserInterface {

Ak narazíte na program, kde sa trieda volá WorkWithFile, jeho autor si pravdepodobne len vygooglil, že kód sa píše do class bez toho, aby tušil, že tým založil nejaký objekt.

Triedy v množnom čísle

V množnom čísle pomenovávame triedy veľmi zriedka. V Jave takto nájdeme napr. triedu Arrays. Od tej nevytvárame inštancie a používame ju len pre prácu s inštanciami triedy Array, teda s poľami. Pole roztriedime napr. ako:

Arrays.sort(employees);

Osobne by mi dávalo oveľa väčší zmysel, aby tieto metódy mala na sebe priamo trieda Array a písali sme teda:

employees.sort()

Autori Javy pravdepodobne nechceli triedu Array príliš zložitú a tak pre niektoré metódy vytvorili túto druhú triedu. Výsledný prínos je diskutabilný. My triedy v množnom čísle väčšinou deklarovať nebudeme.

Pomenovanie tried v angličtine

Keď si doma programujete aplikáciu pre seba, môžete samozrejme používať slovenčinu. Kódy pokročilých aplikácií sú rovnako ako reálne obchodné aplikácie po anglicky. Pre anglické názvy tried platí samozrejme to isté, čo sme povedali vyššie. Môžeme však ľahko urobiť nasledujúce chyby:

  • Jednotné čísla - Keď v slovenčine pomenujeme triedu pracujúcu s autami SpravcaAut, mohol by sa ponúkať anglický preklad CarsManager. Správne je však CarManager, jednotné číslo, pretože Car tu funguje ako prídavné meno.
  • Poradie slov - Na rozdiel od slovenčiny je podstatné meno na konci súslovia, správca áut teda nie je ManagerCars alebo ManageCars, ale CarManager. Cesta k súboru nie je PathFile (čo by bol cestový súbor), ale FilePath a pod.

V angličtine sa pri triedach často používa koncovka -er, napr. TaskRunner, podľa toho, čo trieda robí.

Ukážme si pár príkladov:

✗ Nesprávne

class CarsManager {
class PathFile {
class RunTasks {

✔ Správne

class CarManager {
class FilePath {
class TaskRunner {

Pomenovanie atribútov

Atribúty sú "premenné" danej triedy. Pri ich pomenovaní teda platia tie isté zásady ako pre premenné, ktoré sme si už detailne vysvetľovali v lekcii Najčastejšie chyby Java nováčikov - Vieš pomenovať premenné?.

Základným pravidlom opäť je, že atribúty pomenovávame podľa toho, čo je v nich uložené. Názov atribútu chápeme v kontexte názvu triedy a nemusí teda dávať zmysel sám o sebe. Z jazykového hľadiska sú názvy atribútov:

  • podstatné mená (name, employees...)
  • prídavné mená (disabled, sent...)

Pripomeňme si tu aj zvyšné zásady:

  • všetky atribúty pomenovávame buď slovensky bez diakritiky alebo anglicky, ale nie kombináciou týchto jazykov
  • viacslovné atribúty pomenovávame pomocou notácie camelCase
  • ak atribút obsahuje kolekciu s viacerými hodnotami (napr. pole alebo List), je jeho názov v množnom čísle

Ukážme si opäť nejaké príklady názvov atribútov tried:

✗ Nesprávne

private String Name;
private boolean send;
private String[] phonenumbers;
private Button tlačidlo;
private Address[] uzivatelAddress;

✔ Správne

private String name;
private boolean sent;
private String[] phoneNumbers;
private Button tlacidlo; // ideálne button
private Address[] userAdresses;

Pomenovanie metód a parametrov

Metódy označujú deje, ich názov teda obsahuje sloveso! Môže ísť o:

  • rozkazovací tvar (loadImages(), setId()) - Metóda prevažne vykonáva nejakú činnosť a jej výsledok môže alebo nemusí vracať. Nevolíme infinitív alebo -ing tvar, napr. loading().
  • opytovací tvar - Metódou sa prevažne pýtame na nejakú hodnotu, väčšinou nejde o vykonanie akcie (napr. getRank() alebo isDisabled() pre premenné typu boolean.) Už vieme, že takýmto metódam hovoríme gettery.

Metódy pomenovávame podľa toho, čo robia! Vyhýbame sa neurčitým názvom ako work(), action(), run() a pod.

Ukážme si príklady:

✗ Nesprávne

public void printing(Customer customer) {
public boolean returnOn() {
private void data() {
public void work() {

✔ Správne

public void printInfo(Customer customer) {
public boolean isEnabled() {
private void generateData() {
public void importBackup() {

Parametre metód

Parameter metódy je premenná a preto pre jej názov platia tie isté pravidlá, ako pre premenné a atribúty (napríklad nikdy nepomenujeme parameter param:) ). Je tu však jedna dôležitá vec na zváženie a to je použitie dvojitej negácie. Ukážme si posledný príklad:

✗ Nesprávne

public void importData(boolean disableForeignKeys) {

importData(false);

✔ Správne

public void importData(boolean enableForeignKeys) {

importData(true);

Kto z vás dokáže povedať, či sú v prvom variante s odovzdaním hodnoty false kľúče povolené? Všetko je zas o ľudskom mozgu, ktorý nie je zvyknutý fungovať s dvojitou negáciou. Volíme teda skôr druhý variant.

V nasledujúcej lekcii, Ako správne rozdeliť Java aplikácie do tried - SRP a SoC, si vysvetlíme dobré praktiky SRP (Single Responsibility Principle) a SoC (Separation of Concerns). Načrtneme aj tému závislostí.


 

Predchádzajúci článok
OOP v Jave naposledy - Boxing, balíčky a doplnenie
Všetky články v sekcii
Objektovo orientované programovanie v Jave
Preskočiť článok
(neodporúčame)
Ako správne rozdeliť Java aplikácie do tried - SRP a SoC
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
23 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity