 |
[6 * 9 = 42] whileTrue: [World run]
Stopařův průvodce jedním převážně neškodným programovacím jazykem
|
 |
|
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
|
|