Desková hra - Práce se soubory
==============================
[listopad 2010]
Požadavky
---------
- po načtení souboru musí být hra (aplikace) ve stejném stavu jako při
uložení = uložit stav desky, nastavení hráčů, hráče na tahu ->
historii tahů, stav undo/redo ... započatý tah lidského hráče, stav
výběru nejlepšího tahu, stav replay, ...
- robustnost - korektní reakce na nekorektní vstup, např. poškozený
načítaný soubor
- formát souboru čitelný pro člověka - např. TXT, XML, ne serializace
objektů do binární podoby
- doporučení platformově nezávislé samostatné implementace (mimo
logiku i UI)
Kontroly načítaného souboru
---------------------------
- syntax - má soubor správný formát?, kontrola parsováním
- sémantika - jsou v souboru logicky správné informace pro hru?,
kontrola inicializací a přehráním hry (z historie tahů, bez
zobrazování)
TXT
---
- libovolný formát
- standarní API prog. jazyka nebo systému pro práci se soubory, např.
pro C/C++ funkce fopen, fread, fwrite apod.
XML (eXtensible Markup Language)
--------------------------------
- značkovací = vyznačení struktury dokumentu pomocí značek
- rozšiřitelný = pevná syntaxe značek pro strukturování dokumentu, ale
bez významu značek (sémantiky, narozdíl od HTML), rozšíření o význam
značek (jazyky založené na XML)
- jazyk = metajazyk pro vytváření jazyků?
- standardní (W3C, World Wide Web Consortium) human readable (textový)
rozšiřitelný jazyk (formát) pro tvorbu vlastních jazyků (formátů) s
jednoduchou syntaxí a snadnou implementací
- standardní jazyky založené na XML: XHTML, XSL, XML Schema, XPath,
XQuery (rodina XML), SVG, MathML, SOAP, ... (W3C), DocBook, WML,
RSS/Atom, XML-RPC, *Office, XUL, Jabber (jiní)
- flexibilní reprezentace čehokoliv (dat. formáty, volání procedur,
...), použitelný ve většině průmyslových odvětví (zejména IT) ->
standardní univerzální datový formát
Syntaxe XML
...........
- pro znalce HTML: podobné HTML, ale přísnější
- textové značky (tagy) vymezují elementy, obsah elementu začíná
startovacím tagem a povinně končí koncovým tagem nebo prázdný tag
obsah
- vnořování elementů
obsahtext
- nekřížení elementů (startovací a koncový tag ve stejném elementu)
NE: text
- jediný nejvyšší kořenový element
- element může mít atributy s hodnotami ve startovacím tagu, hodnoty
uvedené v uvozovkách nebo apostrofech (možné vnořit)
- jména elementů a atributů podle specifikace: musí začínat písmenem,
pak mohou být čísla, tečky, dvojtečky, pomlčky a podtržítka, i
diakritika (obecně Unicode znak)
- znakové entity pro speciální znaky (<, >, atd.)
<, >, &, ", '
- numerické entity pro všechny znaky
&, &
- case-sensitive, všechny znaky z použité znakové sady (výchozí
Unicode)
-> syntakticky správný dokument = well-formed dokument
- hlavička (deklarace) s použitou znakovou sadou
- komentáře - kdekoliv mezi elementy, nelze zakomentovat atributy
elementu
NE: />
Parsery
.......
- pro programátory: čtení a zápis textových souborů -> standardizovaná
rozhraní (API) pro práci s dokumentem implementovaná v knihovnách
(parserech)
- př. Xerces (Java, C++), JAXP (Java), libxml2 (C, C++), M$ XML parser
(C++ COM objekt), .NET System.Xml XmlReader (.NET jazyky), S-XML,
XMLisp (Common Lisp)
SAX (Simple API for XML)
- přístup k dokumentu na základě řízení událostí (event-driven
přístup) vyvolaných při sekvenčním průchodu dokumentem
- rozhraní pro definici callback funkcí (nebo metod objektu handleru)
jako reakcí na události vyvolané parserem (začátek, obsah, konec
elementu, komentář, atd.)
- výhody: rychlost, malá spotřeba paměti
- nevýhody: zpracování na jeden průchod, vlastní stavové proměnné v
programu, pouze čtení dokumentu!
DOM (Document Object Model)
- dokument reprezentován jako stromová hierarchie objektů
reprezentujících elementy, atributy, textový obsah atd.
- celá hierarchie v paměti
- obecné rozhraní (funkce) pro procházení a modifikaci dokumentu
document.getElementById("elementID")
- výhody: jednoduchý (objektový) náhodný přístup -> editory,
prohlížeče, pohodlnější přístup k dokumentu
- nevýhody: nižší rychlost, paměťová náročnost
Data-binding
- elementy a atributy jako datové struktury programovacího jazyka -
automaticky vygenerovaný kód
Programovací jazyky
Java
- rozhraní JAX (Java API for XML): JAXP (... Processing) - zpracování
(DOM, SAX, XSLT), JAXB (Java Architecture for XML Binding) -
data-binding a další
- JAXP: standarní API pro XML, metody pro vytvoření parseru - aplikace
nazávislé na implementaci parseru
.NET/C#
- stejné knihovny pro všechny .NET jazyky, jmenný prostor System.Xml
(dříve knihovna M$XML) - ucelené a komplexní řešení
- třídy XmlReader (pull SAX, DOM rozhraní), XmlWriter
- XmlReader: abstraktní, implementace XmlTextReader, XmlNodeReader a
XmlValidatingReader, ale i vlastní
Common Lisp
- mnoho různých parserů, http://www.cliki.net/XML
- např. S-XML (SAX, DOM, data-binding pomocí XML-ELEMENT struktur),
XMLisp (data-binding XML na CLOS objekty), XMLS (jednoduché mapování
XML na s-výrazy), CL-XML (SAX, DOM, CLOS data-binding)
- Common Lisp binding for DOM
C/C++
- libxml2 (C): DOM, SAX (push i pull), mnoho jazykových mutací:
libxml++ (C++), lxml (Python), XML::LibXML (Perl), Libxml-Ruby
(Ruby) a další, mnoho platforem (portabilní, open source)
- nový XmlTextReader podobný .NET
- Xerces (C++): DOM, SAX, data-binding do C++, mnoho platforem (open
source)
Další
- PHP (funkce xml_*, XMLReader), Perl (XML::Parser), atd.
Schémata (schémové jazyky)
..........................
- libovolné značky v XML znamenají příliš volnosti, potřeba známé
struktury (sémantiky) -> odvození nového značkovacího jazyka
(založeného na XML) pomocí jeho schématu zapsaného pomocí schémového
jazyka
- jednoznačně formálně definuje značkovací jazyk (datový formát)
založený na XML, definice gramatiky jazyka
- vyjadřuje typ XML dokumentu, požadavky na značky, jejich strukturu a
obsah (jaké elementy, atributy a obsah), někdy také datové typy
- hlavní použití: validace oproti schématu = ověření, zda XML vyhovuje
schématu (má správnou sémantiku), nutná při výměně a čtení XML
dokumentu, podpora parsery
- může sloužit i jako dokumentace definovaného jazyka, zdroj pro
vytvoření objektového modelu při data-bindingu, apod.
- př. schémata XHTML, XSL, SVG, MathML, DocBook, WML, RSS/Atom, ...
- přímo ve standardu XML jazyk DTD (Document Type Definition): široká
podpora parsery, stačí na použití XML jako strukturovaného formátu,
ale nevýhody pro IS a web (zejména chybějící datové typy a jmenné
prostory, není XML jazyk)
- W3C XML Schema (WXS, XSD, 2001): velká podpora, dostačující, ale
složité a obecné, základ: vše je datový typ, hierarchie zabudovaných
jednoduchých typů, definice (vlastních) typů, XML jazyk
- RelaxNG (RNG, RNC): elegentní, založeno na vzorech, celé schéma
vzor, definice (pod)vzorů, XML (RNG) a kompatkní (RNC, úspornější)
zápis - navzájem převoditelné, kontextové modelování obsahu vzoru
- převod schémat: trang, XML Authority
- XML parsery: validace oproti schématu, dnes většina podporuje všechny