기능적 언어의 UI 패턴


11

ClojureScript를 다루고 싶지만 몇 가지 점에 대해 의아해합니다. 내 문제는 기능적으로 작업하려고 할 때 사용자 상호 작용으로 인한 상태 변경을 처리하는 좋은 방법입니다.

몇 가지 예를 들어 보겠습니다. 브라우저에서 실행되는 응용 프로그램을 염두에두고 있지만 문제가 더 일반적이라고 생각합니다. 물론 적어도 DOM이 바뀌고 있습니다. 그러나 변경 할 수없는 데이터 구조로 작업하기 위해 나머지 코드를 구성하는 방법을 찾고 싶습니다.

1) 일부 이벤트를 일부 DOM 객체에 첨부하고 싶다고 가정 해보십시오. 대부분의 기능적인 방식으로 수행하기는 어렵지 않습니다. 노드를 만들 때 다양한 이벤트 처리기를 사용하여 해시 맵을 연결합니다. 그러나 이벤트 위임을 사용하는 경우를 고려하십시오. 그런 다음 새 노드를 작성할 때 이미 존재하는 일부 상위 노드에 이벤트 핸들러를 첨부 할 수 있습니다. 따라서 기존 노드와 관련된 해시를 변경해야합니다.

2) 입력 필드에 자동 완성 모듈을 설계한다고 가정 해보십시오. 사용자가 키를 누를 때마다 서버에 전화를 걸어 제안을 얻을 수 있습니다. 이것은 쉬워요. 그러나 이제 조금 최적화하고 싶다고 가정 해보십시오. 일치하는 모든 결과를 알고 있으면 일치하는 모든 결과를 foo다시 요청할 필요가 없습니다 foobar. 나는 전자를 필터링 할 수 있습니다. 그래서 일종의 캐시를 만들어야합니다. 이 캐시는 사용자가 이전에 입력 한 단어의 수퍼 세트가 아닌 새 단어를 삽입 할 때마다 업데이트됩니다. 다시 : 캐시를 어떻게 모델링합니까? 가장 합리적인 방법은 단어를 결과에 매핑하는 해시 맵인 것처럼 보이지만 변경할 수 있어야합니다.

사용자 상호 작용으로 인한 변경 사항을 기능적 디자인에 쉽게 통합 할 수있는 패턴을 제안 할 수 있습니까?


4
"기능적 반응성 프로그래밍"을 찾아보십시오.
dan_waterworth

이것은 똑같지는 않지만 사용자가 시작한 DOM 이벤트와 일치하는 (부작용이없는) XSLT 템플릿을 사용하면 Saxon-CE에서도 비슷한 문제에 직면하게됩니다. 내가보고 싶은 방법은 사용자가 XSLT가 아닌 상태 변경을 트리거하여 Ok와 비슷하다는 것입니다. 핵심은 사용자 상호 작용을 관리하는 코드와 이후의 상태 변경을 나머지 코드와 매우 분리시키는 것입니다.
pgfearo

@pgfearo 사용자 상호 작용이 나머지 부분과 충분히 분리되도록 코드를 구성하는 방법에 대한 조언이 있습니까?
Andrea

기능 프로그래밍 은 상태 비 저장 이므로 기능적으로 작업 할 때 상태 변경을 처리하는 좋은 방법은 없습니다 .
Old Pro

3
@Old Pro : 이것은 완전히 정확하지 않습니다. 함수형 프로그래밍에서는 부작용 대신 함수형 응용 프로그램을 사용하여 계산을 정의하지만 결국 계산 결과를 어딘가에 저장해야합니다. FP의 초점은 상태 사용을 최소로 제한하는 반면, 명령형 프로그래밍에서는 상태를 점진적으로 (부작용별로) 변환하는 것이 계산을 정의하는 기본 도구입니다.
조르지오

답변:


3

주석에서 언급했듯이 "기능적 반응성 프로그래밍"을 찾아야하며 http://prog21.dadgum.com/archives.html 의 게시물도 읽어야 합니다. 보다 구체적으로 , " 기술과 사랑에 빠지지 마십시오 ", " 방금 배운대로 코드 작성 ", " 기능적 프로그래밍이 작동하지 않습니다 (그리고 그에 대한 조치) ", 그리고 아마도 다른 몇 가지.

변경 성과 부작용을 완전히 피하는 것은 사실상 불가능합니다. 심지어 Haskell 프로그래머조차도 unsafePerformIO순전히 기능적이고 부작용이없고 정적으로 유형이 지정된 패러다임을 벗어나 특정 작업을 수행하는 데 사용합니다. 이 프로젝트를 순전히 학업으로 시작한다면 가능한 한 많은 변경과 부작용을 피하십시오. 그러나 마감일에 사용 가능한 제품을 만들려고하면 아무런 패턴도 저장되지 않을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.