«Концептуальный дизайн» в данном случае - это правила производства. Если бы вы спроектировали Json самостоятельно, вы бы подумали с точки зрения «пара - это ключ, за которым следует двоеточие, за которым следует значение», или вы бы подумали с точки зрения «двоеточия будут делать« а »в этом случае« А »и делать 'b' в случае 'B' и делать 'c' в случае 'C' "? Посмотрите на http://www.json.org/. Вы увидите «концептуальный дизайн», изложенный в правилах производства.
Поскольку «структурный дизайн» вашего кода не имеет формы «концептуального дизайна», никакое количество рефакторинга не поможет. Небольшое изменение «концептуального дизайна» приведет к изменению кода, который трудно кодировать и тестировать. Вам нужно переписать код в терминах «концептуального дизайна».
// object
// "{" "}"
// "{" members "}"
private static JsonObject ProduceJsonObject(Tokens tokens)
{
var result = new JsonObject();
tokens.Accept( TokenType.OpenBrace );
result.members = ProduceJsonMembers(tokens);
tokens.Accept( TokenType.CloseBrace );
return result;
}
// members
// pair
// pair { "," pair }
private static JsonMembers ProduceJsonMembers(Tokens tokens)
{
var result = new JsonMembers();
result.Add( ProduceJsonPair(tokens) );
while (tokens.LookAhead == TokenTag.Comma)
{
tokens.Accept( TokenType.Comma );
result.Add( ProduceJsonPair(tokens) );
}
return result;
}
//pair
// string ":" value
private static JsonPair ProduceJsonPair(Tokens tokens)
{
var result = new JsonPair();
result.String = tokens.Accept( TokenType.ID );
tokens.Accept( TokenType.Colon );
result.Value = ProduceJsonValue( tokens );
return result;
}
// and so forth