Partager via


Notes d’exercice GDL

L’exemple de code suivant montre l’arborescence d’index générée par l’analyseur pour tous les exercices GDL.

      <:ROOT2>
    *PFeature : InputTray    <:INPUTTRAY_FEATURE>
        *POption : Lower    <:INPUTTRAY_OPTION2>
            *Capacity    <:TRAY_CAPACITY>
            *Command    <:ACOMMAND>
            *Name    <:INPUTTRAY_OPT_NAME>
        *POption : Upper    <:INPUTTRAY_OPTION2>
            *Capacity    <:TRAY_CAPACITY>
            *Command    <:ACOMMAND>
            *Name    <:INPUTTRAY_OPT_NAME>
        *DefaultOption    <:DEFAULT_OPT>
        *Name    <:NAME>
    *PFeature : PaperSize    <:PAPERSIZE_FEATURE>
        *POption : Custom    <:CUST_PAPERSIZE_OPTION>
            *MinSize    <:MIN_SIZE>
            *MaxSize    <:MAX_SIZE>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *POption : OEMName_Special_size    <:OEM_PAPERSIZE_OPTION>
            *OEM_Info    <:OEM_INFO>
            *PaperSize    <:PAPERDIMENSIONS>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *POption : A4    <:PREDEFINED_PAPERSIZE_OPTION>
            *PaperSize    <:PAPERDIMENSIONS>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *POption : Legal    <:PREDEFINED_PAPERSIZE_OPTION>
            *PaperSize    <:PAPERDIMENSIONS>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *POption : Letter    <:PREDEFINED_PAPERSIZE_OPTION>
            *PaperSize    <:PAPERDIMENSIONS>
            *Command    <:ACOMMAND>
            *Name    <:PAPER_SIZE_OPT_NAME>
        *DefaultOption    <:DEFAULT_OPT>
        *Name    <:NAME>
    *PFeature : random    <:PFEATURE >
        *POption : First    <:GENERIC_OPTION>
            *Command    <:ACOMMAND>
            *Name    <:NAME>
        *DefaultOption    <:DEFAULT_OPT>
        *Name    <:NAME>

Les entrées *Name et *POption sont mappées à plusieurs modèles, chacun avec une sémantique différente. Par exemple, *Name mappe à NAME, INPUTTRAY_OPT_NAME ou PAPER_SIZE_OPT_NAME. *POption correspond à GENERIC_OPTION, PREDEFINED_PAPERSIZE_OPTION, CUST_PAPERSIZE_OPTION, OEM_PAPERSIZE_OPTION ou INPUTTRAY_OPTION2. Si la structure du modèle a été définie correctement, l’analyseur suivant ses règles de modélisation trouve le modèle le plus approprié.

Note Ces exercices établissent des modèles de base et des variantes dérivées ultérieurement à mesure que le schéma est devenu plus détaillé. Ce processus imite la façon dont un schéma évolue dans la vie réelle. L’héritage a permis d’étendre le schéma de l’exercice sans modifier les modèles définis précédemment. Cette fonctionnalité permet à des tiers d’étendre le schéma master et garantit également que toute extension de schéma tierce reste compatible avec les utilisateurs du schéma master d’origine.

Les réponses de l’exercice affichées ne sont pas uniques. Par exemple, vous pourriez avoir dérivé les modèles MIN_SIZE et MAX_SIZE à partir de PAPERDIMENSIONS de la manière suivante.

*Template:  MIN_SIZE
{
    *Name: "*MinSize"
    *Inherits: PAPERDIMENSIONS
}
*Template:  MAX_SIZE
{
    *Name: "*MaxSize"
    *Inherits: PAPERDIMENSIONS
}

Notez que les modèles PAPER_SIZE_OPT_NAME et INPUTTRAY_OPT_NAME héritent du modèle NAME et redéfinissent également l’entrée *Name.

La redéfinition de l’entrée *Nom a pour effet de masquer ces modèles dérivés de l’arborescence d’héritage établie par les modèles de base.

En règle générale, lorsqu’un modèle déclare NAME comme *Membre, cette déclaration implique que tous les modèles dérivés de NAME sont également *Membres. Toutefois, les modèles dérivés avec des entrées *Nom redéfinies sont exclus de la liste *Membres implicite des modèles dérivés. Sans cette exclusion, les entrées de données qui auraient été mappées à l’origine au nom du modèle (par exemple, *Name apparaissant dans un *Pfeature) seraient mappées à INPUTTRAY_OPT_NAME (ce qui est incorrect).

Si vous prévoyez la spécialisation de NAME en PAPER_SIZE_OPT_NAME et INPUTTRAY_OPT_NAME lors de la conception d’origine du schéma, une implémentation de schéma différente se traduirait simplement par la suppression de NAME de la liste *Membres de GENERIC_OPTION. Cette modification ne rend pas nécessaire la redéfinition de *Name. Un affinement supplémentaire de la conception aurait NAME, PAPER_SIZE_OPT_NAME et INPUTTRAY_OPT_NAME hériter d’un modèle virtuel commun, car cette situation reflète plus précisément la relation entre ces mots clés.