Чому імперативне програмування віддається перевазі функціональному програмуванню? [зачинено]


13

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

Аргументи та контраргументи проти ФП

  1. Можна помітити, що вільний Linq є менш ефективним, ніж його імперативний аналог, оскільки цей стиль обробляє послідовність до іншої послідовності і повторює це. Як правило, для цього потрібно пройти ще кілька пропусків, ніж імперативний підхід, який можна краще оптимізувати, щоб уникнути повторних проходів за послідовністю. З цієї причини ведуча не могла зрозуміти, чому я б обрала функціональний підхід, який явно є "менш ефективним".

    • Контраргумент : Я стверджував, що, хоча іноді він менш ефективний з точки зору циклів процесора, я вважаю, що це більш зрозуміло і легко прослідкувати, оскільки кожен рядок робить лише одну річ під час проходження по послідовності. Мені таке відчуття, як мати конвеєр, де кожен чоловік на своїй станції має лише одну роботу. Я відчуваю, що мізерна торгівля ефективністю компенсується кодом, питання якого чітко розділені.
  2. Наступний аргумент проти FP, який я чую в своєму магазині, - це те, що важче налагоджувати - що правда. Перейти через код Linq непросто. І мені іноді доводиться розгадувати ланцюжок методів, щоб краще слідувати та розсікати проблеми, які я не можу одразу помітити.

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

Моє запитання

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

Я не можу зрозуміти, наскільки важко було переконати інших у заслугах FP.

Наприклад, розробники в моєму магазині використовують 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 секунд я бачу попередні кроки та те, що повертається. Я можу бачити цикл і знаю, що коригування цих даних швидше за все відбудеться в ньому. Мені не потрібно відстежувати визначення функцій; це там, це просто. Але ПП чистіший і колись пройде криву навчання, мабуть, буде так само швидко кодувати.
vol7ron

Саме крива навчання - це питання, особливо при роботі з людьми, які знають лише "достатньо" багатьох мов. Якщо я спеціалізуюся на будь-якій конкретній мові, я впевнений, що FP буде кращою першою спробою. Тоді, якби були неефективність (продуктивність тестових одиниць), можна було б бути більш чіткими в їх реалізації.
vol7ron

Відповіді:


11

Функціональне програмування є занадто складним для недосвідчених програмістів . Однією з ілюстрацій є ця , де студенти заявили, що безлад з 30-ти місцевим освоєнням легше та інтуїтивніше зрозуміти порівняно з чотирма лініями 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
Основна проблема полягає в тому, що функціональні мови абстрактні багатьом. Коли Haskeller каже вам, що у вас закінчилося пам'ять, тому що ви накопичили неоцінені громи, то, безумовно, щось не так. Дуже багато алгоритмів неефективні, коли вони написані у функціональному стилі. Ви не можете реалізувати швидкий імпульс Quicksort. в ідіоматичному Хаскелл. Кожен алгоритм на місці закінчується виконанням масивів вводу-виводу, щоб отримати хороші показники. Функціональні мови призначені для пуристів мови, імперативні мови - для людей, які хочуть вчасно задуматися.
Kr0e

3
@ Kr0e: аргумент "занадто рефератів" проти мови чи парадигми мені завжди виглядає дивним. Той самий аргумент був використаний проти всіх (або більшості) мов; сподіваємось, більшість програмного забезпечення сьогодні не написано в Assembler.
Арсеній Муренко

6
"Функціональні мови - це для пуристів, імперативні мови - для людей, які хочуть вчасно задуматися.": Згідно з моїм досвідом, це неправда. Я можу зробити це швидше, використовуючи функціональні мови. Стиль імперативу набагато більш багатослівний і менш декларативний, і коли мені доводиться використовувати імперативну мову, я, безумовно, потребую більше ітерацій, перш ніж все вийде правильно.
Джорджіо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.