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

     

  • Pool dictionaries

    Při vytváření třídy ve Smalltalku si nelze nevšimnout, že kromě instančních proměnných, třídních proměnných a kategorie třídy lze u třídy specifikovat i tzv. pool dictionaries (sdílené slovníky).

    Nejedná se o extrémně důležitý rys jazyka, ovšem je velmi vhodné se s ním alespoň zběžně seznámit, protože pokud na jejich použití narazíte v cizím kódu, mohou vám pěkně zamotat hlavu. Najednou se ve zdrojových kódech začnou objevovat identifikátory neurčitého původu, které podle všeho vůbec neexistují, „print it“ na nich nefunguje a vůbec vypadají více než podezřele.

    Pool dictionaries jsou jistou obdobou jmenných prostorů, vlastně se jedná o lokální obdoby globálního slovníku Smalltalk.

    Vytvoření


    Pool dictionaries jsou odkazovány ze SystemDictionary (Smalltalk) pod globálně unikátním symbolem. Jejich jméno tedy začíná z konvence na velké písmeno (ovšem není to nezbytné). Musíme se postarat o to, aby byly před použitím inicializovány, nejvhodnější místo pro jejich vytvoření se tedy nachází v instalačních skriptech.

    Vytvoření slovníku může vypadat např. takto:
    | pool |
    pool := Smalltalk
    	at: #ODBCConstants
    	ifAbsentPut: [ Dictionary new ].
    
    pool at:#BUFFERSIZE put: (1024 * 8).
    pool at:#SQLNULLDATA put: -1.
    pool at:#SQLSUCCESS put: 0.
    pool at:#SQLSUCCESSWITHINFO put: 1.
    pool at:#SQLNODATAFOUND put: 100.
    pool at:#SQLCCHAR put: 1.
    pool at:#SQLCNUMERIC put: 2.
    pool at:#SQLCINTEGER put: 4.

    Neudělali jsme nic jiného, než že jsme vytvořili globální objekt třídy Dictionary odkazovaný přes symbol ODBCConstants a naplnili jej asociacemi.

    Použití

    Nyní jediné, co je třeba udělat, je do definice tříd, kde chceme sdílený slovník využívat, vložit do parametru poolDicitionaries jeho jméno.
    IdentityDictionary subclass: #ODBCRow
    	instanceVariableNames: ''
    	classVariableNames: ''
    	poolDictionaries: 'ODBCConstants '
    	category: 'ODBC-Core'


    V metodách třídy ODBCRow pak prvky sdíleného slovníku používáme jako běžné globální objekty.
    columnName := String new: BUFFERSIZE.
    sqlReturn == SQLSUCCESS 
    	ifFalse: ["..."].

    Poznámky

    • Položky sdíleného slovníku zůstávají viditelné i pro odvozené třídy
    • Jak jména slovníku, tak klíče jeho položek mohou začínat na malá písmena (kvůli lepší čitelnosti programů se to však nedoporučuje.)
    • Vyhledávání ve sdílených slovnících předbíhá vyhledávání v systémovém slovníku. Pomocí sdílených slovníků lze tedy překrýt globální definice
    • Jako sdílený slovník může sloužit libovolný globální slovník, tedy i Smalltalk, což sebou přináší nepředstavitelné výhody. Uvádět je nebudu, protože se mi žádnou skutečnou opravdu představit nepodařilo.
    • Existuje mnoho zajímavých sdílených slovníků, jež stojí za pozornost. No, popravdě v současnosti asi jediný. Je jím TextConstants

    ...a jedna „vlastnost“ na závěr

    • Pokud používáte více sdílených slovníků pro jednu třídu zároveň, probíhá v nich vyhledávání v pořadí, v jakém jsou do třídy vloženy, což ovšem nemusí být pořadí, v jakém jsou v uvedeny v seznamu poolDictionaries.

    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