Передумови: Я прихильник функціонального програмування, який працює в магазині VB.NET, де переважаючою ментальною моделлю є імперативне програмування. Будучи такою основою нашої системи WinForms, я можу зрозуміти, що ми не збираємося повністю відійти від імперативного програмування, але все ж намагаюся використовувати FP (в першу чергу через Linq), де це можливо, тому що я вірю в її достоїнства.
Аргументи та контраргументи проти ФП
Можна помітити, що вільний Linq є менш ефективним, ніж його імперативний аналог, оскільки цей стиль обробляє послідовність до іншої послідовності і повторює це. Як правило, для цього потрібно пройти ще кілька пропусків, ніж імперативний підхід, який можна краще оптимізувати, щоб уникнути повторних проходів за послідовністю. З цієї причини ведуча не могла зрозуміти, чому я б обрала функціональний підхід, який явно є "менш ефективним".
- Контраргумент : Я стверджував, що, хоча іноді він менш ефективний з точки зору циклів процесора, я вважаю, що це більш зрозуміло і легко прослідкувати, оскільки кожен рядок робить лише одну річ під час проходження по послідовності. Мені таке відчуття, як мати конвеєр, де кожен чоловік на своїй станції має лише одну роботу. Я відчуваю, що мізерна торгівля ефективністю компенсується кодом, питання якого чітко розділені.
Наступний аргумент проти 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