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

13

Фон: я сторонник функционального программирования, который работает в магазине VB.NET, где преобладающей ментальной моделью является императивное программирование. Поскольку основой нашей системы является WinForms, я могу понять, что мы не собираемся полностью уходить от императивного программирования, но все же я стараюсь использовать FP (главным образом через Linq) везде, где это возможно, потому что верю в его достоинства.

Аргументы и контраргументы против FP

  1. Можно заметить, что беглый Linq менее эффективен, чем его императивный аналог, поскольку этот стиль обрабатывает последовательность до другой последовательности и повторяет ее. Как правило, это займет несколько больше проходов, чем императивный подход, который можно лучше оптимизировать, чтобы избежать повторных проходов по последовательности. По этой причине руководитель не мог понять, почему я выбрал бы функциональный подход, который явно «менее эффективен».

    • Контр-аргумент : я утверждал, что, хотя иногда он менее эффективен с точки зрения циклов ЦП, я чувствовал, что он более понятен человеку и его легко понять, поскольку каждая строка выполняет только одну вещь при прохождении последовательности. Для меня это похоже на сборочную линию, где у каждого человека на его станции есть только одна работа. Я чувствую, что незначительный компромисс эффективности компенсируется кодом, чьи проблемы четко разделены.
  2. Следующий аргумент против FP, который я слышу в своем магазине, заключается в том, что его сложнее отлаживать - и это правда. Нелегко перешагнуть через код Linq. И мне иногда приходится распутывать цепочку методов, чтобы лучше отслеживать и анализировать проблемы, которые я не могу сразу заметить.

    • _Counter-аргумент: по большей части, хотя у меня нет проблем с этим, потому что я думаю, что функциональный стиль более декларативен в том, как он читает, и когда выдается ошибка в функциональной цепочке, я обычно могу сразу определить проблему.

Мой вопрос

Я пытался продвигать функциональный стиль в нашем магазине, и я не чувствую, что продвигаюсь вперед. Я занимался обоими стилями программирования и только недавно баловался с Haskell. Несмотря на многолетний опыт, теперь, когда я регулярно использую FP в JavaScript, он вырос на мне. Когда я сравниваю это с тем, что я мог бы сделать, если бы придерживался императивного стиля, это звучит как примечание правильности в моей сути. Я переучил свой мозг на функциональное мышление, на функциональную композицию.

Я не могу понять, как трудно убедить других в достоинствах ФП.

Например, разработчики в моем магазине используют Linq, но я думаю, что они обычно используют его в контексте работы с данными домена. Я использую это в более общем смысле и предпочитаю это всякий раз, когда имею дело с последовательностями / списками или постоянными структурами данных. Я не смог убедить своих товарищей по команде расширить использование Linq.

Я пытаюсь понять, что заставляет разработчика не любить FP.

Я хотел бы получить ответ от кого-то, кто имеет большой опыт работы с FP, но решил в пользу императивного стиля. Что привело к решению остаться с императивом вместо использования функционала?


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

Я написал SelectedRowsметод нашей сетки в Linq как таковой:

Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows
    Get
        Return Me.ugrBase.Selected.Rows.
            OfType(Of Infragistics.Win.UltraWinGrid.UltraGridRow)().
            Select(Function(ugr) ugr.ListObject).
            OfType(Of DataRowView)().
            Select(Function(drv) drv.Row).
            ToArray
    End Get

Однако этот стиль кода делает некоторых наших разработчиков неудобными, и поэтому наше руководство переписало его на более привычное:

Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows
    Get
        Dim plstRows As New List(Of DataRow)
        For Each bugrLoop As Infragistics.Win.UltraWinGrid.UltraGridRow In Me.ugrBase.Selected.Rows
            If bugrLoop.ListObject IsNot Nothing Then
                plstRows.Add(CType(bugrLoop.ListObject, DataRowView).Row)
            End If
        Next
        Return plstRows.ToArray()
    End Get
Марио Т. Ланца
источник
Мне нравится функциональное программирование, но при быстром взгляде на код я бы предпочел «императивный» (я называю декларативный ) подход. Мне гораздо легче читать - если это может быть моим опытом и продуктом моей среды. Тем не менее, через 5 секунд я могу видеть подготовительные шаги и то, что возвращается. Я вижу, что есть петля, и знаю, что в этих изменениях, скорее всего, произойдут корректировки. Мне не нужно отслеживать определения функций; это там, это просто. Но FP чище и, пройдя кривую обучения, вероятно, будет так же быстро программировать.
Vol7ron
Это проблема обучения, особенно при работе с людьми, которые знают «достаточно» многих языков. Если я специализируюсь на каком-то конкретном языке, я уверен, что FP будет лучшей первой попыткой. Тогда, если бы были неэффективности (производительность модульного теста), можно было бы быть более явным в их реализациях.
Vol7ron

Ответы:

11

Функциональное программирование слишком сложно для неопытных программистов . Одна из иллюстраций - это тот , где студенты заявили, что беспорядок 30-LOC был легче и более интуитивно понятен по сравнению с четырехстрочным аналогом FP.

(Это оригинальная версия примера FP, поскольку ответ в ссылке был недавно отредактирован, чтобы его было немного легче читать.)

return this.Data.Products
    .Where(c => c.IsEnabled)
    .GroupBy(c => c.Category)
    .Select(c => new PricesPerCategory(category: c.Key, minimum: c.Min(d => d.Price), maximum: c.Max(d => d.Price)));

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

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

Вот почему так много начинающих начинают программирование на таких языках, как PHP, а не на таких языках, как Haskell.

Арсений Мурзенко
источник
8
У меня был противоположный опыт в университете, где Схема используется для вступительного курса. Когда студенты должны были изучать Java или C #, большинство жаловалось, что схема была более читабельной
Даниэль Гратцер,
2
Это доказывает мою точку зрения. Студенты, которые изучали императивное программирование и ООП в течение многих лет, сочтут его более читабельным. Люди, которые начали с FP, найдут его более читабельным по сравнению с императивным программированием. Было бы интересно узнать, что происходит со студентами, которые одинаково хорошо знают парадигмы FP и не FP.
Арсений Мурзенко
1
Основная проблема заключается в том, что функциональные языки абстрактны для многих. Когда Хаскеллер говорит вам, что вам не хватило памяти, потому что вы накопили неоцененные блоки, тогда определенно что-то не так. Многие алгоритмы неэффективны, когда они написаны в функциональном стиле. Вы не можете реализовать быстрый импл. в идиоматическом хаскеле. Каждый алгоритм на месте заканчивается выполнением массивов ввода-вывода, чтобы получить хорошую производительность. Функциональные языки для языковых пуристов, императивные языки для людей, которые хотят, чтобы мысли были сделаны вовремя.
Kr0e
3
@ Kr0e: аргумент «слишком много абстрагирует» против языка или парадигмы всегда кажется мне странным. Тот же аргумент использовался против всех (или большинства) языков; надеюсь, большинство программ не написано на ассемблере сегодня.
Арсений Мурзенко,
6
«Функциональные языки для языковых пуристов, императивные языки для людей, которые хотят, чтобы мысли были сделаны вовремя». По моему опыту, это не так. Я могу делать вещи быстрее, используя функциональные языки. Императивный стиль гораздо более многословен и менее декларативен, и когда мне приходится использовать императивный язык, мне определенно нужно больше итераций, прежде чем я все уладю.
Джорджио