Реализация интерфейса ICommand. В каком формате передавать данные в команду?
Хочу написать консольный калькулятор. По заданию, нужно использовать паттерн команда.
создаю интерфейс ICommand:
public interface ICommand { void Execute(); }Приступаю к реализации команд. Вопрос, как правильно передать данные в команду? Я решил использовать string, но допустимо ли передавать числа через string. Есть ли какие-нибудь общепринятые способы/стандарты и т.п.?
private object[] Summand; public void Execute() { Sum(); } public SumCommand(string[] summands) { Summand = new object[summands.Length]; for (int i = 0; i < summands.Length; i++) Summand[i] = new DataTable().Compute(summands[i],null); //Summand[i] =summands[i]; //вот так можно упростить конструкцию, может так и сделать? } public string Sum() { double result=0; for(int i=0;i<Summand.Length;i++) { result += Convert.ToDouble(Summand[i]) ; } return result.ToString(); }
Ответы (1 шт):
В концепцию паттерна "Команда" не входит описание формата хранения параметров. Это детали реализации. Поэтому руководствуйтесь здравым смыслом и архитектурой приложения, для которого предназначен данный компонент:
- Параметры должно быть удобно передавать извне.
- Параметры должно быть удобно использовать внутри.
Например, в вашем примере, для сложения двух чисел необходимо конвертировать параметры из строки в число. Это неудобство ничем не оправдано, потому что параметры нигде не используются как строки в вашем коде. Было бы лучше если бы параметры были числами.
С другой стороны, может быть вызывающая сторона читает параметры из CSV файла или из консоли. В этом случае логично желание поместить код, преобразующий строки в числа - где-нибудь в одном месте. Можно добиться сразу обеих целей - если поместить код преобразования данных прямо в конструктор. Тогда вызывающая сторона будет передавать строки, но хранится они будут уже как числа.
С третьей стороны, строка ведь может содержать совсем и не числа. Может быть наоборот, вы захотите подсказать вызывающей стороне, что нужны именно числа, и ничто иное. Можно конечно бросать исключение, но если вместо этого изменить тип параметра на double, то вызывающая сторона еще на этапе написания кода будет предупреждена об ошибке. Но тогда, конечно, код преобразования данных будет размазан по приложению.