Navrhujeme triedy: Rodné čísla

V jeden fiktívny deň vo fiktívnej firme prišiel k fiktívnemu vývojárovi fiktívny zákazník a riekol mu úplne nefiktívne a natvrdo:

Feri, chcem mať systém na evidenciu rodných čísiel.

Feri riekol:

“Huh?”

Čím chcel naznačiť, že potrebuje od šéfa o niečo viac informácií. Napríklad potrebuje zisťovať, čo všetko šéf od systému očakáva, resp. aké predstavy (nepliesť s halucináciami) by mu mal naplniť.

Ta mám tu zoznam rodných čísiel v textáku. Potrebujem zistiť, či sú správne, teda či tam nie sú nejaké debility, potrebujem zistiť dátum narodenia každého človeka. A ešte pohlavie: teda či je to mužské alebo ženské rodné číslo. Aha: potrebujem získať zoznam rodných čísiel aj s lomkou, aj bez.

Feri riekol:

“OK?”

Návrh tried

Keďže sme v objektovo-orientovanom svete, je dobré začať návrhom tried, ich metód a následne inštančných premenných.

Tu sa dá použiť rada starej matere (či skôr starého otca, keďže pochádza zrejme od Bertranda Meyera):

Ak máte text požiadaviek od zákazníka, identifikáciu tried začnite tým, že podčiarknete podstatné mená.

Poďme na to: zoznam [rodných čísiel], rodné číslo, texťák, debilita, dátum narodenia, človek, pohlavie, lomka

Predovšetkým vyhoďme všetky podstatné mená, ktoré už pod pohľadu nedávajú zmysel: napr. tá “debilita” je ale debilita, však? Ale to len na prvý pohľad, hneď sa k nej vrátime.

Identifikácia tried cez identifikáciu operácií

Pre každé podstatné meno, ktoré je kandidátom na triedu, by sme mali jasne identifikovať, aké operácie bude poskytovať. Na triedu sa možno pozerať ako na čiernu skrinku, ktorej útroby nevidíme a ani nás netrápia: dôležité je, aby sme vedeli, aké možnosti poskytuje a čo od nej očakávať. Pri vypínači svetiel sa asi tiež nechceme babrať s káblikmi: chcem od neho len to, aby sa zapol a vypol.

Pri návrhu každej triedy je najdôležitejšie vedieť, aké operácie / služby / schopnosti vie poskytnúť. Ešte inými slovami, dôležité je určiť zodpovednosti triedy v systéme. Trieda, ktorá nevie “nič”, teda nemá žiadne schopnosti, je nešťastná trieda a zrejme by v systéme nemala byť.

Až v druhom rade pristúpime budeme meditovať nad tým, akým spôsobom bude trieda svoje operácie uskutočňovať.

Opäť staré matere:

  1. ČO?: čo má trieda robiť?
  2. AKO akým spôsobom to bude robiť?

Identifikácia operácií je prvý bod. O druhom si povieme o niečo neskôr.

Prvou triedou v zozname je zoznam rodných čísiel, ale do chvíle, kým nevieme, čo presne je rodné číslo, nemá zmysel sa ním zapodievať. Odložme ho na potom a zoberme si:

Rodné číslo

Očividne je to jadro celého vymysleného projektu: v zákazníkových predstavách sa spomína takmer v každej vete. Trikrát. Aké schopnosti vie poskytnúť rodné číslo? Keď vám niekto povie: 861210/4252, čo z neho viete vyčítať? A čo z toho potrebuje zákazník?

Vieme z neho vyčítať dátum narodenia: dvanásteho októbra 1986. Dokonca vieme zistiť, či je to muž alebo žena: ženám sa k mesiacu pripočítava 50 — napr. žena narodená v rovnakom dni by mala prvých 6 cifier 866210. Z toho logicky vieme usúdiť, či rodné číslo nenesie blbosti: 861732/4252 je somarina, lebo patrí človeku narodenému 32. sedemnásty 1986 (a nie, žiadne kongruencie tu nefungujú, ktoré spôsobia, že 17. mesiac je vlastne piaty.) Na kontrolu základnej korektnosti rodného čísla mysleli už otcovia zakladatelia tohto identifikátora: celé rodné číslo musí byť deliteľné jedenástimi…. a rodné číslo z príkladu nie je!

Prečítajme si znovu požiadavky zákazníka:

  • ten chce zistiť, či sú správne / či tam nie sú debility — to sme pokryli úvahou o deliteľnosti.
  • dátum narodenia: to sa dá tiež.
  • pohlavie: vyplýva z úvahy o pripočítavaní päťdesiatky.
  • a výpis s lomkou a bez lomky.

Ďalšia bájka starej matere hovorí, že objekt je vec, ktorej sa dajú posielať správy. Prenesene: skúsme objektu písať liebesbriefy:

“Milé rodné číslo 861732/4252, povedz mi, či si korektné / správne / nedebilné.”

“Milé rodné číslo 861732/4252, povedz mi, dátum narodenia, ktoré v sebe nesieš.”

“Milé rodné číslo 861732/4252, povedz mi, či patríš žene alebo mužovi.”

“Milé rodné číslo 861732/4252, vypíš sa mi s lomkou.”

“Milé rodné číslo 861732/4252, vypíš sa mi bez lomky.”

“Milé rodné číslo 861732/4252, daj mi milíón eur..”

Dokáže rodné číslo poskytnúť všetky tieto operácie? Zjavne áno — až na tú poslednú, to je frflanie úbohého vývojára.

Ale končí čas liebesbriefov, čas programovať!

Metódy rodného čísla

