2015-01-15 1 views
0

처음 클로저를 이해하려고 할 때 클로저를 만지기 전에 이해할 수없는 컴퓨터 과학의 꿰 뚫을 수없는 벽으로 만났습니다. 그럼, 원숭이의 더 원숭이 기준을 참조에 배운 자바 스크립트 키워드, 자바의 관용구를 수의 (여기 내 흐릿한 기억을 용서)하지 않았다 동안 그 :자바 스크립트와 같은 다중 패러다임/기능 언어에서 정보 숨기기 외에도 클로저의 진정한 가치 제안은 무엇입니까?

JAVA :

class ObjectWithPrivateMember() 
    { 
    private int counter; 
    public void ObjectWithPrivateMember() 
     { 
     counter = 0; 
     } 
    public void increment() 
     { 
     counter += 1; 
     } 
    public void decrement() 
     { 
     counter -= 1; 
     } 
    public void get_count() 
     { 
     return counter; 
     } 
    } 

자바 스크립트를 (ECMAScript를 다시 몇 년 현재) 진짜 "개인"/ "보호"키워드를 가지고,하지만 자바 관용구의 무료 번역 될 수 뭔가 같은 :

JAVASCRIPT :

var object_with_private_member = function() 
    { 
    var counter = 0; 
    return { 
     increment: function() 
      { 
      counter += 1; 
      }, 
     decrement: function() 
      { 
      counter -= 1; 
      }, 
     get_count: function() 
      { 
      return counter; 
      } 
     }; 
    }(); 

JavaScript가 아닌 뭔가로 자바 스크립트를 작성하려고하는 덕트 테이프에 대한 즉각적인 반응 외에도 나는 "알았어."라는 말로 정신병 학자가 "좋아, 자바 관용구를 어둡게 만드는 방법입니다. JavaScript. 이것은 아마도 the Wikipedia entry는 몇 가지 세부 사항을 제공? "폐쇄 정말 좋은 무엇"나는 질문을 해결하기 위해 돌아왔다 이제

을 ". 자바 스크립트에 대한 중대한 무엇에 약간의 직접적인 통찰력을 가르치시 및 정보 숨어 수 있음을 시사 무거운 기능성 구부러진 다중 패러다임 언어뿐만 아니라 일류 함수 언어에 대한 일반적인 용의자 일 수 있습니다. 물론 더 자세히 설명되어 있고 더 많은 뉘앙스를 제공하지만 교과서 "JavaScript 객체 개인 필드가있는 경우 "유스 케이스는 내가 가정 한 것처럼 거의 접하지 않습니다.

좋은 기능을하는 프로그래머가 순수한 기능의 la에서 클로저를 볼 수있는 실제 용도는 무엇입니까? nguages ​​또는 다중 패러다임 언어를 기능적으로 구부리고 있습니까? 주로 정보 숨기기에 사용됩니까? (the Wikipedia article은 위의 캐리커처보다 더 많은 뉘앙스와 세부적인 정보를 제공하지만, 처음에는 폐쇄가 개인 회원을 만드는 백도어 방식보다 JavaScript에서 더 크고 흥미로운 역할을했을 것이라는 생각이 들었습니다.)

순수/멀티 패러다임 함수형 언어에 숨어있는 정보에 대한 메커니즘 외에이 다른 주요 사용 사례 있습니까?

+4

이 질문은 [Programmers Stack Exchange] (http://programmers.stackexchange.com/)에 더 적합 할 것입니다. –

+0

개체는 가난한 사람의 종결 일뿐입니다. – Pointy

+0

질문에 Java 및 JavaScript 태그가 붙은 이유는 무엇입니까? Java 8+에서 람다는 클로저의 예이며 동등한 로컬 클래스로 확장되는 통합 설탕을 제공하여 보일러 플레이트 코드를 줄일 수 있습니다. 마지막으로 [IIFE] (http://benalman.com/news/2010/11/immediately-invoked-function-expression/)가 JavaScript에서 클로저를 사용하는 유일한 방법은 아닙니다. –

답변

1

개인 정보 보호 것은 특히 불변의 값으로, 내 경험, 사소한 고려 사항이다. 왜 상관 않는 사람 그들은 그것을 바꿀 수 없다면 그것을 본다.

클로저의 가치를 이해하려면 먼저 일류 함수의 가치를 지켜라. 그러면 어떤 데이터를 그 함수와 연관시키는 것이 편리한 지 알기가 꽤 쉽다.

// Return a list of all books with at least 'threshold' copies sold. 
function bestSellingBooks(threshold) { 
    return bookList.filter(
     function (book) { return book.sales >= threshold; } 
    ); 
} 

당신은 술어에 threshold 의사 소통의 다른 방법을 찾을 필요가 :

은 클로저를 사용하지 않고 위키 피 디아 페이지에서 다음과 같은 예를 작성하려고 만, 여전히 filter 고차 함수를 사용하는 것을 고려 기능.

class ThresholdFilter implements Filterable { 
    private threshold; 
    ThresholdFilter(threshold) { 
    this.threshold = threshold; 
    } 

    bool filter(book) { 
    return book.sales >= this.threshold; 
    } 
} 

function bestSellingBooks(threshold) { 
    return bookList.filter(new ThresholdFilter(threshold)); 
} 

또는, 저장하고 모두 filter와 술어 기능을하게하는,에 전달하는 개인 일반 데이터 구조의 일종을 허용하도록 filter 기능을 변경할 수 있습니다 : 같은 OOP에서는 개체의 어떤 종류를 만들 것 더 복잡하고 결합되었습니다. 클로저가 지금 꽤 잘 보이기 시작했습니다. 맞습니까?

클로저가 결합을 크게 줄이고 고차 함수를 사용하는 코드를 단순화하는 경우가 더 많습니다. 기능적 프로그램이 훨씬 간결한 주요 이유입니다.

+0

"왜 바꿀 수 없다면 누가 보니?" OOP의 제한된 변수에 대한 정보 숨김의 장점 중 하나는 액세스 권한이 부여되지 않은 소프트웨어가 기존 구현과 결합 할 수 없다는 점입니다. 아무도 상호 작용할 수없는 어떤 것도 자유롭게 임의로 변경할 수 있습니다. 이것은 정보 은닉의 주요 판매 포인트입니다. – JonathanHayward

관련 문제