함수형 프로그래밍보다 명령형 프로그래밍이 선호되는 이유는 무엇입니까? [닫은]


13

배경 : 저는 일반적인 정신 모델이 명령형 프로그래밍 인 VB.NET 상점에서 일하는 기능적 프로그래밍을지지합니다. 시스템의 기초가 WinForms이기 때문에 명령형 프로그래밍에서 완전히 벗어날 수는 없지만 여전히 장점을 믿기 때문에 가능한 한 FP (주로 Linq를 통해)를 사용하려고합니다.

FP에 대한 인수 및 반론

  1. 유창한 Linq는이 스타일이 다른 시퀀스로 시퀀스를 처리하고이를 반복한다는 점에서 명령 형식에 비해 효율성이 떨어집니다. 일반적으로 명령에 대한 반복 패스를 피하기 위해 더 최적화 할 수있는 명령 방식보다 몇 번 더 패스를 수행합니다. 이러한 이유로, 리드는 왜 "효율적이지 않은"기능적 접근 방식을 선택해야하는지 이해할 수 없었습니다.

    • 반박 론 : CPU 사이클 측면에서는 때로는 비효율적이지만 각 줄이 시퀀스를 통과하는 동안 한 줄만 수행하기 때문에 인간이 이해하기 쉽고 따르기가 쉽다고 생각했습니다. 나에게 이것은 스테이션의 각 사람이 할 일이 하나 뿐인 조립 라인을 갖는 느낌이 든다. 효율성의 무시할만한 트레이드 오프는 우려가 깔끔하게 분리 된 코드로 다시 보상된다고 생각합니다.
  2. 내 상점에서 FP에 대해 듣는 다음 주장은 디버깅하기가 더 어렵다는 것입니다. Linq 코드를 넘어가는 것은 쉽지 않습니다. 그리고 나는 즉시 발견 할 수없는 문제를 더 잘 따르고 해부하기 위해 때로는 메소드 체인을 풀어야합니다.

    • _Counter-argument : 기능적 스타일이 읽는 방식과 기능적 체인 내에서 오류가 발생할 때 기능적 스타일이 더 선언적이라고 생각하기 때문에 대부분 문제가 없지만, 일반적으로 문제를 즉시 발견 할 수 있습니다.

내 질문

나는 우리 가게에서 기능적 스타일을 홍보하려고 노력하고 있는데, 나는 진전을 만들고있는 것처럼 느끼지 않습니다. 나는 두 가지 프로그래밍 스타일을 모두 수행했으며 최근에 Haskell을 다루었습니다. 수년간의 필수 경험에도 불구하고 JavaScript에서 FP를 일상적으로 사용하고 있기 때문에 나에게 자라났습니다. 명령형 스타일에 집착했을 때 내가했던 것과 비교할 때 내 핵심에 올바른 메모가 울립니다. 나는 기능적 사고, 기능적 구성으로 두뇌를 재 훈련했다.

내가 이해할 수없는 것은 다른 사람들이 FP의 장점을 확신시키는 것이 얼마나 힘든지입니다.

예를 들어, 상점의 개발자는 Linq를 사용하지만 일반적으로 도메인 데이터를 처리 할 때이를 사용한다고 생각합니다. 나는 더 일반적인 의미로 사용하고 시퀀스 / 목록 또는 지속적인 데이터 구조를 다룰 때 언제든지 선호합니다. 팀원들이 Linq 사용을 확대하도록 설득 할 수 없었습니다.

내가 이해하려고하는 것은 개발자가 FP를 좋아하지 않는 원인입니다.

FP에 대한 경험이 많지만 명령형 스타일을 선호하기로 결정한 사람의 답변을보고 싶습니다. 기능을 사용하는 대신 명령을 유지하기로 한 결정은 무엇입니까?


다음은 명령형 함수형 함수형 함수형 함수의 차이점을 강조한 추가 예입니다.

SelectedRowsLinq에서 그리드 의 방법을 다음과 같이 썼습니다 .

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 혼란이 4 개의 라인 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)));

함수형 프로그래밍에는 코딩 방식과이 코드의 실행 방식에 대해 다르게 생각해야합니다. 이것은 학생들이 대학에서 말하는 방식은 거의 아니며, 나쁜 습관을들이 마시면 ​​변경하기가 어렵습니다.

함수형 프로그래밍에는 초보자 에게도 위험 할 수있는 고유 한 기능이 있습니다 . 게으른 평가는 그 중 하나이며, 왜 게으른 평가가 훌륭한 기능이며 왜 귀찮은 지 이해하기 시작하는 데 몇 달이 걸릴 수 있습니다.

그래서 많은 초보자들이 Haskell과 같은 언어가 아닌 PHP와 같은 언어로 프로그래밍을 시작하는 이유이기도합니다.


8
나는 Scheme이 인트로 코스에 사용되는 대학에서 반대 경험을했습니다. 학생들이 Java 또는 C #을 배워야했을 때 Scheme이 더 읽기
쉽다고

2
그건 내 요점을 증명해 명령형 프로그래밍과 OOP를 몇 년 동안 배운 학생들은 더 읽기 쉽습니다. FP로 시작한 사람들은 명령형 프로그래밍에 비해 더 읽기 쉽습니다. FP와 비 FP 패러다임을 잘 아는 학생들에게 어떤 일이 일어나는지 아는 것이 흥미로울 것입니다.
Arseni Mourzenko

1
주요 문제는 기능 언어가 많이 추상화된다는 것입니다. Haskeller가 평가하지 않은 썽크를 축적하여 메모리가 부족하다고 말하면 분명히 잘못된 것이 있습니다. 많은 알고리즘이 기능적 스타일로 작성 될 때 비효율적입니다. 빠른 Quicksort impl을 구현할 수 없습니다. 관용적 하스켈에서. 모든 인플레 이스 알고리즘은 우수한 성능을 얻기 위해 IO 어레이를 수행합니다. 기능적 언어는 언어 순수 주의자를위한 것이며, 명령형 언어는 시간 내에 생각을하고 싶은 사람들을위한 것입니다.
Kr0e

3
@ Kr0e : 언어 나 패러다임에 대한“추상적 인 말이 너무 많다”는 주장은 항상 나에게 이상해 보인다. 모든 (또는 대부분의) 언어에 대해 동일한 주장이 사용되었습니다. 현재 대부분의 소프트웨어가 어셈블러로 작성되지 않았 으면합니다.
Arseni Mourzenko

6
"기능적 언어는 언어 순수 주의자를위한 것이고, 명령형 언어는 제때에 생각을하고 싶은 사람들을위한 것입니다.": 내 경험에 따르면 이것은 사실이 아닙니다. 기능적 언어를 사용하여 더 빠르게 작업을 수행 할 수 있습니다. 명령형 스타일은 훨씬 더 장황하고 선언적이지 않으며 명령형 언어를 사용해야 할 때 일을 올바르게하기 전에 더 많은 반복이 필요합니다.
Giorgio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.