여기서 주요 문제는 캡슐화가 엄격하게 정의 된 개념이 아니고 왜 유용하지 않다는 것입니다. 일부 연구를 통해 사람들이 캡슐화를 보는 방법에 대한 의견이 많으며 많은 사람들이 캡슐화를 추상화와 혼동하는 것으로 나타났습니다.
당신이 먼저 정의를 찾아 가고는 있다
캡슐화는 데이터를 조작하는 데이터와 기능을 하나로 묶는 개념입니다 ...
이것이 당신의 정의라면, 대부분의 언어는 해당 데이터에서 작동하는 데이터와 함수를 클래스, 모듈, 라이브러리, 네임 스페이스 등으로 그룹화 할 수 있습니다.
그러나 나는 그 정의가 계속되는 것처럼 캡슐화의 주요 목적이 아니라고 주장합니다.
... 그리고 외부 간섭과 오용으로부터 안전합니다.
Wikipedia도 이에 동의 합니다.
일부 객체 구성 요소에 대한 직접 액세스를 제한하기위한 언어 메커니즘.
그러나 이제 "간섭 및 오용"의 의미와 데이터에 대한 직접 액세스가 제한되어야하는 이유를 묻어 야합니다. 두 가지 이유가 있다고 생각합니다.
먼저 데이터를 변경할 수있는 범위를 제한하는 것이 개발자에게 가장 큰 관심사입니다. 너무 자주 값을 설정하기 전 / 후에 논리가 있어야합니다. 그리고 가치를 설정할 수있는 장소의 수를 제한하는 것이 매우 중요합니다. OOP 언어에서는 클래스를 사용하여이를 수행 할 수 있습니다. "변경 가능"기능 언어에서 클로저는 동일한 목적을 제공합니다. 그리고 클래스 = 클로저를 알고 있기 때문에 , 가변 함수형 언어가 OOP와 다른 "패러다임"보다 논쟁의 여지가 있습니다.
그러나 불변의 언어는 어떻습니까? 변수를 변경하는 데 문제가 없습니다. 여기에 두 번째 문제가 있습니다. 바인딩 함수 및 데이터를 사용하면 해당 데이터를 유효한 상태로 유지할 수 있습니다. 에 대한 불변 구조가 있다고 상상해보십시오 Email
. 이 구조에는 단일 string
필드가 있습니다. 유형 값이있는 경우 Email
해당 필드에 유효한 주소가 포함되어야한다는 요구 사항이 있습니다. OOP의 캡슐화에서, 이것은 필드를 선언하고 방법 private
만 제공하며Get
constructor method
문자열로 전달 된 주소가 유효한 경우에만 성공합니다. 클로저와 비슷한 것. 이제 불변 언어의 경우 구조는 특정 기능을 통해서만 초기화 될 수 있으며 그러한 기능은 실패 할 수 있다고 말할 필요가 있습니다. 그리고 나는 그 기준에 맞는 언어를 알지 못합니다 (댓글을 가진 사람이 나를 밝힐 수 있습니다).
마지막 문제는 언어 "지원"캡슐화의 의미입니다. 한쪽에는 캡슐화를 적용 할 수있는 언어가 있으므로 캡슐화가 깨지면 코드가 컴파일되지 않습니다. 다른 한편으로, 언어는 캡슐화를 수행하는 방법을 제공 할 수 있지만 강제하지는 않으므로 개발자가 직접 강제로 실행합니다. 두 번째 경우에는 구조와 기능을 가진 모든 언어가 작동 할 수 있습니다. 역동적 인 언어와 Haskell이 떠 오릅니다. 그리고 스펙트럼의 반대편에 해당하는 언어가 많지 않다고 말할 것입니다. 리플렉션을 사용하여 객체의 캡슐화를 실제로 적용하는 C #조차도 우회 할 수 있습니다. 그러나 C #에서는 거대한 코드 냄새로 간주되며 C # 개발자는 기꺼이 그렇게하지 않습니다.