Основные понятия и терминология (функциональное преобразование) (LINQ to XML)
В этой статье описываются понятия и терминология чистых функциональных преобразований. Функциональный подход преобразования к преобразованию данных дает код, который часто быстрее программирует, более экспрессивно и упрощает отладку и обслуживание, чем более традиционное, императивное программирование.
Обратите внимание, что статьи в этом разделе не предназначены для полного объяснения функционального программирования. Вместо этого эти статьи определяют некоторые функциональные возможности программирования, которые упрощают преобразование XML из одной фигуры в другую.
Что такое чистое функциональное преобразование
При чисто функциональном преобразовании набор функций, называемых чистыми функциями, определяет способ преобразования набора структурированных данных из одной формы в другую. Слово "pure" указывает, что функции являются составными, что требует, чтобы они были:
- Замкнутые, то есть они должны свободно упорядочиваться и переупорядочиваться без вовлечения остальных частей программы и взаимных зависимостей от них. Чистые преобразования не имеют представления о своей среде и не влияют на нее. Иными словами, использованные при преобразовании функции не имеют побочных эффектов.
- Без учета состояния, то есть исполнение одной и той же функции или определенного набора функций с одинаковыми входными данными будет всегда приводить к одинаковым выходным данным. Чистые преобразования не знают о предыдущих использованиях.
Внимание
До конца данного учебника термин «чистая возможность» используется в основном для указания подхода к программированию, а не специальной характеристики языка.
Обратите внимание, что чистые функции должны быть реализованы как методы в C#, а также как функции в Visual Basic.
Не следует путать чистые функции с чистыми виртуальными методами в C++. Второй случай показывает, что содержащийся класс абстрактный и текст метода не указан.
Функциональное программирование
Термин функциональное программирование обозначает такой подход к программированию, при котором непосредственно поддерживаются чисто функциональные преобразования.
Исторически языки функционального программирования общего назначения, такие как ML, Scheme, Haskell и F#, представляли интерес в первую очередь для научного сообщества. Хотя всегда можно было писать чистые функциональные преобразования в C# и Visual Basic, трудности этого не сделали его привлекательным вариантом для большинства программистов. Однако в последних версиях этих языков новые конструкции языка, такие как лямбда-выражения и вывод типов, делают функциональное программирование гораздо проще и эффективнее.
Дополнительные сведения о функциональном программировании см. в статье "Функциональное программирование и императивное программирование".
Языки функционального программирования для конкретного домена
Хотя общие функциональные языки программирования не были широко приняты, некоторые языки функционального программирования для конкретного домена имели лучший успех. Например, каскадные таблицы стилей (CSS) используются для определения внешнего вида и внешнего вида многих веб-страниц, а таблицы стилей XSLT широко используются в обработке xml-данных. Дополнительные сведения об XSLT см. в разделе Преобразования XSLT.
Терминология
В следующем списке определены некоторые термины, связанные с функциональными преобразованиями.
Функция более высокого порядка (первый класс)
Функция, которая может быть интерпретирована как программный объект. Например, функция высокого порядка может быть передана и возвращена другими функциями. В C# и Visual Basic делегаты и лямбда-выражения — это языковые функции, поддерживающие функции более высокого порядка. Для написания функции высокого порядка необходимо объявить один или несколько аргументов для принятия делегатов, при этом обычно используются лямбда-выражения. Многие стандартные операторы запроса являются функциями высокого порядка.
Дополнительные сведения см. в обзоре стандартных операторов запросов (C#) и стандартных операторах запросов (Visual Basic).
лямбда-выражение
По сути это встроенная анонимная функция, которая может использоваться, когда тип делегата неизвестен. Это упрощенное определение лямбда-выражений, но оно достаточно для целей этого руководства.
Дополнительные сведения см. в лямбда-выражениях (руководство по программированию на C#) и лямбда-выражениях (Visual Basic)).
Коллекции
Структурированный набор данных обычно стандартного типа. Для обеспечения совместимости с LINQ коллекция должна реализовывать интерфейс IEnumerable или интерфейс IQueryable (или один из их основных прототипов IEnumerator<T> или IQueryable<T>).
кортеж (анонимные типы)
Как математическое понятие, кортеж представляет собой конечную последовательность объектов, каждый определенного типа. Кортеж называется также упорядоченным списком. Анонимные типы представляют собой языковую реализацию этой концепции, которая позволяет объявить класс неименованного типа и одновременно создать экземпляр объекта этого типа.
Дополнительные сведения см. в разделе "Анонимные типы" (руководство по программированию на C#) и анонимные типы (Visual Basic).
вывод типа (неявное ввод)
Возможность компилятора определить тип переменной при отсутствии явной декларации типа.
Дополнительные сведения см. в разделе "Неявно типизированные локальные переменные" (руководство по программированию на C#) и "Вывод локальных типов" (Visual Basic).
отложенное выполнение и отложенное вычисление
Задержка вычисления выражения до тех пор, пока его результат не станет нужен. В коллекциях поддерживается отложенное исполнение.
Дополнительные сведения о C# см. в разделе "Общие сведения о запросах LINQ(C#) и отложенном выполнении и отложенной оценке в LINQ to XML (C#)".
Дополнительные сведения о Visual Basic см. в статьях "Базовые операции запросов" (Visual Basic) и "Отложенное выполнение" и "Отложенная оценка" в LINQ to XML (Visual Basic).
Эти языковые возможности будут использованы в образцах кода на протяжении данного раздела.