Фон: я сторонник функционального программирования, который работает в магазине VB.NET, где преобладающей ментальной моделью является императивное программирование. Поскольку основой нашей системы является WinForms, я могу понять, что мы не собираемся полностью уходить от императивного программирования, но все же я стараюсь использовать FP (главным образом через Linq) везде, где это возможно, потому что верю в его достоинства.
Аргументы и контраргументы против FP
Можно заметить, что беглый Linq менее эффективен, чем его императивный аналог, поскольку этот стиль обрабатывает последовательность до другой последовательности и повторяет ее. Как правило, это займет несколько больше проходов, чем императивный подход, который можно лучше оптимизировать, чтобы избежать повторных проходов по последовательности. По этой причине руководитель не мог понять, почему я выбрал бы функциональный подход, который явно «менее эффективен».
- Контр-аргумент : я утверждал, что, хотя иногда он менее эффективен с точки зрения циклов ЦП, я чувствовал, что он более понятен человеку и его легко понять, поскольку каждая строка выполняет только одну вещь при прохождении последовательности. Для меня это похоже на сборочную линию, где у каждого человека на его станции есть только одна работа. Я чувствую, что незначительный компромисс эффективности компенсируется кодом, чьи проблемы четко разделены.
Следующий аргумент против 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