Ряд вещей, в которых я не уверен, и хотел бы проконсультироваться (они же – потенциальные недостатки): 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())); } Буду рад услышать Ваше компетентное мнение и допилить калькулятор до ума. Эти и другие пояснения/вопросы находятся в комментариях в коде.