Пишем на VB.NET(/C#) в функциональном стиле

Тема в разделе "Статьи", создана пользователем j0sur, 29 май 2012.

  1. j0sur
    j0sur Новичок
    Симпатии:
    7
    В этой статье я постараюсь показать преимущества функционального подхода к программированию перед ООП. Я буду приводить примеры на 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 вполне можно программировать в функциональном стиле, но нужно ли и оправдано ли это решает уже сам программист.

     
    29 май 2012
Загрузка...