понедельник, 29 мая 2017 г.

Реализация pipe/composition операций в языке C#

В функциональных языках вроде F# и разных командных оболочках часто можно встретить поддержку "потоковых" операций для работы с данными. Это называется pipe или forwarding или как нибудь-еще, но суть одна – данные подаются на вход одной функции, затем другой, третьей и так далее, и как бы по конвееру перемещаются от источника к приемнику. Также возможна ситуация, когда нескольких элементарных функций объединяются в одну, и потом уже эта функция используется для обработки данных. Такое объединение в функциональной парадигме называется композицией.

Обычно промежуточные функции выполняют над данными какие нибудь операции, трансформируют их, переупорядочивают и т.д. При этом они не обращаются к данным из внешнего контекста, т.е. не имеют побочного эффекта.
Несмотря на то, что в языке C# нет поддержки композиции функций, нечто подобное можно при необходимости реализовать самостоятельно, что позволит писать программы довольно необычным (для программистов на C#, конечно) способом.
Вот такие extension методы для этого понадобятся:

Используя их, программу вычисления хэш-кода файла, например, можно выразить в виде такого "конвеера":
А вот такой метод расширения позволит собрать "конвеер" в виде кольца, используя рекурсивный вызов: Полный код программы будет выглядеть так:
Код, написанный в таком функциональном стиле выглядит проще и лучше читается, для подтверждения этого достаточно переписать приведенный выше код в виде вызовов вложенных методов без использования промежуточных переменных. Вот как это выглядело бы: Конечно, в настоящем функциональном языке с поддержкой pipeline'ов и композиции на уровне языка можно писать изящней и короче. Однако, даже в C# такой подход удобно применять для простеньких утилит и быстрого прототипирования. Кроме того, в сообществе .NET есть участники, которые активно продвигают в C# поддержку оператора |> и возможно мы с вами увидим таки его в следующих версиях языка.

Комментариев нет:

Отправить комментарий