Partilhar via


Adicionando dependências aos dados do Configuration-Dependent

As diretivas *Switch/*Case fazem com que os dados dependam dos parâmetros definidos usando as diretivas *Feature/*Option . A marca de construção do constructo *Switch nomeia um dos parâmetros definidos em um constructo *Feature . A referência de um parâmetro pela marca de construção do constructo *Switch pode preceder sua definição por meio do constructo *Feature .

O corpo de um constructo *Switch contém vários constructos *Case e um constructo *Default opcional. Nenhuma outra entrada filho pode aparecer dentro do constructo *Switch . A marca de construção do constructo *Case nomeia um dos valores permitidos definidos em um constructo *Option que corresponde ao parâmetro nomeado no constructo *Switch . A marca de construção não é usada para o constructo *Padrão .

*Os constructos de comutador podem aparecer como entradas filho em qualquer outro constructo, exceto que um constructo *Switch não pode ser o filho de outro constructo *Switch . O corpo de um constructo *Case pode conter qualquer entrada GDL, exceto que o constructo *Case não pode ser o ancestral de um constructo *Feature ou *Default .

As diretivas *Switch/*Case funcionam de forma muito semelhante aos constructos da linguagem C de mesmo nome. O conteúdo de qualquer constructo *Case (cuja marca de construção é nomeada na configuração como o valor ou estado atual do parâmetro nomeado pelo constructo *Switch) tem permissão para aparecer no instantâneo. Caso contrário, o analisador impede que as entradas contidas no constructo *Case apareçam no instantâneo.

Nota Ao contrário da versão C de *Switch/*Case, a GDL não precisa de uma instrução break para impedir que a execução continue após o final do constructo *Case .

Se o corpo de um constructo Case for omitido (ou seja, *Case aparece como um atributo em vez de um constructo), o corpo do próximo constructo *Case ou *Default será usado. Esse comportamento é novamente semelhante ao comportamento nocaso de opção da linguagem/ C. Se o constructo *Padrão estiver presente, ele deverá aparecer por último, depois de todas as entradas *Case .

Se o parâmetro permitir PICKMANY, o conteúdo de vários constructos *Case poderá aparecer no instantâneo. Essa situação pode levar a várias definições do mesmo constructo ou atributo. Essas várias definições são tratadas como se aparecessem explicitamente no arquivo GDL fora de qualquer constructo *Switch/*Case . Se vários constructos *Case compartilharem o mesmo corpo e mais de um for nomeado na configuração, o conteúdo do corpo aparecerá apenas uma vez.

Se nenhum dos constructos *Case for nomeado na configuração, o conteúdo do constructo *Default será usado. Se nenhum constructo *Padrão for definido, todo o constructo *Switch/*Case e todas as suas entradas descendentes serão excluídos do instantâneo.

Se vários constructos irmãos *Switch/*Case forem definidos, cada um será avaliado independentemente do outro. A mesclagem de constructos irmãos não se aplica a constructos *Switch/*Case .

As diretivas *Switch e *Construct nunca aparecem no instantâneo, portanto, no instantâneo, as entradas filho do constructo *Caseaparecem como as entradas filho do pai do constructo *Switch.

No exemplo de código a seguir, um parâmetro Today é definido para levar dias da semana. O exemplo mostra dois constructos irmãos *Switch/*Case ; ambos serão avaliados de forma independente.

*Schedule:
{
  *Switch: Today
  {
    *Case: Saturday
    *Case: Sunday
    {
 *Eat: Breakfast, Dinner
    }
    *Case: Monday
    *Case: Wednesday
    *Case: Friday
    {
        *Eat: Lunch
    }
  }
  *Switch: Today
  {
    *Case: Sunday
    {
        *ToDo: Laundry
    }
    *Case: Saturday
    {
        *ToDo: Ballgame
    }
    *Default:
    {
        *ToDo: FixBugs
    }
    }
}

Se a configuração especificar Today: Saturday, o instantâneo conterá o código a seguir.

*Schedule:
{
 *Eat: Breakfast, Dinner
  *ToDo: Ballgame
}

Se a configuração especificar Today: Wednesday, o instantâneo conterá o código a seguir.

*Schedule:
{
  *Eat: Lunch
  *ToDo: FixBugs
}

Se a configuração especificar Today: Tuesday, o instantâneo conterá o código a seguir.

*Schedule:
{
  *ToDo: FixBugs
}

O exemplo de código a seguir mostra dois constructos *Switch/*Case aninhados.

*Schedule:
{
  *Switch: Today
  {
    *Case: Sunday
    {
      *Switch: Weather
      {
        *Case: Sunny
        {
            *ToDo: Garden
        }
        *Case: Cloudy
        {
            *ToDo: Laundry
        }
      }
    }
    *Case: Saturday
    {
      *ToDo: Ballgame
    }
      *Default:
      {
        *ToDo: FixBugs
      }
    }
}