배경 : 저는 일반적인 정신 모델이 명령형 프로그래밍 인 VB.NET 상점에서 일하는 기능적 프로그래밍을지지합니다. 시스템의 기초가 WinForms이기 때문에 명령형 프로그래밍에서 완전히 벗어날 수는 없지만 여전히 장점을 믿기 때문에 가능한 한 FP (주로 Linq를 통해)를 사용하려고합니다.
FP에 대한 인수 및 반론
유창한 Linq는이 스타일이 다른 시퀀스로 시퀀스를 처리하고이를 반복한다는 점에서 명령 형식에 비해 효율성이 떨어집니다. 일반적으로 명령에 대한 반복 패스를 피하기 위해 더 최적화 할 수있는 명령 방식보다 몇 번 더 패스를 수행합니다. 이러한 이유로, 리드는 왜 "효율적이지 않은"기능적 접근 방식을 선택해야하는지 이해할 수 없었습니다.
- 반박 론 : CPU 사이클 측면에서는 때로는 비효율적이지만 각 줄이 시퀀스를 통과하는 동안 한 줄만 수행하기 때문에 인간이 이해하기 쉽고 따르기가 쉽다고 생각했습니다. 나에게 이것은 스테이션의 각 사람이 할 일이 하나 뿐인 조립 라인을 갖는 느낌이 든다. 효율성의 무시할만한 트레이드 오프는 우려가 깔끔하게 분리 된 코드로 다시 보상된다고 생각합니다.
내 상점에서 FP에 대해 듣는 다음 주장은 디버깅하기가 더 어렵다는 것입니다. Linq 코드를 넘어가는 것은 쉽지 않습니다. 그리고 나는 즉시 발견 할 수없는 문제를 더 잘 따르고 해부하기 위해 때로는 메소드 체인을 풀어야합니다.
- _Counter-argument : 기능적 스타일이 읽는 방식과 기능적 체인 내에서 오류가 발생할 때 기능적 스타일이 더 선언적이라고 생각하기 때문에 대부분 문제가 없지만, 일반적으로 문제를 즉시 발견 할 수 있습니다.
내 질문
나는 우리 가게에서 기능적 스타일을 홍보하려고 노력하고 있는데, 나는 진전을 만들고있는 것처럼 느끼지 않습니다. 나는 두 가지 프로그래밍 스타일을 모두 수행했으며 최근에 Haskell을 다루었습니다. 수년간의 필수 경험에도 불구하고 JavaScript에서 FP를 일상적으로 사용하고 있기 때문에 나에게 자라났습니다. 명령형 스타일에 집착했을 때 내가했던 것과 비교할 때 내 핵심에 올바른 메모가 울립니다. 나는 기능적 사고, 기능적 구성으로 두뇌를 재 훈련했다.
내가 이해할 수없는 것은 다른 사람들이 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