나는 분명히 이러한 개념에 새로운 브랜드입니다. 왜 속성이나 메서드에 대한 액세스를 제한하는지 이해할 수 없습니다. 의도 한 결과에 따라 코드를 작성하는 것 같습니다. 단순히 그 메소드를 호출하지 않고 private 메소드를 작성하는 이유는 무엇입니까? 반복적 인 객체 생성 (정확하게 말하면), 다중 개발자 상황 (다른 사람들의 작업을 망치지 말 것)입니까, 아니면 실수로 자신의 작업을 엉망으로 만들지 않아요?OOP/PHP를 처음 사용했습니다. 수업의 가시성과 확장 성의 실용성은 무엇입니까?
답변
모두 캡슐화됩니다. 이것은 수업의 내부를 숨기고 수업 내용을 돌보는 것을 의미합니다. 신용 카드 처리 클래스를 갖고 싶다면 실제로 신용 카드를 처리하는 방법을 '신경 쓰지 않아도됩니다. 그냥 $creditCardProcessor->charge(10.99, $creditCardNumber);
과 같이 작동하고 싶을 것입니다.
일부 메소드를 공개하고 다른 메소드를 비공개 또는 보호함으로써 다른 사람들이 코드를 호출하는 것이 안전한 곳을 알 수 있도록 항목을 남겨 둡니다. 공용 메서드와 변수를 '인터페이스'라고합니다.
모든 클래스의 경우 구현입니다. 이것이 학급이 의무를 수행하는 방법입니다. 스무디 만드는 클래스 인 경우, 클래스가 재료를 추가하는 방법, 추가하는 요소 등은 모두 구현의 일부입니다. 외부 코드는 구현을 알지 못하거나 신경 쓰지 않아야합니다.
클래스의 다른 쪽 인터페이스. 인터페이스는 외부 개발자가 클래스 외부에서 호출 할 수 있도록하는 public 메서드입니다. 즉, 공용 메서드를 호출 할 수 있어야하고 제대로 작동합니다.
명확한 정의와 예제를 가져 주셔서 감사합니다. –
우리는 클래스의 소비자가 구현 세부 사항을 신경 쓸 필요가 없도록 개인 메서드를 만듭니다. 즉, 우리 클래스가 제공하는 몇 가지 멋진 요소에 집중할 수 있습니다.
또한 공개 메소드의 모든 가능한 사용을 고려해야합니다. 메소드를 비공개로 설정함으로써 클래스가 지원해야하는 기능의 수를 줄이고 더 많은 자유를 변경할 수 있습니다.
Queue
클래스가 있다고 가정 해보십시오. 호출자가 항목을 대기열에 추가 할 때마다 대기열의 용량을 늘려야 할 수 있습니다. 기본 구현 때문에 용량을 설정하는 것은 쉬운 일이 아니므로 Enqueue
기능의 가독성을 높이기 위해 별도의 기능으로 나누십시오. 호출자는 대기열의 용량에 대해 신경 쓰지 않으므로 (호출자가 처리해야 함) 메서드를 비공개로 만들 수 있습니다. 호출자가 불필요한 메서드로 인해 혼란 스러울 필요가 없으며 호출자가 우스운 일을 수행 할까 걱정할 필요가 없습니다 (클래스에 의해 정의 된 제한된 유스 케이스 내에서 여전히 용량을 설정하는 한) 클래스를 사용하는 코드를 깨지 않고도 언제든지 구현을 변경할 수 있습니다.
캡슐화를 사용하는 몇 가지 이유가 있습니다. 가장 강력한 것 중 하나는 다음과 같습니다. 다른 사람이 작성한 크고 복잡한 라이브러리를 사용한다고 가정 해보십시오. 모든 객체가 보호되지 않은 경우 개발자가 의도하지 않은 값에 액세스하거나 변경할 수 있습니다.
데이터를 숨기면 프로그램을 더 쉽게 개념화하고 구현하기가 더 쉽습니다.
캡슐화에 관한 모든 것입니다. 일을 쉽게하는 우아한 기능을 드러내는 한편, 내부의 꿀꿀 거리는 일을하는 방법은 사적입니다. 예 : 싱글 톤 db 객체의 유효성을 검사하고 쿼리를 안전하게 만드는 등의 4 개의 내부 함수를 사용하는 $ product-> insert() 함수가있을 수 있습니다. 이러한 함수는 노출 될 필요가없는 내부 함수이므로 호출하면 엉망이 될 수 있습니다 다른 구조 나 흐름, 즉 개발자가 제자리에 놓았습니다.
마지막 두 점은 상당히 정확합니다. 개발자가 물건을 엉망으로 만들 필요가 없습니다. 오랫동안 프로젝트를 진행한다면, 처음에했던 일을 많이 잊어 버렸다는 것을 알게 될 것입니다.
무언가를 숨기는 가장 중요한 이유 중 하나는 안전하게 으로 변경할 수 있기 때문입니다. 필드가 공개되어 있고 몇 개월 후 필드를 변경하려고 할 때마다 필드가 변경 될 때마다 다른 일이 발생하면 문제가 발생합니다. 공개 되었기 때문에 해당 필드에 얼마나 많은 다른 장소가 직접 액세스했는지를 알거나 기억할 수있는 방법이 없습니다. 비공개 인 경우이 클래스 외부에서 만지면 안된다는 보장이 있습니다. 공용 메서드가 랩핑되어있을 가능성이 높으며 해당 메서드의 동작을 쉽게 변경할 수 있습니다.
일반적으로 공개 할수록 다른 코드와의 호환성에 대해 걱정할 필요가 있습니다.
예를 들어 - 개인/보호 된 메서드는 다른 (공용) 메서드에서 호출되는 일부 클래스의 일부일 수 있습니다. 해당 부분이 더 많은 공개 메서드에서 호출되면 의미가 있습니다. 그럼에도 불구하고이 메소드를 다른 곳에서는 호출하지 않으려 고합니다.
클래스 속성과 완전히 같습니다. 예, 모든 공용 클래스를 작성할 수 있지만 그게 재미 있습니까?
여러 개발자 상황은 그래서하지 엉망으로 자신의 작업 실수 (안 엉망 다른 사람의 일을), 또는?
주로이 두 가지. 메서드를 public으로 만드는 것은 "클래스가 클라이언트에서 사용되는 방식입니다."라는 메시지를 비공개로 설정합니다. "이것은 경고없이 변경 될 수있는 구현 세부 사항이며 어떤 클라이언트가 신경 쓰지 않아도됩니다." 조언.
몇 가지 잘 정리 된 공개 방법을 사용하는 클래스는 익숙하지 않은 사람 (6 개월 만에 처음 보는 사람)이 더 쉽게 사용할 수 있습니다. 걱정하지 않는 모든 구현 세부 정보를 포함하여 공개됩니다.
공동 작업을 쉽게 수행 할 수 있도록 클래스의 사용자에게 어떤 부분을 자주 변경하면 안되는지 알려주고 공용 메서드 만 사용하는 경우 개체가 의미있는 상태가되도록 보장 할 수 있습니다.
개인/공공/무엇이든간에 (언어로 시행되는 것을 의미하는) 매우 엄격 할 필요는 없습니다. 예를 들어, Python에서는 명명 규칙을 사용하여이 작업을 수행합니다. 당신은 공개적이지 않은 것으로 표시된 것을 망쳐서는 안된다는 것을 알고 있습니다.
바. 비슷한 대답이 많이 있습니다! –