Ряд вещей, в которых я не уверен, и хотел бы... недостатки):

advertisement
Ряд вещей, в которых я не уверен, и хотел бы проконсультироваться (они же – потенциальные
недостатки):
1. Правильно ли в ExpressionValidator сделать приватными вспомогательные методы,
служащие для вычисления главного метода Validate:
public static bool Validate(string expression)
{
return
ValidParentheses(expression) &&
NoNeighborOperators(expression) &&
NoInvalidNumberNearParenthes(expression) &&
NoOtherShit(expression);
}
У меня они публичные, так получилось при разработке через тестирование (отдельно тестировал
и создавал каждый из них публичным).
2. Странно, но у моих классов (у большинства) совсем нет данных и есть одни методы .
Подозрительно.
3.
Был выбор делать ExpressionValidator статик-классом или же интерфейсом. Не совсем
разбираюсь, что когда использовать. Но статик-классы проще.
4. MyPostfixExprHandler кажетс большеватым. Анализировал ответственность, по-моему всетаки у него одна ответственность, просто большая. Работа с постфиксными и инфиксными
строками. Можно выделить в отдельный класс метод ComputeFromPostfix, например
потому, что в нем идет подсчет, и тогда MyPostfixExprHandler будет отвечать за
конвертацию а новый класс за подсчет значения.
5. Нужно ли делать поля readonly, как советует re#, или это лишнее?
6. Класс MyCalculator получился слишком делегирующим на мой взгляд
public class MyCalculator
{
private readonly IPostfixExprHandler postfixExprHandler;
public MyCalculator(IPostfixExprHandler postfixExprHandlerParam)
{
postfixExprHandler = postfixExprHandlerParam;
}
public int Calculate(string infixExpression)
{
if (ExpressionValidator.Validate(infixExpression) == false)
throw new ArgumentException("Строка введена некорректно");
string postfixExpression =
postfixExprHandler.ConvertToPostfix(infixExpression);
return postfixExprHandler.ComputeFromPostfix(postfixExpression);
}
}
7. Дублирование в Program.cs
static void Main(string[] args)
{
var calculator = NinjectContainer.NinjectKernel.Get<MyCalculator>();
Console.WriteLine("Введите выражение. (пустое для выхода)");
string expression = Console.ReadLine();
while (string.IsNullOrEmpty(expression) == false)
{
Console.WriteLine(calculator.Calculate(expression));
Console.WriteLine("Введите выражение. (пустое для выхода)"); //
дублирование :)
expression = Console.ReadLine();
}
}
8. Ну и вот это конечно смотрится страшно, но лучше пока не нашел
if (char.IsNumber(symbol))
{
numberStack.Push(int.Parse(symbol.ToString()));
}
Буду рад услышать Ваше компетентное мнение и допилить калькулятор до ума.
Эти и другие пояснения/вопросы находятся в комментариях в коде.
Related documents
Download