2012-10-12 3 views
1

캡슐화는 OO 프로그래밍의 핵심 임원이다.함수의 캡슐화 | OO의 관점에서의 목적

그러나 함수를 비공개로 만든 다음 사용할 수 있도록 반환하면 효과적으로 처리 할 수 ​​있습니다.

나는 생각하지 않을 것이다, 그 b.c. 함수를 반환하면 복사본을 반환하지 않습니다 ... 참조를 반환합니다. 그것이 질문의 핵심입니다. 함수를 반환하면 해당 함수가 복사되거나 실제 함수를 참조합니다.

OO 프로그래밍이 원하는대로 func1을 개인적이고 안전하게 유지합니다.

캡슐화/데이터 숨기기가 실제로 기능과 관련이 없습니까?

var Class = (function() { 
    var private_data = 1234, 

     private_method = function (x) { private_data += x; }, 

     public_method = function (x) { private_method(x); }, 
     other_method = function() { return private_data; }, 

     public_interface = { 
      add : public_method, 
      toString : other_method 
     }; 

    return public_interface; 
}()); 

지금 인터페이스에 프로그래밍 한 :

var A = (function(){ 
    var func1 = function(param){ 
     // do stuff 
     }, 
     publik; 
    publik.retFunc(){ 
     return func1; 
    } 
    return publik; 
}()) 

A.retFunc()(arg1); 
+1

예제 코드에 오류가 있습니다. A에서 구문 오류가 발생합니다 ('retFunc'을 함수 선언으로 사용해야합니까?). 일단이를 고치면 A는'retFunc '. –

+2

캡슐화가 기능과 관련이 있는지 또는 어떻게 캡슐화가이 것을 판단 할 지에 대한 의미가 무엇인지는 분명하지 않습니다. – djechlin

+0

당신은 함수 선언 괄호의 바깥쪽에 평가 괄호를 넣으려고 했습니까? –

답변

6
난 정말 당신이 함께 어디로 가는지 모르겠어요

...
하지만, 원인을 촉진합니다.
이 특정 인터페이스는 .add.toString입니다.

개인 값은 첨부 된 것처럼 위조 변경으로부터 안전하게 보호됩니다.
addadd이 수정되지 않은 한 private_method에 액세스 할 수 있습니다.

참조, 당신은 사실 후,이 같은 뭔가를하려고하면 : 작동하지 않을 것

Class.add = function (x) { steal(private_data + x); }; 

.
새 함수에 개인 데이터에 대한 참조가 없습니다.

외부 사용자 나 프로그램이 공용 인터페이스를 변조하는 동안 내부 상태는 여전히 양호합니다.

프로그램이 변조되었거나 보호되지 않는 다른 클래스가 손상 될 수있는 경우 프로그램이 여전히 손상 될 수 있지만이 프로그램은 행복하게 앉아 있고 내부 통화를해야합니다 (화면을 업데이트 한 경우와 같이). 타이머)는 여전히 완벽하게 발생합니다.

다른 캡슐화 지점은 사용자에게 표시 할 인터페이스를 선택하는 것입니다.

클래스 내부에는 30 개의 도우미 함수가있을 수 있지만 외부 응용 프로그램에 몇 개의 도우미 액세스 권한을 부여하려는 경우 일 수 있습니다.
그리고 이러한 공용 메서드는 개인 데이터/메서드에 액세스 할 수 있으며 클라이언트가 할 수있는 모든 작업을 수행 할 수있는 기능을 제공합니다.

그건 응용 프로그래밍 인터페이스입니다.

BlogManager 클래스를 갖고 싶으면 매우 클 수 있습니다.
어쩌면 데이터베이스에서 항목을 가져 와서 정렬하거나 템플릿을 설정하거나보기와 통신 할 수 있기를 원합니다. 필터링 할 수 있기를 원하며 모든 종류의 작업을 수행하고 싶습니다. 물건...

하지만 최종 사용자가 모든 작업을 수행하기를 원하지 않습니다.
최종 사용자가 수행하기를 원하는 내용은 .request(options); 또는 .create(blog_post); 또는 .update(blog_post); 또는 .delete(blog_post);입니다.

최종 사용자에게이 네 가지 방법을 제공하면 아무도 BlogManager 내부에서 진행되는 수십 가지 다른 것들을 만져서 모든 것이 예상대로 작동 할 수 없습니다.
이것은 인터페이스 프로그래밍입니다.

나중에 내 결과를 필터링하는 더 좋은 방법을 찾거나 데이터베이스를 변경하거나 데이터 저장소의 구조를 변경할 때 필자가 수행하는 작업이 중요하지 않습니다. 왜냐하면 바깥 세상은 여전히 ​​똑같이 보이고 행동 할 것이기 때문입니다.
동일한 공용 메소드, 동일한 입력 유형, 동일한 리턴 유형 ...이 있으면 내부에서 원하는 모든 것을 수행 할 수 있습니다.

하지만, 대신에 복직 객체의, 실제 생성자 함수를 반환하는 즉시 많은 경우가 없습니다.

함수의 반환 값 대신 함수를 반환하는 경우가 많지 않습니다.
비동기 프로그래밍을 제외하고.

+0

왜 그렇습니까? 'Class.add = newFunc;'를 수정하면,'Class.add! == public_method'가됩니다. 'Class.add'는 결코'private_method'에 대한 참조를 결코 가지지 않을 것이라는 것을 의미합니다. – Norguard

+0

... 나는 당신이 보여준 것처럼 private 함수를 호출하는 대신 함수에서 함수를 반환함으로써 문제를 더 어렵게 만들었습니다. –

+1

@HiroProtagonist 나는 당신이 "더 어렵다"는 것을 당신이 의미하는지 모르겠다. 당신이 원하지 않는 개인적인 방법을 간단히 노출했다. 마치 "이 비밀을 지키고 싶지만 어쨌든 말해 줄께"라고 말하는 것과 같습니다. 아직도 비밀인가? 당신이 의도적으로 그것을 버렸기 때문에 아닙니다. 다른 사람들은 당신이 그들을 포기한다면 당신의 "비밀"을 알 수 있습니다. – phant0m