Každej operácii bude zodpovedať jedna metóda triedy. Úvahy však nekončia: pre každú operáciu musíme povedať, aké má mať vstupy (ak vôbec nejaké potrebuje), a čo má byť jej výsledkom.

“Milé rodné číslo 861732/4252, povedz mi, či si korektné / správne / nedebilné.”

Potrebuje táto operácia nejaké dodatočné dáta? Nie. Čo má byť výsledkom? “ÁNO” / “NIE”, teda nejaká pravdivostná (booleovská) hodnota.

V Jave by vyzerala hlavička metódy nasledovne:

boolean jeValidne()

“Milé rodné číslo 861732/4252, povedz mi, dátum narodenia, ktoré v sebe nesieš.”

Táto operácia nepotrebuje opäť žiadny vstup a výsledkom je … nejaký objekt reprezentujúci dátum. V Jave sa na to ideálne hodí trieda java.util.Date.

Date dajDatumNarodenia()

“Milé rodné číslo 861732/4252, povedz mi, či patríš žene alebo mužovi.”

Toto je celkom švandovné. Operácia nepotrebuje žiadne vstupy, ale čo má byť výstup? Reťazec "MUŽ" alebo "ŽENA"? Tu načrime do skúseností veteránov návrhu… a dospejeme k tomu, že návratovou hodnotou môže byť pravdivostná hodnota. Akurát je treba vyriešiť rodové spory: bude true pre muža a false pre ženu alebo naopak? Rozseknem gordický uzol mečom mužského ega a poviem:

boolean jeMuž()

Samozrejme, dali by sa uviesť obe metódy: lenže opäť zásada starej matere: trieda by mala mať čo najmenej metód. Takéto “convenience methods”, teda metódy pre pohodlie vývojára sú síce skvelé, ale v tomto prípade na ňu neexistuje racionálny dizajnový dôvod.

“Milé rodné číslo 861732/4252, vypíš sa mi s lomkou.”

“Milé rodné číslo 861732/4252, vypíš sa mi bez lomky.”

Toto je jednoduché: žiaden vstup a výstupom je reťazec.

String toStringWithSlash()
String toStringBezLomky()

V Jave je to kúzelné: keďže každý objekt má metódu toString(), ktorá vráti človekom pochopiteľnú reprezentáciu, stačí sa rozhodnúť, či sa bude správať ako variant s lomkou (a druhú metódu urobíme doslovne), alebo bez lomky. Opäť zásah zhora: 861732/4252 je oveľa čitateľnejšie než 8617324252, čiže toto bude robiť metóda toString() a verzia bez lomky bude chápaná samostatnou metódou.

Zhrnutie metód rodného čísla

V Jave by sme si teda mohli navrhnúť celú triedu:

class RodneCislo {
    boolean jeValidne()
    Date dajDatumNarodenia()
    boolean jeMuž()
    String toString()
    String toStringBezLomky()
}

Toto však nie je trieda: je to len zoznam metód v pajazyku, dokonca s slovgličtinárskymi názvami metód.

Pomenovanie je dôležité a súvisí s liebesbriefmi, ktoré boli spomínané vyššie.

Objekt v OOP možno chápať ako “hmatateľnú” vec, ktorej sa dajú posielať listy, či správy (messages). Niektorí vývojári neradi píšu liebesbriefy, ale oveľa radšej rozkazujú. Metódy možno považovať za rozkazy, ktoré možno revať smerom k objektu.

Daj dátum narodenia!!! [lebo strelím, pozn. red.]

je dokonalý príklad pre názov metódy. Často sa používa aj otázkoidný spôsob:

Si korektný?

V slovenčine to znie dosť biedne: ale v angličtine to dáva oveľa lepší zmysel: “getDateOfBirth!”, “isValid?”. Tak či onak, veľmi často sa názov metódy začína slovesom — i keď sú tu “výnimky z pravidla”: napr. “do reťazca!” = “toString!” Ale taký pán Slota by určite ocenil metódu toTanks().

Pomenovanie však nie je jediný nevyriešený problém. Zatiaľ sme totiž povedali čo má trieda robiť, teda aké služby/operácie/metódy nám vie poskytnúť, ale nepovedali sme ako to má zrealizovať. To povieme kódom v jednotlivých metódach.

Ale o tom v druhom dieli.

Ak ste unavení, ešte vydržte, lebo vybavme ostatných kandidátov na triedy. Ale to pôjde veľmi rýchlo.

Ostatní kandidáti

Texťák nechajme na potom: to chce separátne triedy a separátne úvahy.

  • debilita zodpovedá korektnosti rodného čísla a operácie nevymyslíme žiadne.
  • dátum narodenia sme vybavili triedou java.util.Date
  • človek je akýsi abstraktný pojem, ku ktorému nevieme v našom “informačnom systéme” nájsť žiadne metódy. Samozrejme, mohli by sme vymyslieť milión vlastností: daj meno!, daj priezvisko!, daj výšku!, daj váhu! ale v našom rodnočíselnom systéme to vôbec nemá zmysel a je to zbytočné vyrábanie roboty. Človek tu zodpovedá rodnému číslu a preto nemá zmysel z neho robiť separátnu triedu.
  • pohlavie sme vyriešili pomocou booleovských hodnôt
  • lomka je formátovacia záležitosť, kde metódy nemajú zmysel.

A je to, to bolo jednoduché!

Čo na budúce

Náš systém má teda zatiaľ jednu (!) triedu, ale neskôr rozhodne pribudnú ďalšie – minimálne visí vo vzduchu zoznam rodných čísiel a “texťák”.

A hlavne: načim dodať metódy pre RodnéČíslo.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *