Поделиться через


Понятия и терминология (функциональное преобразование)

В данном разделе вводятся основные понятия и терминология чисто функциональных преобразований. Подход с использованием функциональных преобразований для преобразования данных порождает код, который обычно быстрее для программирования, более выразительный и легче для отладки и сопровождения, чем порожденный с использованием традиционного императивного программирования.

Заметим, что темы в данном разделе не претендуют на подробное объяснение функционального программирования. Но при этом они определяют некоторые возможности функционального программирования, которые позволяют легче переводить XML из одной формы в другую.

Что такое чисто функциональное преобразование?

В разделе чисто функциональное преобразование определяется набором функций, называемых чистые функции, позволяющих преобразовать набор структурированных данных из одной формы в другую. Слово «чистые» указывает на то, что функции допускают композицию, которая требует, чтобы они были следующие.

  • Замкнутые, то есть они должны быть свободно упорядочены и переупорядочены без вовлечения остальных частей программы и взаимных зависимостей от них. Чистые преобразования не имеют представления о своей среде и не влияют на нее. Другими словами, использованные при преобразовании функции не имеют побочных эффектов.

  • Без сохранения состояния, то есть исполнение одной и той же функции или определенного набора функций с одинаковыми входными данными будет всегда приводить к одинаковым выходным данным. Чистые преобразования не знают о предыдущих использованиях.

Важно!

До конца данного учебника термин «чистая функция» используется в основном для указания подхода к программированию, а не специальной характеристики языка.

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

Также не надо путать чистые функции с чисто виртуальными методами в C++.Второй случай показывает, что содержащийся класс абстрактный и текст метода не указан.

Функциональное программирование

Термин функциональное программирование обозначает такой подход к программированию, при котором непосредственно поддерживаются чисто функциональные преобразования.

Исторически языки функционального программирования общего назначения, такие как ML, Scheme, Haskell и F# (разработанный Microsoft Research), составляли основной интерес ученого сообщества. Не смотря на то что всегда было возможно писать чисто функциональные преобразования на языках C# и Visual Basic, это не стало привлекательным вариантом для большинства программистов из-за своей сложности. В C# 3.0 и Visual Basic 9.0, тем не менее, новые конструкции языка, такие как лямбда-выражения и определение типов, сделали функциональное программирование гораздо более легким и более продуктивным.

Дополнительные сведения о функциональном программировании см. в разделе Сравнение функционального и императивного программирования.

Предметные языки функционального программирования

Не смотря на то что основные языки функционального программирования широко не используются, специальные предметные языки функционального программирования имеют больший успех. Например, каскадные таблицы стилей (CSS) используются для определения вида многих веб-страниц, а преобразования XSLT широко используются в обработке XML-данных. Дополнительные сведения об XSLT см. в разделе Преобразования XSLT.

Терминология

Следующие таблицы определяют некоторые термины, связанные с функциональными преобразованиями.

  • функция высокого порядка (первого класса)
    Функция, которая может быть интерпретирована как программный объект. Например, функция высокого порядка может быть передана и возвращена другими функциями. В языках C# и Visual Basic выражения-делегаты и лямбда-выражения являются компонентами языка, которые поддерживают функции высокого порядка. Для написания функции высокого порядка необходимо объявить один или несколько аргументов для принятия делегатов, при этом обычно используются лямбда-выражения. Многие стандартные операторы запроса являются функциями высокого порядка.

    Дополнительные сведения см. в разделе Общие сведения о стандартных операторах запроса.

  • лямбда-выражение
    По сути это встроенная анонимная функция, которая может использоваться, когда тип делегата неизвестен. Это упрощенное значение лямбда-выражений, однако оно достаточно для целей данного учебника.

    Дополнительные сведения см. в разделах Лямбда-выражения (Руководство по программированию в C#) или Лямбда-выражения (Visual Basic).

  • коллекция
    Структурированный набор данных обычно стандартного типа. Для обеспечения совместимости с LINQ коллекция должна реализовывать интерфейс IEnumerable или интерфейс IQueryable (или один из их основных прототипов IEnumerator<T> или IQueryable<T>).

  • кортеж (анонимные типы)
    Как математическое понятие, кортеж представляет собой конечную последовательность объектов, каждый определенного типа. Кортеж называется также упорядоченным списком. Анонимные типы представляют собой языковую реализацию этой концепции, которая позволяет объявить класс неименованного типа и одновременно создать экземпляр объекта этого типа.

    Дополнительные сведения см. в разделах Анонимные типы (Руководство по программированию в C#) и Анонимные типы (Visual Basic).

  • определение типов (скрытое типизирование)
    Возможность компилятора определить тип переменной при отсутствии явной декларации типа.

    Дополнительные сведения см. в разделах Неявно типизированные локальные переменные (Руководство по программированию в C#) и Вывод локального типа (Visual Basic).

  • отложенное исполнение и неспешные вычисления
    Задержка вычисления выражения до тех пор, пока его результат не станет нужен. В коллекциях поддерживается отложенное исполнение.

    Дополнительные сведения см. в разделах Введение в запросы LINQ (C#) и Отложенное выполнение и отложенное вычисление в LINQ to XML.

Эти языковые возможности будут использованы в образцах кода на протяжении данного раздела.

См. также

Основные понятия

Введение в чисто функциональные преобразования

Сравнение функционального и императивного программирования

Введение в запросы LINQ (C#)

Отложенное выполнение и отложенное вычисление в LINQ to XML