В этой статье я постараюсь показать преимущества функционального подхода к программированию перед ООП. Я буду приводить примеры на VB.NET, но все написанное на 100% подходит и к С#, а частично даже к C++. Итак, в чем же заключается функциональное программирование? Немного копипаста с Википедии: Т.е. в функциональном ЯП функция может вычисляться только на основе ее параметров, в отличии от имперпативного подхода, где функция может обращаться еще и к общим для всех переменным. “Так в чем же преимущества такого подхода?”, — скажите Вы. А преимущества в том, что такие программы ну просто очень легко отлаживать, т.к. на поведение функции влияют только ее аргументы. По этому в случае неправильного поведения программы, стоит Вам найти функцию, которая первой возвратила неправильный результат, и программа, считай, отлажена. Т.к. нужно всего лишь исправить ошибку в ее логике. В императивном языке же все не так просто, там нужно учитывать еще и значения общих для нескольких функций глобальных переменных, которые могли “подпортиться” из-за вызова другой функции. Но это все слова, давайте перейдем к действительно рабочему коду: Код: Module FunctionalProgramming Delegate Function OneParamFunction(Of t)(ByVal param As t) As t Delegate Function TwoParamFunction(Of t)(ByVal param1 As t, ByVal param2 As t) As t Sub Main() WriteAndWait("Sum of squares is " & SqrSum(CInt(Input("Enter start index: ")), CInt(Input("Enter end index: ")), AddressOf Sqr)) End Sub Function SqrSum(ByVal startIndex As Integer, ByVal endIndex As Integer, ByVal func As OneParamFunction(Of Double)) As Double Dim out As Double = 0 'к сожалению, я не нашел способа избавиться от этой переменной For i As Integer = startIndex To endIndex out += func(i) Next Return out End Function Function Sqr(ByVal num As Double) As Double Return Pow(num, 2) End Function Function Pow(ByVal num As Double, ByVal power As Double) As Double Return num * power End Function Function Input(ByVal msg As String) As String Console.Write(msg) Return Console.ReadLine End Function Function WriteAndWait(ByVal msg As String) As Integer Console.WriteLine(msg) Console.Read() Return 0 End Function End Module На первый взгляд, код не очень читабелен, однако это на первый взгляд, да и полностью компенсируется это скоростью отладки полученной программы. В выше приведенном коде, кстати говоря, допущена ошибка(думаю, внимательные читатели уже ее заметили), но предлагаю Вам все же воспользоваться встроенным в VS отладчиком(в частности “Окном интерпретации”) для нахождения ошибки(функции не сильно сложные, и для каждой из них можно подсчитать результат в уме, помните: без работающего мозга Вы уже не программист). Как видите, в коде только одна переменная(параметры в функциональном программировании не являются переменными, они ближе к константантам), да и то, у меня просто не получилось убрать ее из кода. Как и подобает функциональной, наша программа передает в некоторых случаях функции в качестве параметров, для чего применяются делегаты. Так что, на VB.NET вполне можно программировать в функциональном стиле, но нужно ли и оправдано ли это решает уже сам программист. http://resistant-soft.ru/2012/05/пишем-на-vb-net-в-функциональном-стиле/