23. diel - Najčastejšie chyby VB.NET nováčikov - Vieš pomenovať objekty?
V dnešnom VB.NET OOP tutoriále si ukážeme prvé dobré praktiky pre objektovo orientované programovanie vo VB.NET. Pozri sa, či nerobíš jednu z najčastejších chýb.
Slovo senior programátora
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 Visual Basic (VB.NET) a vieme, že neprehľadné programy nie sú vôbec žiadna malichernosť. Sú totiž:
- Nezrozumiteľné pre ostatných - Keď tím 5 programátorov, každý s platom 100.000 Sk mesačne, strávi 20% pracovnej doby lúštením kódu, stojí to ročne 1.2 milióna Sk!
- Náchylné k chybám - Tržby aj malých e-shopov sú mesačne obvykle v miliónoch korún. 1 deň nefunkčnosti teda stojí majiteľa stovky tisíc Sk, 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, sme opäť v miliónoch Sk.
- Netestovateľné, nezabezpečené a takto by sme mohli pokračovať.
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
Presouvat
. Nefunguje mu Bota
. 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.
Pozrime sa ešte na druhý príbeh. Programátorovi pridelí program, ktorý
spadne s chybou v triede PresouvatData
, metóde
Data()
. Program sa zdá byť nejaký popletený a programátorovi
trvá dlho, než zistí, že sa jedná o triedu importujúcu dáta z externej
zálohy a že sa prvýkrát musí ručne zavolať metóda Pracuj()
,
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 nespozná, čo robia.
Určite vidíme paralelu týchto dvoch príbehov. Zatiaľ čo u ľudského tela by nás asi ťažko napadlo hovoriť o orgáne "Presúvať" a metóde "Bota", 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á! - Jedná sa 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.
PraceSeSouborem
aleboVypisovani
, ale napr.SpravceSouboru
aleboVypisovac
(alebo ešte lepšieUzivatelskeRozhrani
, pretože zriedka kedy 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. - sú pomenované podľa toho, akú súčasť programu reprezentujú - nemusí to byť vždy rovnaké, ako to, čo vo vnútri robia.
✗ Špatně
Class zamestnanec Class Zamestnanci Class Polozkafaktury Class PraceSeSouborem Class Vytiskni Class ZadavaniUdaju
✔ Správně
Class Zamestnanec Class SpravceZamestnancu Class PolozkaFaktury Class SouborovaDatabaze Class UzivatelskeRozhrani
Ak narazíte na program, kde sa trieda volá PraceSeSouborem
,
jeho autor si pravdepodobne len vygooglil, že kód sa píše do
Class
. Netušil, že tým založil nejaký objekt.
Triedy v množnom čísle
V množnom čísle pomenovávame triedy veľmi zriedka.
Napríklad v Jave takto nájdeme 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 zotriedime napr. ako:
Arrays.sort(zamestnanci);
Osobne by mi oveľa väčší zmysel dávalo, aby tieto metódy mala na sebe
priamo trieda Array
a písali sme teda:
zamestnanci.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
Základné kurzy sú na ITnetwork po slovensky, aby boli lepšie stráviteľné. Kódy tých pokročilých sú rovnako ako reálne obchodné aplikácie 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
SpravceAut
, mohol by sa ponúkať anglický prekladCarsManager
. Správne je všakCarManager
, jednotné číslo, pretožeCar
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
aleboManageCars
, aleCarManager
. Cesta k súboru nie jePathFile
(čo by bol cestový súbor), aleFilePath
a pod.
-er
, napr.
TaskRunner
, podľa toho, čo trieda robí.
Ukážme si pár príkladov:
✗ Špatně
Class CarsManager Class PathFile Class RunTasks
✔ Správně
Class CarManager Class FilePath Class TaskRunner
Pomenovanie atribútov
Atribúty sú "premenné" danej triedy. Pre ich pomenovanie teda platia úplne tie isté zásady ako pre premenné, ktoré si už detailne vysvetľovali v lekcii Najčastejšie chyby VB.NET 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á (
jmeno
,zamestnanci
, ...), - prídavné mená (
vypnuty
,odeslano
, ...).
- všetky atribúty pomenovávame buď česky 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.
✗ Špatně
Private String Jmeno; Private Boolean odeslat; Private String[] telefonnicislo; Private Button tlačítko; Private Address[] uzivatelAddress;
✔ Správně
Private String jmeno; Private Boolean odeslano; Private String[] telefonniCisla; Private Button tlacitko; Private Address[] adresyUzivatele;
Pomenovanie metód a parametrov
Metódy označujú deje, ich názov obsahuje teda sloveso ! Môže ísť o:
- prikazovací tvar (
Nacti()
,NastavId()
) - Metóda prevažne vykonáva nejakú činnosť a jej výsledok môže alebo nemusí vracať. Nevolíme infinitív, napr.Nacitat()
. - opýtací tvar - Metódou sa prevažne pýtame na nejakú
hodnotu, než aby sme chceli vykonať nejakú akciu (česky napr.
VratJmeno()
aleboJeVypnuty()
pre premenné typuBoolean
, anglicky napr.GetRank()
.) Už vieme, že takýmto metódam hovoríme gettery.
Pracuj()
, Akce()
, Run()
a pod.
Ukážme si príklady:
✗ Špatně
Public Sub Vypisovani(zakaznik As Zakaznik ) Public Function VratZapnuty() As Boolean Private Sub Data() Public Sub Pracuj()
✔ Správně
Public Sub Vypis(zakaznik As Zakaznik) Public Function JeZapnuty() As Boolean Private Sub VygenerujData() Public Sub ImportujZalohu()
Parametre metód
Parameter metódy je premenná, a preto pre ich 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 uváženie a to je použitie dvojitej negácie. Ukážme
si posledný príklad:
✗ Špatně
Public Sub ImportujData(zakazatCiziKlice As Boolean) ImportujData(False);
✔ Správně
public Sub ImportujData(povolitCiziKlice As Boolean) ImportujData(False);
Kto z vás na prvú dobrú 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ť pod dvojakou negáciou.
Volíme teda skôr druhý variant.
V nasledujúcom kvíze, Kvíz - Dedičnosť, statika, vlastnosti vo VB.NET OOP, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.