Squak Smalltalk [6 * 9 = 42] whileTrue: [World run]
Stopařův průvodce jedním převážně neškodným programovacím jazykem
smalltalk
Swiki
  • Domů
  • Zpět
  • Tento server

    Squeak
  • Úvod
  • Smalltalk
  • Články
  • Knihy
  • Dokumentace
  • FAQ
  • Tutoriály
  • Download
  • Odkazy

    Komunita
  • CSSUG
  • Oznámení
  • Projekty
  • O nás
  • Fórum
  • Kontakt

     

  • Jak psát ve Smalltalku?

    Informační zdroj

    Následující soubor rad pochází z materiálů k předmětu Object-oriented Programming and Design (1998, Ralph E. Johnson) na jedné americké univerzitě. Dále bylo čerpáno z Smalltalk Best Practice Patterns (1997, Kent Beck).

    Úvod

    Nejprve si připomeňme, že u Smalltalku:
    • Proměnné nejsou typované
    • Identifikátory mohou mít libovolně velkou délku
    • Operátor jsou pojmenovávány

    Aby byl ST dobře čitelný, tak musí "jména" v jeho kódu něco smysluplného znamenat (nepoužívat názvy proměnných a metody typu: tmp2, pdkp, ...). Existují jakési standardní protokoly, které jsou ve všech ST dodržovány např. anObject printOn:, aCollection do:, aCollection add:, atd.

    Speciálně pro práci českých/slovenských programátorů ve Smalltalku silně doporučuji, aby veškerý svůj kód i názvy metod a proměnných přebírali z anglického jazyka. Čeština je sice jazyk překrásný a velmi bohatý, ale pro programování má stejně většinu výrazů převzatých z angličtiny.
    V podstatě vám zbývá se pouze rozhodnout, zda budete anglicky psát i případné komentáře ve vašem kódu :-).

    Základní pojmenovávací konvence


    Metody

    Selektor (jméno zasílané zprávy) nad jméno samotné metody
    Čitelnost zasílání dané zprávy v souvislém kódu je daleko důležitější než čitelnost samotného (samostatně čteného) názvu implementující metody. Jméno by dále mělo specifikovat "co metoda dělá" a ne "jak to dělá"!
    Např. Správně: anObject printOn: aStream. Špatně: anObject writeTextRepresentationOfThisObjectOn: aStream.

    Tři základní typy metod:
    • měnící stav příjemce zprávy (angl. receiver)
    • měnící stav argumentu předávaného ve zpravě
    • navracející hodnotu z příjemce zprávy
    Pokud pro je pro danou metodu již standardní název (oblíbený, používaný a tudíž intuitivní), tak ZAPOMEŇTE na toto rozdělení :-).
    Metody měnící stav příjemce zprávy
    Jméno bude sloveso vyjadřující funkci této metody.
    Např. aVector transformBy: anotherVector. aCollection add: anItem.

    Metody měnící stav argumentu předávaného ve zprávě
    Jméno bude sloveso končící předložkou (anglicky To, On) vyjadřující funkci této metody a vztah k argumentu.
    Např. aSomething printOn: aPaper. aMorph displayOn: aScreen. anItem addTo: aCollection.

    Metody navracející hodnotu z příjemce zprávy
    Jméno bude podstatné jméno nebo přídavné jméno popisující "co bude vráceno" než samotný příkaz.
    Např. aCollection size. aWindow topLeft. aText translatedBy: aDictionary.

    Nyní několik příkladů, které se "vymykají" těmto třem základním typům:
    Přístupové metody (Accessing methods)
    Většina instančních proměnných mají své metody pro čtení a zapisování, protože jak jistě víte, tak ve ST jsou všechny instanční proměnné privátní. Tyto dvoji metod se většinou nazývají přesně jako jméno dané instanční proměnné, ke které přistupují:
    Např. name "vrátí hodnotu name", name: aName "nastaví hodnotu name na aName", width, width:, x, x:, apod.

    Testovací metody (Testing methods)
    Testovací metody vrací odpověď typu Boolean (z hlediska logiky jsou to vlastně predikáty). V názvu jim dáváme prefix "is", což znamená anglicky "je" (otazník jako sufix, který by byl také vhodný se však již z pochopitelných důvodů vynechává :-).
    Např. isNil, isControlWanted, isEmpty

    Metody nastavující vlastnost typu Boolean
    Pro dobrou čitelnost kódu není dobré vytvářet metody s jedním parametrem typu Boolean, ale místo toho vytvořit dvě metody začínající "make" (angl. změna stavu) nebo "toggle" (angl. překlopení stavu na opačný).
    Např. makeVisible / makeInvisible / toggleVisible, makeDirty / makeClean, apod. Existují i vhodné výjimky jako: show / hide, ale zase např. vhodnější je: makeEnable / makeDisable než enable / disable.

    Konverzní metody (Converting Methods)
    Často potřebujete objekt (příjemce zprávy) získat v novém formátu (jako objekt jiné třídy). K tomu slouží konverzní metody obsahující v názvu prefix "as" (angl. jako) a jméno třídy, na jejíž objekt je původní objekt konvertován.
    Např. aCollection asSet. aNumber asFloat, aText asComposedText.

    Metody pro vytváření nových instancí
    tj. třídní metody vytvářející nové instance svých tříd.
    Nejflexibilnější a také nejobecnější je varianta: Point new x: 10; y: 20. U té ovšem obecně hrozí, že vynecháme některý nezbytný inicializační krok (např. nenaplníme y, ale pouze x; lze totiž napsat i Point new x: 10.). Proto pro inicializaci vyžadující nějaká vstupní data vytvýříme metody, která tato data vyžadují jako parametry, např. Point x: 10 y: 20. SortedCollection sortBlock: aBlock. Pokud nejsou nutné žádné parametry, tak se používá metoda new (Set new.).


    Kompozice metody

    Jak velká má být metoda (kolik kódu má obsahovat)?
    Každá metoda by měla provádět jeden konkrétní úkon jednoduše identifikovatelný a popsatelný:
    • pár řádků kódu
    • korespondence k abstraktnímu popisu funkce metody
    • minimalizovat množství metod nutných měnit v zděděné podtřídě
    • (???) minimalizovat kopírování kódu do podtřídy (???)
    Přístup tvorby shora dolů: od nejvyšší míry abstrakce se postupně zjemňuje až se implementují konkrétní aritmetické a funkční výrazy.
    Pokud metoda obsahuje dvě nebo víc posílání zpráv jinému objektu, tak už je třeba se zamyslet nad další dekompozicí problému.

    Metody identifikované komentářem
    Jakmile cítíte potřebu část metody okomentovat, tak to značí, že by tato část měla tvořit samostatnou metodu a komentář by měl být nahrazen výstižným jménem této metody.

    Názvy tříd a podtříd

    Jak pojmenovávat třídu nejvýše v námi budované třídní hierarchii?
    • komplexní jméno plně vyjadřující význam
    • jednoduché jméno (1 až 2 slova) jak pro vyslovení (čtení), tak pro psaní (v kódu)
    • ale jak ukázat, že se k ní vztahují ty a ty podtřídy?
    Např. Number, Collection, VisualComponent

    Jak nazývat podtřídy, které mají podobnou avšak rozšířenou funkci jako jejich rodič?
    • unikátní jméno, které zpřesňuje popis (je více informativní oproti jménu předka)
    • jména zřejmého a jasného významu nebo přidáním přidavného jména k jménu některého hodně významného předka.
    Např. Number -> Float, Collection -> OrderedCollection.

    Proměnné (instanční, parametry, temporální)

    PS: Typ specifikuje třída (aRectangle, aCollection, aView), ale Role znamená "jak je objekt používán" (např. location, employees, topView).

    Jak pojmenovat instanční proměnnou?
    Její typ je sice důležitý pro pochopení implementace metody, ale dá se zachytit třeba v komentáři k proměnné. Kdežto Role sděluje záměr (účel proměnné), a ten pochopit, je daleko těžší. Takže instanční proměnné nazývejte podle rolí, které ve vaší třídě/objektu hrají.
    Například uvádím několik tříd a jejich inst.proměnných: Point: x, y. Interval: start, stop, step.
    PS: Pokud je obsah proměnné kolekce, tak použijte množné číslo.
    Např. Polyline: vertices.

    Jak pojmenovat parametr metody?
    Protože klíčové slovo v jménu metody již sděluje roli parametru za ním, tak by jméno parametru mělo poskytnout novou informaci, např. o typu. Takže budeme parametr pojmenovávat nejobecnější třídou, jejíž objekt je očekáván. K tomu přidáme prefix "a", "an" (angl. neurčitý člen, jeden, nějaký). Vzknikne-li parametrů se stejným jménem více, tak přidáme do jména další popisné slovo, které je rozliší.

    Jak pojmenovat temporální proměnné (dočasné)?
    Podobně jako instanční proměnné i temporální proměnné je dobré nazývat podle rolí, které zastupují. Dočasné proměnné jsou vhodné pro:
    • udržování mezivýsledků
    • znovupoužití již jednou vypočítaného výsledku
    • pojmenování výsledku nějakého výrazu (např. kvůli lepší čitelnosti kódu v hodně složitém výrazu)
    S počtem temporálních proměnný to moc nepřehánějte, protože tyto proměnné většinou zhoršují čitelnost kódu!

    Odkaz na tuto stránku

    • Články, poslední úprava dne 17 Únor 2010 v 11:18:52 uživatelem localhost





    Administrátoři: Pavel Křivánek, Zbyněk Křivka