Compreendendo o Princípio Aberto Fechado

Eu fui refatoração algum código antigo de um analisador de arquivo de script simples quando me deparei com o seguinte código:

StringReader reader = new StringReader(scriptTextToProcess);
StringBuilder scope = new StringBuilder();
string line = reader.ReadLine();
while (line != null)
{
    switch (line[0])
    {
        case '

Este simples processador de scripts parece-me um bom candidato para refatoração aplicando o "princípio aberto e fechado". As linhas começando com um$ provavelmente nunca será tratado de maneira diferente. Mas e se novas diretivas começando com um! precisa ser adicionado? Ou são necessários novos identificadores de processamento (por exemplo, novos casos de switch)?

O problema é que não consegui descobrir como adicionar mais diretivas e processadores de maneira fácil e correta sem interromper o OCP. O! -case usandoscope e / ou line torna um pouco complicado, assim como odefault-caso

Alguma sugestão

: // Process the entire "line" as a variable, // i.e. add it to a collection of KeyValuePair. AddToVariables(line); break; case '!': // Depending of what comes after the '!' character, // process the entire "scope" and/or the command in "line". if (line == "!execute") ExecuteScope(scope); else if (line.StartsWith("!custom_command")) RunCustomCommand(line, scope); else if (line == "!single_line_directive") ProcessDirective(line); scope = new StringBuilder(); break; default: // No processing directive, i.e. add the "line" // to the current scope. scope.Append(line); break; } line = reader.ReadLine(); }

Este simples processador de scripts parece-me um bom candidato para refatoração aplicando o "princípio aberto e fechado". As linhas começando com um$ provavelmente nunca será tratado de maneira diferente. Mas e se novas diretivas começando com um! precisa ser adicionado? Ou são necessários novos identificadores de processamento (por exemplo, novos casos de switch)?

O problema é que não consegui descobrir como adicionar mais diretivas e processadores de maneira fácil e correta sem interromper o OCP. O! -case usandoscope e / ou line torna um pouco complicado, assim como odefault-caso

Alguma sugestão

questionAnswers(1)

yourAnswerToTheQuestion