Abstraktní Wikipedie/Chybová hlášení u objektů ZObject
V současné době vyhodnocujeme, konstruujeme a validujeme celý ZObject v kódu PHP rozšíření WikiLambda ze serializace JSON uložené ve wiki.
Existují dva hlavní důvody:
- Validujeme serializaci JSON: pokud serializace nepředstavuje platný objekt, konstrukce objektu selže. Tímto způsobem zabráníme tomu, aby se do wiki dostal neplatný obsah, což znamená, že můžeme veškerý obsah považovat za platný a můžeme předpokládat, že jsou splněny určité podmínky.
- Pro některé úkoly, které wiki potřebuje provádět, jako je získávání štítků, pozdější aliasy a některé specifické pohledy na wiki, musí objekt *splňovat* určité podmínky, jinak wiki vlastně nemůže poskytovat některé základní funkce, jako je vyhledávání nebo zobrazení.
To má několik nevýhod:
- Očekáváme, že většinu wiki, včetně jejích typů a validací, bude nakonec moci upravovat komunita. To znamená, že to, co je platné a co ne, se v průběhu času mění a to, co bylo platné v určitém okamžiku, nemusí být platné v jiném okamžiku. Musíme se vypořádat s neplatným obsahem, protože obsah, přinejmenším ve starších revizích, se nakonec stane neplatným - jinak se mohou rozbít základní funkce wiki, jako je historie nebo zobrazení starých revizí.
- Kontrola platnosti může být velmi náročná, zvláště pokud platnost kontrolujeme pomocí uživatelských definic typů a validačních funkcí.
Zde je návrh na nápravu:
- Zavádíme novou třídu PHP (pravděpodobně podobnou současné třídě ZRecord), která obsahuje dobře formulovanou JSON-reprezentaci libovolného ZObjektu, ale není plnohodnotným zrcadlem typu tohoto ZObjektu v PHP.
- Pokud to není nutné pro fungování wiki, nevytváříme z objektů ZObjects plné objekty PHP. Dokonce i ZObjekty, které potřebujeme, konstruujeme pouze částečně - ty části, které skutečně potřebujeme pro fungování wiki. Každý z těchto objektů PHP má také člen, ve kterém je uložena jeho dobře formulovaná JSON-reprezentace.
- Vše, co je ve wiki uloženo, je zaručeně správně formulované a kanonizované.
- Vše, co je uloženo ve wiki, se zaručeně řídí nedotknutelnými pravdami; ty jsou ve wiki pevně zakódovány a nelze je na wiki měnit. Mezi ně patří, že každý objekt musí být Z2/Persistentní objekt, že každý Z2 má štítky atd.
- Předpokládá se, že 3 i 4 budou dlouhodobě stabilní.
- Kromě bodů 3 a 4 neprovádíme žádnou další validaci.
- Při zobrazování uloženého obsahu nebo náhledu provádíme validaci a zobrazujeme chyby.
- Před uložením může přispěvatel buď zobrazit náhled, nebo vyvolat validaci, případně se validace vyvolá automaticky a přispěvateli se zobrazí seznam chyb. Tlačítko "publikovat" může být v případě chyb zašedlé nebo se nezobrazí.
- Jakmile se však rozhraní API vyvolá za účelem uložení, učiníme tak i v případě chyb validace - nikoli však v případě chyb ve správném tvaru nebo chyb proti jasným pravdám.
- Neplatné ZObjekty *vždy* používají obecný prohlížeč a editor, nikoli konkrétní (protože by mohly být porušeny požadavky na konkrétní prohlížeč).
- V obecném prohlížeči se také zobrazí seznam všech případných chyb validace.