Yvision.kz
kk
Разное
Разное
399 773 постов42 подписчика
Всяко-разно
-8
23:51, 21 мая 2014

Простой функциональный калькулятор.

Механизм делегатов в .NET - очень обширная тема и существует множество способов его применения, от элементарных до, например реализации поставщика данных IQueryable - http://msdn.microsoft.com/ru-ru/library/bb546158.aspx. Пока до этого не дошел, так как материал не самый лёгкий для восприятия, ограничиваюсь более простыми конструкциями:)

Итак. К примеру, есть задача написать нечто, подобное калькулятору для консольного приложения. Как правило программа ожидает такой пользовательский ввод: первое число, операция, второе число. Многие не заморачиваясь, пишут нечто подобное:

   
  1. switch (operation)
  2. {
  3. case "+": Console.WriteLine("{0}", x + y); break;
  4. case "-": Console.WriteLine("{0}", x - y); break;
  5. case "*": Console.WriteLine("{0}", x * y); break;
  6. case "/": Console.WriteLine("{0}", x / y); break;
  7. default:
  8. throw new Exception(String.Format(
  9. "Непонятная операция: {0}", operation));
  10. }
 

Но, как видно, такая конструкция не совсем хороша.

Гораздо более интереснее выглядит такой код:

   
  1. private static readonly Dictionary<string, Func<decimal, decimal, decimal>> Operations =
  2. new Dictionary<string, Func<decimal, decimal, decimal>>();
  3. static void Main(string[] args)
  4. {
  5. Operations["+"] = (x, y) => x + y;
  6. Operations["-"] = (x, y) => x - y;
  7. Operations["*"] = (x, y) => x * y;
  8. Operations["/"] = (x, y) => x / y;
  9. foreach (var func in Operations)
  10. func.Value(321, 123).Print();
  11. Console.ReadLine();
  12. }
 

Здесь мы объявили словарь, где ключом является некая операция, а значением - сопоставленное ключу лямбда-выражение. Расширение Print объявлено следующим образом:

   
  1. public static void Print<T>(this T value)
  2. {
  3. Console.WriteLine(value);
  4. }

Как вариант использования:

   
  1. Operations["+"](123,123).Print();

На этом пока все, дальше буду писать более интересные вещи, такие как использование предикатов и написание расширений методов Linq.

И кстати, кто-нибудь изучает или применяет F# в повседневной жизни?

-8
385
0