Sfondo
Sviluppo di un sistema per la creazione di eBook. I dati sono altamente normalizzati. I disegni eBook sono confezionati come "temi". I temi possono essere configurati con opzioni per: caratteri, colori, alcuni layout ed elementi tematici (come i quadrati per elenchi di proiettili potrebbero diventare cerchi, esagoni o frecce).
Le opzioni sono strettamente collegate al tema. Ad esempio, un tema potrebbe solo consentire all'utente di selezionare determinati tipi di carattere, mentre un altro tema potrebbe non avere alcun elemento tematico, mentre tutti i temi potrebbero fornire opzioni per modificare il layout del numero di pagina, i colori dei temi e il contenuto per l'intestazione / piè di pagina .
La creazione di eBook è un esempio della classe generale di problemi:
The output depends on configurable options; the available options depend on a particular constraint set.
Problema
Quando un nuovo set di vincoli (ad es. tema eBook) viene creato da uno sviluppatore, le opzioni configurabili devono essere esposte come elementi dell'interfaccia utente. Gli elementi dell'interfaccia utente possono essere associati alle opzioni utilizzando un linguaggio descrittivo o XML. Ad esempio:
<group id=”page-number”>
<group id=”text-attribute”>
<string name=”UserInputPage” default=”# / ##” id=”ui-page” />
<colour name=”UserColourPrimary” id=”ui-colour-primary” />
<select name=”UserSelectBullet” id=”ui-bullet”>
<option id=”ui-select-square” />
<option id=”ui-select-circle” />
</select>
<integer name="UserRandomSeed" min="1" max="50" id="ui-random-seed" />
</group>
</group>
<text language="en">
<!-- Tab name -->
<ref id=”page-number”>Page Number</text>
<!-- Group name -->
<ref id=”text-attribute”>Text Attributes</text>
<!-- Display name for select options -->
<ref id=”ui-select-square”>Square</text>
<ref id=”ui-select-circle”>Circle</text>
</text>
L'implementazione del tema sottostante (che sia PHP, Lua, Java o C ++) definirà, esporrà e userà variabili come:
UserInputPage
UserColourPrimary
UserSelectBullet
Utilizzando XSLT, sarebbe ragionevolmente banale convertire la mappa sopra in widget UI sensibili che corrispondono alla definizione di variabile nell'XML.
Creando questa mappa, gli sviluppatori non hanno bisogno di creare esplicitamente l'interfaccia utente, né preoccuparsi del suo layout o della struttura dei menu. Lo sviluppatore crea una mappa delle variabili di input del software e il computer genera automaticamente l'interfaccia utente. L'interfaccia utente, in questo caso, sarà XHTML, ma potrebbe essere XUL o qualsiasi altra rappresentazione.
Confronto
I framework come Facce JavaServer sono simili a questa idea; I problemi relativi a JSF e ADF includono:
- Troppo complesso con un sovraccarico eccessivo.
- Spesso legato a linguaggi di implementazione specifici.
- Gli input sono legati troppo da vicino alla loro rappresentazione finale.
Ad esempio:
<h:inputText value="#{helloBean.name}" ... />
<af:selectOneRadio value="#{bindings.x.hints.inputValue} layout="vertical" />
Gli ingressi del pulsante di scelta verticale "selectOneRadio" non devono essere codificati in tutta l'applicazione. Invece, la rappresentazione finale dell'interfaccia utente dovrebbe essere basata su valori predefiniti intelligenti. Nell'esempio XML dalla sezione del problema, l'interfaccia utente dovrebbe generare due pulsanti di opzione perché ci sono due input nell'elemento select
. Tre elementi genererebbero un menu a discesa. Un elemento creerebbe una casella di controllo.
Allo stesso modo, <string>
potrebbe generare uno di:
- input in HTML;
- JTextField in Java; o
- QLineEdit utilizzando QT4.
Allo stesso modo, <integer>
potrebbe generare un cursore o un campo di input semplice. La convalida verrà eseguita altrove.
Con l'HTML, l'aspetto e l'aspetto finali dell'elemento sarebbero guidati dai CSS, proprio come con JSF.
correlati
Parzialmente correlato:
Domanda
Quale approccio prenderesti per creare una definizione di mappa così variabile che possa generare un codice UI?