문제

도움이 필요 내가 머리 주위의 차이는 현재 OOP 개념의 상태,그리고 그 방법은 것에서 수행하는 기능적인 언어는 다음과 같켈 또는 Clojure.

을 사용하여 독자를 들어,우리가 다루는 간소화된 은행 계좌를 개체/구조/무엇입니다.에 OOP 언어 죽이려고 했는데 일부는 클래스에 대한 참조를 BankAccount 것 인스턴스의 변수와 같은 것들에 대한 이자율,그리고 방법은 다음과 같 setInterestRate()변화하는 객체의 상태와 일반적으로 아무것도 반환하지 않습니다.에서 말 Clojure,나는 은행이 계정 구조체(영광 hashmap),그리고 특별한 기능이 걸리는 은행이 계정 매개변수와 다른 정보에 돌아와 새로운 구조체.그래서 변경하는 대신 상태를 원래의 개체,나는 이제 새로운 하나의 반환되는 원하는 수정할 수 있습니다.

그래서...나는 무엇을 할까요?덮어쓰기는 어떤 변수를 참조하 old bank-account?는 경우 그렇다는 이점을 통해 상태 변경 OOP 접근법?끝에서,두 경우 모두,그것은 보인다는 변수를 참조하는 객체를 필요한 변경을 수행합니다.지체로,나는 막연한의 개념을 무슨 일이 일어나고 있는지.

제가 희망하는,어떤 도움을 주셔서 감사합니다!

도움이 되었습니까?

해결책

에서는 순수한 기능적인 스타일 덮어쓰지 않는 어떤 변수가 있습니다.

비유 하는 것은 시공간에서 물리학을 전공하고 있습니다.고려하는 경우 등 세계 3d,그 개체 없어 고정 위치들은 시간이 지남에 따라 이동.을 가져올 수학을 부담에 물리적인 세계,우리가 추가 따라서 시간 차원을 고려한 값이 다양한 특성의 특정 시간에.이렇게 우리들의 연구 상수입니다.마찬가지로 프로그래밍에서,이 개념은 단순하게 될 작업에 의해 변경할 수 없는 값입니다.객체 id 를 가진 현실 세계에서 모델링할 수 있습의 순서로 변경할 수 없는 값(국에 있는 개체의 증가 시간)보다는 오히려 단일 값으로는 변경합니다.

의 코스의 세부 사항을 연결하는 방법을 순서의 값을"object id"수 있는 작은 털이.켈가 을 사용해 는 모델 상태입니다. 기능적인 반응성 프로그램 더 리터럴도에서 객체를 모델링에서 세계와 순수한 기능 업데이트,제가 생각하는 것은 매우 유망한 방향으로한 프로그래밍입니다.

내가 주는 Clojure 과는 달리,Haskell,지 않은 순수하고,업데이트할 수 있는 변수로 당신을 제안합니다.는 경우에만 업데이트하는 몇 가지 변수에는 높은 수준에서,당신은 여전히 아마도 즐길 수 있는 많은 개념은 단순한 혜택의 기능적인 프로그래밍입니다.

다른 팁

아마도 OO 세계에서는 루프가 있으며 요청에 대한 응답으로 이러한 은행 계좌를 반복해서 수정하고 있습니다. 전체 계정 포트폴리오가 있다고 가정 해 봅시다. 그리고 이들은 유형 포트폴리오를 가지고 있다고 가정 해 봅시다. 그런 다음 Haskell에서는 순수한 기능을 작성합니다

updatePortfolio :: Request -> Portfolio -> Portfolio

또한 기본 루프는 표준 입력의 요청을 읽고 포트폴리오를 최신 상태로 유지할 수 있습니다. (포트폴리오를 작성할 수 없다면이 예제는 많이 사용되지 않지만 더 간단합니다.)

readRequest :: IO Request  -- an action that, when performed, reads a Request with side effects

main :: Portfolio -> IO ()  -- a completely useless program that updates a Portfolio in response to a stream of Requests

main portfolio = do req <- readRequest
                    main (updatePortfolio req)

그리고 지금은 당신이 당신의 돌연변이 상태에 무슨 일이 있었는지 알기를 바랍니다 : 일반적인 기능 프로그램에서, 변화가 함수의 매개 변수로 전달된다는 상태. State Changess는 새로운 기능 호출을합니다. 호출은 꼬리 위치에 있으며 ( '적절한 꼬리 호출'을 찾을 수 있음) 추가 리소스를 사용하지 않으며 실제로 컴파일러가 어셈블리 코드를 생성 할 때 루프를 생성하고 포인터를 유지합니다. 레지스터에서 끊임없이 변화하는 포트폴리오.

이것은 매우 장난감의 예이지만 기능적 언어의 맛을 약간 제공하기를 바랍니다.

그래서 ... 나는 그것으로 무엇을합니까? 기존 은행 계정을 참조하는 변수를 덮어 쓰나요?

그렇다면 상태를 바꾸는 OOP 접근 방식에 비해 장점이 있습니까?

그 구조물에서 당신이하는 모든 행동의 계산에 오랜 시간이 걸리고 중간에 무언가가 발생하고 원래 구조물로 되돌아 가야한다고 가정 해 봅시다. 당신이 나에게 OO에 대해 제시 한 해석 (참조를 사용하여 불변의 OO 언어를 가질 수 있기 때문에) 데이터는 손상 될 수 있습니다. 실패한 기능 호출로부터 충분한 정보가 제공되지 않는 한, 실패를 제안 할 수 있습니다. 심하게. 기능적 접근 방식에서는 원래 데이터 구조가 정확하다는 것을 확실히 알고 있습니다. 처음에는 사본을 만들었 기 때문입니다.

다중 스레드 애플리케이션 에서이 시나리오를 확장하십시오. 우리는 우리 모두가 우리 자신의 버전을 가지고 있기 때문에 다른 사람이 우리가있는 데이터 구조를 사용하지 않도록 할 수 있습니다.

또한 복사하는 다른 구조의 데이터를 사용하여 공간을 절약 할 수 있습니다. 전형적인 예는 목록의 헤드에 요소를 추가 할 때입니다. 두 번째 요소에 대한 포인터가 있고 첫 번째 요소에 대한 포인터가있는 경우 첫 번째 크기만으로 두 목록을 참조 할 수 있습니다 (아래 참조). 불변성이 없으면 우리는 이것을 보장 할 수 없습니다.

        b__
           |  
a -> [6|] -+-> [5|] -> [4|] -> [3|] -> [2|] -> [1|x]

순수한 기능적 언어 인 Haskell을보십시오. 다른 부작용뿐만 아니라 다시 할당되지 않습니다. IO를 수행하기 위해 이오 모나드 실제로 교체합니다 현실 세계 콘솔에 새로운 텍스트가 표시되는 새로운 세계 인스턴스가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top