Delen via


Opmerkingen bij GDL-oefening

In het volgende codevoorbeeld ziet u de indexstructuur die door de parser wordt gegenereerd voor alle GDL-oefeningen.

      <: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>

De vermeldingen *Name en *POption worden toegewezen aan verschillende sjablonen, elk met verschillende semantiek. *Name wordt bijvoorbeeld toegewezen aan NAME, INPUTTRAY_OPT_NAME of PAPER_SIZE_OPT_NAME. *POption komt overeen met GENERIC_OPTION, PREDEFINED_PAPERSIZE_OPTION, CUST_PAPERSIZE_OPTION, OEM_PAPERSIZE_OPTION of INPUTTRAY_OPTION2. Als de sjabloonstructuur correct is gedefinieerd, vindt de parser volgens de templatisatieregels de meest geschikte sjabloon.

Notitie Deze oefeningen vormen enkele basissjablonen en vervolgens afgeleide varianten naarmate het schema gedetailleerder werd. Dit proces bootst de manier na waarop een schema zich in het echte leven ontwikkelt. Overerving stelde het oefeningsschema in staat om te worden uitgebreid zonder de eerder gedefinieerde sjablonen te wijzigen. Met deze functie kunnen derden het hoofdschema uitbreiden en zorgt u er ook voor dat elke schema-extensie van derden compatibel blijft met gebruikers van het oorspronkelijke hoofdschema.

De weergegeven antwoorden in de oefening zijn niet uniek. U kunt bijvoorbeeld de sjablonen MIN_SIZE en MAX_SIZE als volgt afleiden van PAPERDIMENSIONS.

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

Houd er rekening mee dat de PAPER_SIZE_OPT_NAME- en INPUTTRAY_OPT_NAME-sjablonen overnemen van de sjabloon NAAM en ook de *Naamvermelding opnieuw definiëren.

Het effect van het opnieuw definiëren van de *Naamvermelding is het verbergen van deze afgeleide sjablonen uit de overnamestructuur die de basissjablonen tot stand brengen.

Wanneer een sjabloon NAME als *Lid declareert, impliceert deze declaratie dat alle sjablonen die zijn afgeleid van NAME ook *Leden zijn. Afgeleide sjablonen met opnieuw gedefinieerde *Naamvermeldingen worden echter uitgesloten van de impliciete *ledenlijst met afgeleide sjablonen. Zonder deze uitsluiting worden gegevensvermeldingen die oorspronkelijk zijn toegewezen aan sjabloonNAAM (bijvoorbeeld *Naam die wordt weergegeven in een *Pfeature) toegewezen aan INPUTTRAY_OPT_NAME (wat onjuist is).

Als u verwacht dat de specialisatie van NAME in PAPER_SIZE_OPT_NAME en INPUTTRAY_OPT_NAME tijdens het oorspronkelijke ontwerp van het schema, zou het resultaat een andere schema-implementatie zijn door NAME te verwijderen uit de *Members lijst van GENERIC_OPTION. Deze wijziging maakt het onnodig om *Naam opnieuw te definiëren. Een verdere ontwerpverfijning zou NAAM, PAPER_SIZE_OPT_NAME en INPUTTRAY_OPT_NAME overnemen van een gemeenschappelijke virtuele sjabloon, omdat die situatie de relatie tussen deze trefwoorden nauwkeuriger weergeeft.